From b59118bc5d362f876899d17873848a648dfd517b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 18:40:58 +0000 Subject: [PATCH 001/192] Translate languages/rocket.pot in pt_BR 100% translated source file: 'languages/rocket.pot' on 'pt_BR'. --- languages/rocket-pt_BR.po | 78 +++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/languages/rocket-pt_BR.po b/languages/rocket-pt_BR.po index 233e371ac4..b246d1fdae 100644 --- a/languages/rocket-pt_BR.po +++ b/languages/rocket-pt_BR.po @@ -10,9 +10,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha1\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-04-29T20:40:45+00:00\n" +"Project-Id-Version: WP Rocket 3.16-alpha2\n" +"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" +"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Fabio Fava , 2024\n" "Language-Team: Portuguese (Brazil) (https://app.transifex.com/wp-media/teams/18133/pt_BR/)\n" @@ -22,7 +22,7 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.7.1\n" #. Plugin Name of the plugin msgid "WP Rocket" @@ -672,8 +672,8 @@ msgstr "%s: Cache de usuário limpo." msgid "Dismiss this notice" msgstr "Descartar essa notificação" -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:80 -#: inc/Engine/Saas/Admin/AdminBar.php:198 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:84 +#: inc/Engine/Saas/Admin/AdminBar.php:202 msgid "Clear Used CSS" msgstr "Limpar CSS usado" @@ -1140,7 +1140,7 @@ msgid "Preload" msgstr "Pré-Carregar" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:170 +#: inc/Engine/Admin/Settings/Subscriber.php:171 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "Ferramentas" @@ -2578,6 +2578,20 @@ msgctxt "Sucuri" msgid "Find your API key" msgstr "Encontre a sua chave da API" +#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: +#. opening a tag, %4$s: option a tag, %5$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2295 +msgid "" +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our " +"brand new feature %3$sOptimize critical images%5$s is automatically " +"activated now! Also, the Cache tab was removed but the existing features " +"will remain working, %4$ssee more here%5$s." +msgstr "" +"%1$sWP Rocket:%2$s o plugin foi atualizado para a versão 3.16. Nosso " +"novíssimo recurso %3$sOtimizar imagens críticas%5$s já foi automaticamente " +"ativado! Além disso, a aba Cache foi removida mas os recursos existentes " +"continuarão funcionando, %4$ssaiba mais aqui%5$s." + #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" "Sucuri Add-on: The API key for the Sucuri firewall must be in format " @@ -2595,25 +2609,25 @@ msgstr "" "foi salva porque ela desativa o armazenamento em cache e as otimizações para" " cada página do seu site." -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:172 msgid "Import, Export, Rollback" msgstr "Importar, Exportar, Reverter" -#: inc/Engine/Admin/Settings/Subscriber.php:196 +#: inc/Engine/Admin/Settings/Subscriber.php:197 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "Otimizar Imagens" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:198 msgid "Compress your images" msgstr "Comprima as suas imagens" -#: inc/Engine/Admin/Settings/Subscriber.php:214 +#: inc/Engine/Admin/Settings/Subscriber.php:215 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "Tutoriais" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:216 msgid "Getting started and how to videos" msgstr "Comece a usar e vídeos didáticos" @@ -2827,15 +2841,15 @@ msgstr "" "Acelere o seu site com a RocketCDN, a Rede de Distribuição de Conteúdo do WP" " Rocket!" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:180 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "O WP Rocket processa os jobs pendentes" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:194 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:204 msgid "WP Rocket clear failed jobs" msgstr "O WP Rocket limpa os jobs que falharem" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:206 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:221 msgid "WP Rocket process on submit jobs" msgstr "O WP Rocket processa os jobs no envio" @@ -3343,6 +3357,14 @@ msgstr "" msgid "%1$s: Critical images cleared!" msgstr "%1$s: Imagens críticas esvaziadas!" +#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 +msgid "Script error" +msgstr "Erro de script" + +#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 +msgid "Script timeout" +msgstr "Tempo-limite do script" + #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "LazyLoad para imagens" @@ -3447,24 +3469,24 @@ msgstr "Trabalhos pendentes do Pré-carregamento do WP Rocket" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "O pré-carregamento do WP Rocket reverte jobs empacados que falharam" -#: inc/Engine/Saas/Admin/AdminBar.php:73 -#: inc/Engine/Saas/Admin/AdminBar.php:194 +#: inc/Engine/Saas/Admin/AdminBar.php:77 +#: inc/Engine/Saas/Admin/AdminBar.php:198 msgid "Clear Critical Images" msgstr "Esvaziar Imagens Críticas" -#: inc/Engine/Saas/Admin/AdminBar.php:160 +#: inc/Engine/Saas/Admin/AdminBar.php:164 msgid "Clear Critical Images of this URL" msgstr "Esvaziar as Imagens Críticas deste URL" -#: inc/Engine/Saas/Admin/AdminBar.php:163 +#: inc/Engine/Saas/Admin/AdminBar.php:167 msgid "Clear Used CSS of this URL" msgstr "Limpar o CSS usado deste URL" -#: inc/Engine/Saas/Admin/AdminBar.php:193 +#: inc/Engine/Saas/Admin/AdminBar.php:197 msgid "Critical Images Cache" msgstr "Cache de Imagens Críticas" -#: inc/Engine/Saas/Admin/AdminBar.php:197 +#: inc/Engine/Saas/Admin/AdminBar.php:201 msgid "Remove Used CSS Cache" msgstr "Remover o cache de CSS usado" @@ -3489,18 +3511,18 @@ msgstr "" "\t\t\t O WP Rocket continuará gerando CSS Usado para até %2$s URLs a cada %3$s segundo(s)." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:160 +#: inc/Engine/Saas/Admin/Notices.php:170 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" "Sugerimos ativar o %1$sPré-carregamento%2$s para resultados mais rápidos." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:180 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" "Para aprender mais sobre o processo veja a nossa %1$sdocumentação%2$s." -#: inc/Engine/Saas/Admin/Notices.php:236 +#: inc/Engine/Saas/Admin/Notices.php:246 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3512,13 +3534,13 @@ msgstr "" "seu site." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:239 +#: inc/Engine/Saas/Admin/Notices.php:249 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "" "Clique aqui para obter uma licença única do WP Rocket com %1$s de desconto!" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:292 +#: inc/Engine/Saas/Admin/Notices.php:302 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3528,11 +3550,11 @@ msgstr "" " WP Rocket de acessar os recursos SaaS. Os IPs listados %1$saqui em nossa " "documentação%2$s devem ser adicionados à sua lista de permitidos:" -#: inc/Engine/Saas/Admin/Notices.php:297 +#: inc/Engine/Saas/Admin/Notices.php:307 msgid "- In the security plugin, if you are using one" msgstr "- No plugin de segurança, se estiver usando um." -#: inc/Engine/Saas/Admin/Notices.php:298 +#: inc/Engine/Saas/Admin/Notices.php:308 msgid "- In the server's firewall. Your host can help you with this" msgstr "" "- No firewall do servidor. Sua compania de hospedagem poderá te ajudar com " From 09afb5580d7ae7701956b659a8c153b2758645c0 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 08:04:40 +0000 Subject: [PATCH 002/192] Translate languages/rocket.pot in fa_IR 100% translated source file: 'languages/rocket.pot' on 'fa_IR'. --- languages/rocket-fa_IR.po | 77 +++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/languages/rocket-fa_IR.po b/languages/rocket-fa_IR.po index 9a88faab94..b334d6bf46 100644 --- a/languages/rocket-fa_IR.po +++ b/languages/rocket-fa_IR.po @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha1\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-04-29T20:40:45+00:00\n" +"Project-Id-Version: WP Rocket 3.16-alpha2\n" +"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" +"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Mohammad Yousefzadeh , 2024\n" "Language-Team: Persian (Iran) (https://app.transifex.com/wp-media/teams/18133/fa_IR/)\n" @@ -17,7 +17,7 @@ msgstr "" "Language: fa_IR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.7.1\n" #. Plugin Name of the plugin msgid "WP Rocket" @@ -640,8 +640,8 @@ msgstr "%s: کش کاربر پاک شد." msgid "Dismiss this notice" msgstr "نادیده گرفتن این پیام." -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:80 -#: inc/Engine/Saas/Admin/AdminBar.php:198 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:84 +#: inc/Engine/Saas/Admin/AdminBar.php:202 msgid "Clear Used CSS" msgstr "پاکسازی CSSهای استفاده شده" @@ -1095,7 +1095,7 @@ msgid "Preload" msgstr "پیش بارگذاری" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:170 +#: inc/Engine/Admin/Settings/Subscriber.php:171 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "ابزارها" @@ -2499,6 +2499,19 @@ msgctxt "Sucuri" msgid "Find your API key" msgstr "پیدا کردن کلید API شما" +#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: +#. opening a tag, %4$s: option a tag, %5$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2295 +msgid "" +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our " +"brand new feature %3$sOptimize critical images%5$s is automatically " +"activated now! Also, the Cache tab was removed but the existing features " +"will remain working, %4$ssee more here%5$s." +msgstr "" +"%1$sراکت وردپرس:%2$sافزونه به نسخه 3.16 بروزرسانی شد. ویژگی جدید ما%3$sبهینه" +" سازی تصاویر بحرانی است.%5$sکه به صورت خودکار فعال می باشد! همچنین تب کش حذف" +" شده اما همچنان عملکردش باقی مانده است%4$sاطلاعات بیشتر%5$s." + #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" "Sucuri Add-on: The API key for the Sucuri firewall must be in format " @@ -2515,25 +2528,25 @@ msgstr "" "متاسفیم! افزودن/(.*) در قوانین پیشرفته > هرگز کش نکن URL(s) ذخیره نشد به " "دلیل اینکه کش و بهینه سازی برای هر برگه در سایت شما غیرفعال است." -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:172 msgid "Import, Export, Rollback" msgstr "درون‌ریزی، برون‌ریزی، عقب‌گرد" -#: inc/Engine/Admin/Settings/Subscriber.php:196 +#: inc/Engine/Admin/Settings/Subscriber.php:197 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "بهینه‌سازی تصویر" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:198 msgid "Compress your images" msgstr "تصاویر خود را فشرده کنید" -#: inc/Engine/Admin/Settings/Subscriber.php:214 +#: inc/Engine/Admin/Settings/Subscriber.php:215 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "آموزش‌ها" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:216 msgid "Getting started and how to videos" msgstr "شروع به کار و نحوه فیلمبرداری" @@ -2733,15 +2746,15 @@ msgid "" msgstr "" "با RocketCDN، شبکه تحویل محتوای WP Rocket سرعت سایت خود را افزایش دهید!" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:180 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "WP Rocket کارهای معلق را پردازش می کند" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:194 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:204 msgid "WP Rocket clear failed jobs" msgstr "WP Rocket کارهای ناموفق را پاک کرد" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:206 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:221 msgid "WP Rocket process on submit jobs" msgstr "فرآیند WP Rocket در ارسال کارها" @@ -3229,6 +3242,14 @@ msgstr "" msgid "%1$s: Critical images cleared!" msgstr "%1$s:تصاویر بحرانی حذف شدند!" +#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 +msgid "Script error" +msgstr "خطای اسکریپت" + +#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 +msgid "Script timeout" +msgstr "وقفه اسکریپت" + #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "باگذاری با تاخیر تصاویر" @@ -3332,24 +3353,24 @@ msgstr "کارهای معلق پیش بارگذاری" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "پیش بارگذاری برگرداندن کارهای ناموفق گیر کرده است" -#: inc/Engine/Saas/Admin/AdminBar.php:73 -#: inc/Engine/Saas/Admin/AdminBar.php:194 +#: inc/Engine/Saas/Admin/AdminBar.php:77 +#: inc/Engine/Saas/Admin/AdminBar.php:198 msgid "Clear Critical Images" msgstr "پاکسازی تصاویر بحرانی" -#: inc/Engine/Saas/Admin/AdminBar.php:160 +#: inc/Engine/Saas/Admin/AdminBar.php:164 msgid "Clear Critical Images of this URL" msgstr "پاکسازی تصاویر این url" -#: inc/Engine/Saas/Admin/AdminBar.php:163 +#: inc/Engine/Saas/Admin/AdminBar.php:167 msgid "Clear Used CSS of this URL" msgstr "پاکسازی CSS استفاده شده برای این URL" -#: inc/Engine/Saas/Admin/AdminBar.php:193 +#: inc/Engine/Saas/Admin/AdminBar.php:197 msgid "Critical Images Cache" msgstr "کش تصاویر بحرانی" -#: inc/Engine/Saas/Admin/AdminBar.php:197 +#: inc/Engine/Saas/Admin/AdminBar.php:201 msgid "Remove Used CSS Cache" msgstr "حذف کش CSS استفاده شده" @@ -3373,16 +3394,16 @@ msgstr "" "\t\t\tWP Rocket به تولید CSS استفاده شده تا حداکثر ادامه خواهد داد%2$surlها هر%3$sثانیه()." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:160 +#: inc/Engine/Saas/Admin/Notices.php:170 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "ما پیشنهاد می کنیم %1$sپیش بارگذاری%2$s برای نتایج سریعتر فعال کنید." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:180 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "برای یادگیری پروسه %1$sمستندات%2$s مارا بخوانید." -#: inc/Engine/Saas/Admin/Notices.php:236 +#: inc/Engine/Saas/Admin/Notices.php:246 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3393,12 +3414,12 @@ msgstr "" "بیشتر عملکرد وب سایت خود، به یک مجوز فعال نیاز دارید." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:239 +#: inc/Engine/Saas/Admin/Notices.php:249 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "برای دریافت لایسنس %1$sتخفیفی اینجا کلیک کنید!" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:292 +#: inc/Engine/Saas/Admin/Notices.php:302 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3408,11 +3429,11 @@ msgstr "" "های SaaS جلوگیری می کند. لیست آیپی ها%1$sمستندات اینجا%2$sباید به لیست " "مجازتان اضافله شود:" -#: inc/Engine/Saas/Admin/Notices.php:297 +#: inc/Engine/Saas/Admin/Notices.php:307 msgid "- In the security plugin, if you are using one" msgstr "- در افزونه امنیت، اگر شما از یکی از آن ها استفاده کنید" -#: inc/Engine/Saas/Admin/Notices.php:298 +#: inc/Engine/Saas/Admin/Notices.php:308 msgid "- In the server's firewall. Your host can help you with this" msgstr "- در فایروال سرور. شرکت هاست شما کمکتان می کند" From bf2b6142ff52cfd6b9ca3759c36be28cd320b7e2 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 08:19:26 +0000 Subject: [PATCH 003/192] Translate languages/rocket.pot in fr_FR 100% translated source file: 'languages/rocket.pot' on 'fr_FR'. --- languages/rocket-fr_FR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-fr_FR.po b/languages/rocket-fr_FR.po index 2e0d07ff4a..00ecd02e79 100644 --- a/languages/rocket-fr_FR.po +++ b/languages/rocket-fr_FR.po @@ -3497,7 +3497,7 @@ msgstr "Nettoyer le CSS utilisé pour cet URL" #: inc/Engine/Saas/Admin/AdminBar.php:197 msgid "Critical Images Cache" -msgstr "Cache des images essentielles" +msgstr "Cache des images citiques" #: inc/Engine/Saas/Admin/AdminBar.php:201 msgid "Remove Used CSS Cache" From f2ec51b462d8fadd2155be34f5f71b5eebdc723d Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 08:20:01 +0000 Subject: [PATCH 004/192] Translate languages/rocket.pot in fr_FR 100% translated source file: 'languages/rocket.pot' on 'fr_FR'. --- languages/rocket-fr_FR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-fr_FR.po b/languages/rocket-fr_FR.po index 00ecd02e79..f459387caf 100644 --- a/languages/rocket-fr_FR.po +++ b/languages/rocket-fr_FR.po @@ -3485,7 +3485,7 @@ msgstr "" #: inc/Engine/Saas/Admin/AdminBar.php:77 #: inc/Engine/Saas/Admin/AdminBar.php:198 msgid "Clear Critical Images" -msgstr "Effacer les images critiques" +msgstr "Réinitialiser les images critiques" #: inc/Engine/Saas/Admin/AdminBar.php:164 msgid "Clear Critical Images of this URL" From 54fba35bb8303ada3595c27051efe9d3782d59eb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 08:20:12 +0000 Subject: [PATCH 005/192] Translate languages/rocket.pot in fr_FR 100% translated source file: 'languages/rocket.pot' on 'fr_FR'. --- languages/rocket-fr_FR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-fr_FR.po b/languages/rocket-fr_FR.po index f459387caf..c0303e87fc 100644 --- a/languages/rocket-fr_FR.po +++ b/languages/rocket-fr_FR.po @@ -3489,7 +3489,7 @@ msgstr "Réinitialiser les images critiques" #: inc/Engine/Saas/Admin/AdminBar.php:164 msgid "Clear Critical Images of this URL" -msgstr "Effacer les images critiques pour cette URL" +msgstr "Réinitialiser les images critiques pour cette URL" #: inc/Engine/Saas/Admin/AdminBar.php:167 msgid "Clear Used CSS of this URL" From 4d46cfb6f5a4bbd36e8187333ca369b0a4e7a1e3 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:25:09 +0100 Subject: [PATCH 006/192] Closes #6777: 3.17 Sub tasks - Factories Creation (#6787) --- .../PerformanceHints/AbstractFactory.php | 26 +++++++++++ inc/Engine/Media/AboveTheFold/Factory.php | 45 +++++++++++++++++++ .../Media/AboveTheFold/ServiceProvider.php | 3 ++ 3 files changed, 74 insertions(+) create mode 100644 inc/Engine/Common/PerformanceHints/AbstractFactory.php create mode 100644 inc/Engine/Media/AboveTheFold/Factory.php diff --git a/inc/Engine/Common/PerformanceHints/AbstractFactory.php b/inc/Engine/Common/PerformanceHints/AbstractFactory.php new file mode 100644 index 0000000000..829bc08591 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/AbstractFactory.php @@ -0,0 +1,26 @@ +getContainer()->addShared( 'warmup_subscriber', WarmUpSubscriber::class ) ->addArgument( $this->getContainer()->get( 'warmup_controller' ) ); + + $this->getContainer()->addShared( 'atf_factory', Factory::class ); } } From 4eb5b13fddc5c053d11f7e133a6ca61a2b19b3a9 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Tue, 16 Jul 2024 13:30:39 +0100 Subject: [PATCH 007/192] Changed filename and interface name --- .../{AbstractFactory.php => FactoryInterface.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename inc/Engine/Common/PerformanceHints/{AbstractFactory.php => FactoryInterface.php} (100%) diff --git a/inc/Engine/Common/PerformanceHints/AbstractFactory.php b/inc/Engine/Common/PerformanceHints/FactoryInterface.php similarity index 100% rename from inc/Engine/Common/PerformanceHints/AbstractFactory.php rename to inc/Engine/Common/PerformanceHints/FactoryInterface.php From 405c468eb545958de4f94a767321777752452218 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 18 Jul 2024 04:04:01 +0200 Subject: [PATCH 008/192] Adds PerformanceHints interfaces for database --- .../PerformanceHints/Database/Queries.php | 33 +++++++++++++++++++ .../PerformanceHints/Database/Table.php | 20 +++++++++++ .../Media/AboveTheFold/Admin/Controller.php | 2 +- .../Database/Queries/AboveTheFold.php | 4 ++- .../Database/Tables/AboveTheFold.php | 5 +-- 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/Database/Queries.php create mode 100644 inc/Engine/Common/PerformanceHints/Database/Table.php diff --git a/inc/Engine/Common/PerformanceHints/Database/Queries.php b/inc/Engine/Common/PerformanceHints/Database/Queries.php new file mode 100644 index 0000000000..eefc50572c --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Database/Queries.php @@ -0,0 +1,33 @@ +table->truncate_atf_table(); + $this->table->truncate_table(); /** * Fires after clearing lcp & atf data. diff --git a/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php index 02230da8f7..013665f816 100644 --- a/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php +++ b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php @@ -4,10 +4,12 @@ namespace WP_Rocket\Engine\Media\AboveTheFold\Database\Queries; use WP_Rocket\Engine\Common\Database\Queries\AbstractQuery; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries; + use WP_Rocket\Engine\Media\AboveTheFold\Database\Schemas\AboveTheFold as AboveTheFoldSchema; use WP_Rocket\Engine\Media\AboveTheFold\Database\Rows\AboveTheFold as AboveTheFoldRow; -class AboveTheFold extends AbstractQuery { +class AboveTheFold extends AbstractQuery implements Queries { /** * Name of the database table to query. diff --git a/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php index 01f40efa6d..8a807bff79 100644 --- a/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php +++ b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php @@ -4,8 +4,9 @@ namespace WP_Rocket\Engine\Media\AboveTheFold\Database\Tables; use WP_Rocket\Engine\Common\Database\Tables\AbstractTable; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Table; -class AboveTheFold extends AbstractTable { +class AboveTheFold extends AbstractTable implements Table { /** * Table name * @@ -61,7 +62,7 @@ class AboveTheFold extends AbstractTable { * * @return bool */ - public function truncate_atf_table(): bool { + public function truncate_table(): bool { if ( ! $this->exists() ) { return false; } From 78790177bb129f64691f15b86f06700b83396786 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 18 Jul 2024 04:04:26 +0200 Subject: [PATCH 009/192] Apply linter --- inc/Engine/Common/PerformanceHints/Database/Queries.php | 1 - inc/Engine/Common/PerformanceHints/Database/Table.php | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Database/Queries.php b/inc/Engine/Common/PerformanceHints/Database/Queries.php index eefc50572c..819c856fce 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Queries.php +++ b/inc/Engine/Common/PerformanceHints/Database/Queries.php @@ -2,7 +2,6 @@ /** * The Queries interface defines the contract for database query operations. - * */ namespace WP_Rocket\Engine\Common\PerformanceHints\Database; diff --git a/inc/Engine/Common/PerformanceHints/Database/Table.php b/inc/Engine/Common/PerformanceHints/Database/Table.php index f0aad05261..78fdf0f3cb 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Table.php +++ b/inc/Engine/Common/PerformanceHints/Database/Table.php @@ -2,7 +2,6 @@ /** * The Table interface defines the contract for database table operations. - * */ namespace WP_Rocket\Engine\Common\PerformanceHints\Database; @@ -15,6 +14,5 @@ interface Table { * * @return bool Returns a boolean value indicating the success or failure of the operation. */ - public function truncate_table() : bool; - + public function truncate_table(): bool; } From 199921952cb31b160e670800f52fff66b19c472f Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 18 Jul 2024 04:07:39 +0200 Subject: [PATCH 010/192] Fix tests --- .../Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php | 2 +- .../Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php index 261b687299..71212cbe54 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php @@ -51,7 +51,7 @@ public function testShouldDoExpected( $config, $expected ) { ->method( 'remove_all_completed_rows' ); } elseif ( 'truncate' === $expected ) { $this->table->expects( $this->once() ) - ->method( 'truncate_atf_table' ); + ->method( 'truncate_table' ); } } diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php index 3ac24197c4..e01ee1d638 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php @@ -48,7 +48,7 @@ public function testShouldDoExpected( $config, $expected ) { ->willReturn( $config['not_completed'] ); $this->table->expects( $this->once() ) - ->method( 'truncate_atf_table' ); + ->method( 'truncate_table' ); } $this->controller->truncate_on_update( $config['new_version'], $config['old_version'] ); From 764175656482c9c15890e0e306c625bb2aed5c4a Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 18 Jul 2024 04:13:24 +0200 Subject: [PATCH 011/192] Update FactoryInterface --- .../Common/PerformanceHints/FactoryInterface.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/FactoryInterface.php b/inc/Engine/Common/PerformanceHints/FactoryInterface.php index 829bc08591..17b4eb1a03 100644 --- a/inc/Engine/Common/PerformanceHints/FactoryInterface.php +++ b/inc/Engine/Common/PerformanceHints/FactoryInterface.php @@ -3,6 +3,9 @@ namespace WP_Rocket\Engine\Common\PerformanceHints; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Table; + interface AbstractFactory { /** * Provides an Ajax interface. @@ -16,11 +19,15 @@ public function frontend(); // To return Frontend interface when created. /** * Provides a Table interface. + * + * @return Table */ - public function table(); // To return Table interface when created. + public function table() : Table; /** * Provides a Queries interface. + * + * @return Queries */ - public function queries(); // To return Queries interface when created. + public function queries() : Queries; } From 7e93c87194d3973f16e6c333c70b82ed0b85f3d9 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 18 Jul 2024 04:26:39 +0200 Subject: [PATCH 012/192] Update linter --- inc/Engine/Common/PerformanceHints/FactoryInterface.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/FactoryInterface.php b/inc/Engine/Common/PerformanceHints/FactoryInterface.php index 17b4eb1a03..61bb701076 100644 --- a/inc/Engine/Common/PerformanceHints/FactoryInterface.php +++ b/inc/Engine/Common/PerformanceHints/FactoryInterface.php @@ -22,12 +22,12 @@ public function frontend(); // To return Frontend interface when created. * * @return Table */ - public function table() : Table; + public function table(): Table; /** * Provides a Queries interface. * * @return Queries */ - public function queries() : Queries; + public function queries(): Queries; } From cb18ab2bc48ead1530961c444de016ea87f1d6a4 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Fri, 19 Jul 2024 01:20:57 +0200 Subject: [PATCH 013/192] Comply feedback --- .../Database/{Queries.php => QueriesInterface.php} | 2 +- .../Database/{Table.php => TableInterface.php} | 2 +- .../Common/PerformanceHints/FactoryInterface.php | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) rename inc/Engine/Common/PerformanceHints/Database/{Queries.php => QueriesInterface.php} (97%) rename inc/Engine/Common/PerformanceHints/Database/{Table.php => TableInterface.php} (93%) diff --git a/inc/Engine/Common/PerformanceHints/Database/Queries.php b/inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php similarity index 97% rename from inc/Engine/Common/PerformanceHints/Database/Queries.php rename to inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php index 819c856fce..c33fcbda14 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Queries.php +++ b/inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php @@ -5,7 +5,7 @@ */ namespace WP_Rocket\Engine\Common\PerformanceHints\Database; -interface Queries { +interface QueriesInterface { /** * Marks a job as completed. diff --git a/inc/Engine/Common/PerformanceHints/Database/Table.php b/inc/Engine/Common/PerformanceHints/Database/TableInterface.php similarity index 93% rename from inc/Engine/Common/PerformanceHints/Database/Table.php rename to inc/Engine/Common/PerformanceHints/Database/TableInterface.php index 78fdf0f3cb..57cc07cd38 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Table.php +++ b/inc/Engine/Common/PerformanceHints/Database/TableInterface.php @@ -5,7 +5,7 @@ */ namespace WP_Rocket\Engine\Common\PerformanceHints\Database; -interface Table { +interface TableInterface { /** * Truncates the database table. diff --git a/inc/Engine/Common/PerformanceHints/FactoryInterface.php b/inc/Engine/Common/PerformanceHints/FactoryInterface.php index 61bb701076..b83db2605d 100644 --- a/inc/Engine/Common/PerformanceHints/FactoryInterface.php +++ b/inc/Engine/Common/PerformanceHints/FactoryInterface.php @@ -3,10 +3,10 @@ namespace WP_Rocket\Engine\Common\PerformanceHints; -use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries; -use WP_Rocket\Engine\Common\PerformanceHints\Database\Table; +use WP_Rocket\Engine\Common\PerformanceHints\Database\QueriesInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Database\TableInterface; -interface AbstractFactory { +interface FactoryInterface { /** * Provides an Ajax interface. */ @@ -20,14 +20,14 @@ public function frontend(); // To return Frontend interface when created. /** * Provides a Table interface. * - * @return Table + * @return TableInterface */ - public function table(): Table; + public function table(): TableInterface; /** * Provides a Queries interface. * - * @return Queries + * @return QueriesInterface */ - public function queries(): Queries; + public function queries(): QueriesInterface; } From 54f023ddd4a4592f14887b58367527f640514202 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Fri, 19 Jul 2024 01:26:41 +0200 Subject: [PATCH 014/192] Comply feedback --- .../Media/AboveTheFold/Database/Queries/AboveTheFold.php | 4 ++-- .../Media/AboveTheFold/Database/Tables/AboveTheFold.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php index 013665f816..3d7f5bd0e5 100644 --- a/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php +++ b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php @@ -4,12 +4,12 @@ namespace WP_Rocket\Engine\Media\AboveTheFold\Database\Queries; use WP_Rocket\Engine\Common\Database\Queries\AbstractQuery; -use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries; +use WP_Rocket\Engine\Common\PerformanceHints\Database\QueriesInterface; use WP_Rocket\Engine\Media\AboveTheFold\Database\Schemas\AboveTheFold as AboveTheFoldSchema; use WP_Rocket\Engine\Media\AboveTheFold\Database\Rows\AboveTheFold as AboveTheFoldRow; -class AboveTheFold extends AbstractQuery implements Queries { +class AboveTheFold extends AbstractQuery implements QueriesInterface { /** * Name of the database table to query. diff --git a/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php index 8a807bff79..25421073dc 100644 --- a/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php +++ b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php @@ -4,9 +4,9 @@ namespace WP_Rocket\Engine\Media\AboveTheFold\Database\Tables; use WP_Rocket\Engine\Common\Database\Tables\AbstractTable; -use WP_Rocket\Engine\Common\PerformanceHints\Database\Table; +use WP_Rocket\Engine\Common\PerformanceHints\Database\TableInterface; -class AboveTheFold extends AbstractTable implements Table { +class AboveTheFold extends AbstractTable implements TableInterface { /** * Table name * From 12dc04846d4d6f3696ac6b7c69f8e1f1856c8d5a Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Fri, 19 Jul 2024 03:48:44 +0100 Subject: [PATCH 015/192] Closes #6776: 3.17 - Refactor AJAX Process (#6796) --- .../AJAX/ControllerInterface.php | 20 ++++++ .../PerformanceHints/AJAX/Subscriber.php | 62 +++++++++++++++++++ .../PerformanceHints/FactoryInterface.php | 10 ++- .../PerformanceHints/ServiceProvider.php | 52 ++++++++++++++++ .../Media/AboveTheFold/AJAX/Controller.php | 9 +-- .../Media/AboveTheFold/AJAX/Subscriber.php | 56 ----------------- inc/Engine/Media/AboveTheFold/Factory.php | 28 ++++++--- .../Media/AboveTheFold/ServiceProvider.php | 6 +- inc/Plugin.php | 4 +- .../AJAX/Subscriber/addData.php} | 0 .../AJAX/Subscriber/checkData.php} | 0 .../{addLcpData.php => addData.php} | 0 .../AJAX/Subscriber/addData.php} | 8 +-- .../AJAX/Subscriber/checkData.php} | 8 +-- .../{addLcpData.php => addData.php} | 2 +- 15 files changed, 180 insertions(+), 85 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php create mode 100644 inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php create mode 100644 inc/Engine/Common/PerformanceHints/ServiceProvider.php delete mode 100644 inc/Engine/Media/AboveTheFold/AJAX/Subscriber.php rename tests/Fixtures/inc/Engine/{Media/AboveTheFold/AJAX/Subscriber/addLcpData.php => Common/PerformanceHints/AJAX/Subscriber/addData.php} (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold/AJAX/Subscriber/checkLcpData.php => Common/PerformanceHints/AJAX/Subscriber/checkData.php} (100%) rename tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/{addLcpData.php => addData.php} (100%) rename tests/Integration/inc/Engine/{Media/AboveTheFold/AJAX/Subscriber/addLcpData.php => Common/PerformanceHints/AJAX/Subscriber/addData.php} (82%) rename tests/Integration/inc/Engine/{Media/AboveTheFold/AJAX/Subscriber/checkLcpData.php => Common/PerformanceHints/AJAX/Subscriber/checkData.php} (80%) rename tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/{addLcpData.php => addData.php} (98%) diff --git a/inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php b/inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php new file mode 100644 index 0000000000..98499ec76d --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php @@ -0,0 +1,20 @@ +factories = $factories; + } + + /** + * Return an array of events that this subscriber listens to. + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'wp_ajax_rocket_lcp' => 'add_data', + 'wp_ajax_nopriv_rocket_lcp' => 'add_data', + 'wp_ajax_rocket_check_lcp' => 'check_data', + 'wp_ajax_nopriv_rocket_check_lcp' => 'check_data', + ]; + } + + /** + * Callback for data received from beacon script + * + * @return void + */ + public function add_data() { + foreach ( $this->factories as $factory ) { + $factory->get_ajax_controller()->add_data(); + } + } + + /** + * Callback for checking data + * + * @return void + */ + public function check_data() { + foreach ( $this->factories as $factory ) { + $factory->get_ajax_controller()->check_data(); + } + } +} diff --git a/inc/Engine/Common/PerformanceHints/FactoryInterface.php b/inc/Engine/Common/PerformanceHints/FactoryInterface.php index 829bc08591..4f69bc4d48 100644 --- a/inc/Engine/Common/PerformanceHints/FactoryInterface.php +++ b/inc/Engine/Common/PerformanceHints/FactoryInterface.php @@ -3,16 +3,20 @@ namespace WP_Rocket\Engine\Common\PerformanceHints; -interface AbstractFactory { +use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface; + +interface FactoryInterface { /** * Provides an Ajax interface. + * + * @return AjaxControllerInterface */ - public function ajax(); // To return Ajax interface when created. + public function get_ajax_controller(): AjaxControllerInterface; // To return Ajax interface when created. /** * Provides a Frontend interface. */ - public function frontend(); // To return Frontend interface when created. + public function get_frontend_controller(); // To return Frontend interface when created. /** * Provides a Table interface. diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php new file mode 100644 index 0000000000..ac63da8c8e --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -0,0 +1,52 @@ +provides, true ); + } + + /** + * Registers the classes in the container + * + * @return void + */ + public function register(): void { + + $factories = [ + $this->getContainer()->get( 'atf_factory' ), + ]; + + $this->getContainer()->addShared( 'performance_hints_ajax_subscriber', AjaxSubscriber::class ) + ->addArguments( + [ + $factories, + ] + ); + } +} diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php index ed5d60526c..2998824127 100644 --- a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php +++ b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php @@ -6,8 +6,9 @@ use WP_Rocket\Engine\Media\AboveTheFold\Database\Queries\AboveTheFold as ATFQuery; use WP_Rocket\Engine\Common\Context\ContextInterface; use WP_Rocket\Engine\Optimization\UrlTrait; +use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface; -class Controller { +class Controller implements ControllerInterface { use UrlTrait; /** @@ -47,9 +48,9 @@ public function __construct( ATFQuery $query, ContextInterface $context ) { /** * Add LCP data to the database * - * @return bool + * @return void */ - public function add_lcp_data() { + public function add_data(): void { check_ajax_referer( 'rocket_lcp', 'rocket_lcp_nonce' ); if ( ! $this->context->is_allowed() ) { @@ -248,7 +249,7 @@ private function sanitize_image_url( string $url ) { * * @return void */ - public function check_lcp_data() { + public function check_data(): void { check_ajax_referer( 'rocket_lcp', 'rocket_lcp_nonce' ); if ( ! $this->context->is_allowed() ) { diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Subscriber.php b/inc/Engine/Media/AboveTheFold/AJAX/Subscriber.php deleted file mode 100644 index 6a070c454b..0000000000 --- a/inc/Engine/Media/AboveTheFold/AJAX/Subscriber.php +++ /dev/null @@ -1,56 +0,0 @@ -controller = $controller; - } - - /** - * Array of events this subscriber listens to - * - * @return array - */ - public static function get_subscribed_events() { - return [ - 'wp_ajax_rocket_lcp' => 'add_lcp_data', - 'wp_ajax_nopriv_rocket_lcp' => 'add_lcp_data', - 'wp_ajax_rocket_check_lcp' => 'check_lcp_data', - 'wp_ajax_nopriv_rocket_check_lcp' => 'check_lcp_data', - ]; - } - - /** - * Callback for data received from lcp script - * - * @return void - */ - public function add_lcp_data() { - $this->controller->add_lcp_data(); - } - - /** - * Callback for checking lcp data - * - * @return void - */ - public function check_lcp_data() { - $this->controller->check_lcp_data(); - } -} diff --git a/inc/Engine/Media/AboveTheFold/Factory.php b/inc/Engine/Media/AboveTheFold/Factory.php index f233931fc9..67d2970307 100644 --- a/inc/Engine/Media/AboveTheFold/Factory.php +++ b/inc/Engine/Media/AboveTheFold/Factory.php @@ -4,28 +4,40 @@ namespace WP_Rocket\Engine\Media\AboveTheFold; -use WP_Rocket\Engine\Common\PerformanceHints\AbstractFactory; +use WP_Rocket\Engine\Common\PerformanceHints\FactoryInterface; +use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface; -class Factory implements AbstractFactory { +class Factory implements FactoryInterface { + + /** + * Ajax Controller. + * + * @var AjaxControllerInterface + */ + protected $ajax_controller; /** * Instatiate the class. + * + * @param AjaxControllerInterface $ajax_controller ATF AJAX Controller. */ - public function __construct() { - // Assign objects to their properties. + public function __construct( AjaxControllerInterface $ajax_controller ) { + $this->ajax_controller = $ajax_controller; } /** - * Provides an Ajax object. + * Provides an Ajax controller object. + * + * @return AjaxControllerInterface */ - public function ajax() { - // Return Ajax object. + public function get_ajax_controller(): AjaxControllerInterface { + return $this->ajax_controller; } /** * Provides a Frontend object. */ - public function frontend() { + public function get_frontend_controller() { // Return Fontend object. } diff --git a/inc/Engine/Media/AboveTheFold/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/ServiceProvider.php index 480ce279a4..3c2e7b017e 100644 --- a/inc/Engine/Media/AboveTheFold/ServiceProvider.php +++ b/inc/Engine/Media/AboveTheFold/ServiceProvider.php @@ -101,9 +101,6 @@ public function register(): void { ] ); - $this->getContainer()->addShared( 'atf_ajax_subscriber', AJAXSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'atf_ajax_controller' ) ); - $this->getContainer()->add( 'warmup_apiclient', APIClient::class ) ->addArgument( $this->getContainer()->get( 'options' ) ); @@ -122,6 +119,7 @@ public function register(): void { $this->getContainer()->addShared( 'warmup_subscriber', WarmUpSubscriber::class ) ->addArgument( $this->getContainer()->get( 'warmup_controller' ) ); - $this->getContainer()->addShared( 'atf_factory', Factory::class ); + $this->getContainer()->addShared( 'atf_factory', Factory::class ) + ->addArgument( $this->getContainer()->get( 'atf_ajax_controller' ) ); } } diff --git a/inc/Plugin.php b/inc/Plugin.php index 104258d8ce..6509468bae 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -51,6 +51,7 @@ use WP_Rocket\ThirdParty\Themes\ThemeResolver; use WP_Rocket\Engine\Debug\Resolver as DebugResolver; use WP_Rocket\Engine\Debug\ServiceProvider as DebugServiceProvider; +use WP_Rocket\Engine\Common\PerformanceHints\ServiceProvider as PerformanceHintsServiceProvider; /** * Plugin Manager. @@ -304,6 +305,7 @@ private function init_common_subscribers() { $this->container->addServiceProvider( new ATFServiceProvider() ); $this->container->addServiceProvider( new JobManagerServiceProvider() ); $this->container->addServiceProvider( new SaasAdminServiceProvider() ); + $this->container->addServiceProvider( new PerformanceHintsServiceProvider() ); $common_subscribers = [ 'license_subscriber', @@ -387,13 +389,13 @@ private function init_common_subscribers() { 'atf_subscriber', 'cron_subscriber', 'atf_admin_subscriber', - 'atf_ajax_subscriber', 'contactform7', 'debug_subscriber', 'rucss_cron_subscriber', 'atf_cron_subscriber', 'saas_admin_subscriber', 'warmup_subscriber', + 'performance_hints_ajax_subscriber', ]; $host_type = HostResolver::get_host_service(); diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/checkLcpData.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/checkLcpData.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addLcpData.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addLcpData.php rename to tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php similarity index 82% rename from tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php rename to tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php index 3dda20d1e9..c2927dd5c1 100644 --- a/tests/Integration/inc/Engine/Media/AboveTheFold/AJAX/Subscriber/addLcpData.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php @@ -1,15 +1,15 @@ justReturn( $config['filetype'] ); } - $this->controller->add_lcp_data(); + $this->controller->add_data(); } } From 4149dc25221e09a7debd6288062e17f855633683 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:56:50 +0100 Subject: [PATCH 016/192] Subtask/6778 3.17 refactor frontend process (#6804) --- .../PerformanceHints/FactoryInterface.php | 15 +- .../Frontend/ControllerInterface.php | 25 ++ .../PerformanceHints/Frontend/Processor.php | 217 ++++++++++++++++++ .../PerformanceHints/Frontend/Subscriber.php | 49 ++++ .../PerformanceHints/ServiceProvider.php | 30 ++- inc/Engine/Media/AboveTheFold/Factory.php | 43 +++- .../AboveTheFold/Frontend/Controller.php | 139 ++--------- .../AboveTheFold/Frontend/Subscriber.php | 15 +- .../Media/AboveTheFold/ServiceProvider.php | 8 +- inc/Plugin.php | 1 + .../Frontend/Subscriber/HTML/input.html | 0 ...nput_lcp_bg_responsive_imgset_template.php | 0 ...nput_lcp_bg_responsive_webkit_template.php | 0 .../Subscriber/HTML/input_lcp_image.html | 0 .../Subscriber/HTML/input_lcp_layered_bg.php | 0 .../Subscriber/HTML/input_lcp_picture.php | 0 .../Subscriber/HTML/input_lcp_picture_2.php | 0 .../Subscriber/HTML/input_lcp_picture_3.php | 0 .../Subscriber/HTML/input_lcp_picture_4.php | 0 .../Subscriber/HTML/input_lcp_responsive.php | 0 .../Subscriber/HTML/input_lcp_single_bg.php | 0 .../HTML/input_lcp_with_fetchpriority.html | 0 .../HTML/input_lcp_with_markup_comment.html | 0 .../Subscriber/HTML/input_w_bg_image_lcp.html | 0 .../Subscriber/HTML/input_w_img_lcp.html | 0 .../HTML/input_w_picture_img_lcp.html | 0 .../HTML/input_with_absolute_img_lcp.html | 0 .../HTML/input_with_relative_img_lcp.html | 0 .../Frontend/Subscriber/HTML/output.html | 0 ...tput_lcp_bg_responsive_imgset_template.php | 0 ...tput_lcp_bg_responsive_webkit_template.php | 0 .../Subscriber/HTML/output_lcp_image.php | 0 .../Subscriber/HTML/output_lcp_layered_bg.php | 0 .../Subscriber/HTML/output_lcp_picture.php | 0 .../Subscriber/HTML/output_lcp_picture_2.php | 0 .../Subscriber/HTML/output_lcp_picture_3.php | 0 .../Subscriber/HTML/output_lcp_picture_4.php | 0 .../Subscriber/HTML/output_lcp_responsive.php | 0 .../Subscriber/HTML/output_lcp_single_bg.php | 0 .../HTML/output_lcp_with_fetchpriority.html | 0 .../HTML/output_lcp_with_markup_comment.html | 0 .../Subscriber/HTML/output_w_beacon.html | 2 +- .../HTML/output_w_bg_image_lcp.html | 0 .../Subscriber/HTML/output_w_img_lcp.html | 0 .../HTML/output_w_picture_img_lcp.html | 0 .../Subscriber/HTML/output_w_preload.html | 0 .../HTML/output_with_absolute_img_lcp.php | 0 .../HTML/output_with_relative_img_lcp.php | 0 .../Subscriber/maybe_apply_optimizations.php} | 0 .../Subscriber/maybe_apply_optimizations.php} | 16 +- .../Frontend/Controller/addExclusions.php | 3 +- 51 files changed, 405 insertions(+), 158 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php create mode 100644 inc/Engine/Common/PerformanceHints/Frontend/Processor.php create mode 100644 inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_bg_responsive_imgset_template.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_image.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_layered_bg.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_picture.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_picture_2.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_picture_3.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_picture_4.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_responsive.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_single_bg.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_with_fetchpriority.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_lcp_with_markup_comment.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_w_img_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_with_absolute_img_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/input_with_relative_img_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_image.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_layered_bg.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_picture.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_picture_2.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_picture_3.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_picture_4.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_responsive.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_single_bg.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_with_fetchpriority.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_lcp_with_markup_comment.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_w_beacon.html (62%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_w_img_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_w_preload.html (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_with_absolute_img_lcp.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Frontend/Subscriber/HTML/output_with_relative_img_lcp.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold/Frontend/Subscriber/lcp.php => Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php} (100%) rename tests/Integration/inc/Engine/{Media/AboveTheFold/Frontend/Subscriber/lcp.php => Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php} (55%) diff --git a/inc/Engine/Common/PerformanceHints/FactoryInterface.php b/inc/Engine/Common/PerformanceHints/FactoryInterface.php index 4f69bc4d48..278f8650d1 100644 --- a/inc/Engine/Common/PerformanceHints/FactoryInterface.php +++ b/inc/Engine/Common/PerformanceHints/FactoryInterface.php @@ -4,6 +4,8 @@ namespace WP_Rocket\Engine\Common\PerformanceHints; use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface as FrontendControllerInterface; +use WP_Rocket\Engine\Common\Context\ContextInterface; interface FactoryInterface { /** @@ -11,12 +13,14 @@ interface FactoryInterface { * * @return AjaxControllerInterface */ - public function get_ajax_controller(): AjaxControllerInterface; // To return Ajax interface when created. + public function get_ajax_controller(): AjaxControllerInterface; /** * Provides a Frontend interface. + * + * @return FrontendControllerInterface */ - public function get_frontend_controller(); // To return Frontend interface when created. + public function get_frontend_controller(): FrontendControllerInterface; /** * Provides a Table interface. @@ -27,4 +31,11 @@ public function table(); // To return Table interface when created. * Provides a Queries interface. */ public function queries(); // To return Queries interface when created. + + /** + * Provides a Context interface + * + * @return ContextInterface + */ + public function get_context(): ContextInterface; } diff --git a/inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php b/inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php new file mode 100644 index 0000000000..882f35192a --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php @@ -0,0 +1,25 @@ +factories = $factories; + $this->options = $options; + $this->query = $query; // Should removed when the database products are returned in the concrete factory. + $this->filesystem = $filesystem ?: rocket_direct_filesystem(); + } + + /** + * Apply Performance Hints Optimizations. + * + * @param string $html HTML content. + * @return string + */ + public function maybe_apply_optimizations( string $html ): string { + if ( empty( $this->factories ) ) { + return $html; + } + + global $wp; + + $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); + $is_mobile = $this->is_mobile(); + + $row = $this->query->get_row( $url, $is_mobile ); + if ( empty( $row ) ) { + return $this->inject_beacon( $html, $url, $is_mobile ); + } + + // The DB row check above will need to be updated during the database refactor to something below. + + // phpcs:disable Squiz.Commenting.InlineComment.InvalidEndChar + // $html_optimized = null; + // foreach ( $this->factories as $factory ) { + // $row = $factory->queries()->get_row( $url, $is_mobile ); + // if ( empty( $row ) ) { + // return $this->inject_beacon( $html, $url, $is_mobile ); + // } + + // $html = $html_optimized ?? $html; + // $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); + // } + + // phpcs:enable Squiz.Commenting.InlineComment.InvalidEndChar + foreach ( $this->factories as $factory ) { + $html = $html_optimized ?? $html; + $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); + } + + return $html_optimized; + } + + /** + * The `inject_beacon` function is used to inject a JavaScript beacon into the HTML content + * + * @param string $html The HTML content where the beacon will be injected. + * @param string $url The current URL. + * @param bool $is_mobile True for mobile device, false otherwise. + * + * @return string The modified HTML content with the beacon script injected just before the closing body tag. + */ + private function inject_beacon( $html, $url, $is_mobile ): string { + $min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; + + if ( ! $this->filesystem->exists( rocket_get_constant( 'WP_ROCKET_ASSETS_JS_PATH' ) . 'lcp-beacon' . $min . '.js' ) ) { + return $html; + } + + $default_width_threshold = $is_mobile ? 393 : 1600; + $default_height_threshold = $is_mobile ? 830 : 700; + /** + * Filters the width threshold for the LCP beacon. + * + * @param int $width_threshold The width threshold. Default is 393 for mobile and 1920 for others. + * @param bool $is_mobile True if the current device is mobile, false otherwise. + * @param string $url The current URL. + * + * @return int The filtered width threshold. + */ + $width_threshold = rocket_apply_filter_and_deprecated( + 'rocket_performance_hints_optimization_width_threshold', + [ $default_width_threshold, $is_mobile, $url ], + '3.17', + 'rocket_lcp_width_threshold' + ); + + /** + * Filters the height threshold for the LCP beacon. + * + * @param int $height_threshold The height threshold. Default is 830 for mobile and 1080 for others. + * @param bool $is_mobile True if the current device is mobile, false otherwise. + * @param string $url The current URL. + * + * @return int The filtered height threshold. + */ + $height_threshold = rocket_apply_filter_and_deprecated( + 'rocket_performance_hints_optimization_height_threshold', + [ $default_height_threshold, $is_mobile, $url ], + '3.17', + 'rocket_lcp_height_threshold' + ); + + if ( ! is_int( $width_threshold ) ) { + $width_threshold = $default_width_threshold; + } + + if ( ! is_int( $height_threshold ) ) { + $height_threshold = $default_height_threshold; + } + + $default_delay = 500; + + /** + * Filters the delay before the LCP beacon is triggered. + * + * @param int $delay The delay in milliseconds. Default is 500. + */ + $delay = rocket_apply_filter_and_deprecated( + 'rocket_performance_hints_optimization_delay', + [ $default_delay ], + '3.17', + 'rocket_lcp_delay' + ); + + if ( ! is_int( $delay ) ) { + $delay = $default_delay; + } + + $data = [ + 'ajax_url' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'rocket_lcp' ), + 'url' => $url, + 'is_mobile' => $is_mobile, + 'width_threshold' => $width_threshold, + 'height_threshold' => $height_threshold, + 'delay' => $delay, + 'debug' => rocket_get_constant( 'WP_ROCKET_DEBUG' ), + ]; + + $data_modified = null; + foreach ( $this->factories as $factory ) { + $data = $data_modified ?? $data; + $data_modified = $factory->get_frontend_controller()->target_elements( $data ); + } + + $inline_script = ''; + + // Get the URL of the script. + $script_url = rocket_get_constant( 'WP_ROCKET_ASSETS_JS_URL' ) . 'lcp-beacon' . $min . '.js'; + + // Create the script tag. + $script_tag = ""; // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + + // Append the script tag just before the closing body tag. + return str_replace( '', $inline_script . $script_tag . '', $html ); + } + + /** + * Determines if the page is mobile and separate cache for mobile files is enabled. + * + * @return bool + */ + private function is_mobile(): bool { + return $this->options->get( 'cache_mobile', 0 ) + && $this->options->get( 'do_caching_mobile_files', 0 ) + && wp_is_mobile(); + } +} diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php b/inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php new file mode 100644 index 0000000000..dde578f3f7 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php @@ -0,0 +1,49 @@ +processor = $processor; + } + + /** + * Return an array of events that this subscriber listens to. + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'rocket_buffer' => [ 'maybe_apply_optimizations', 17 ], + 'rocket_critical_image_saas_visit_buffer' => [ 'maybe_apply_optimizations', 17 ], + ]; + } + + /** + * Apply performance hints optimizations. + * + * @param string $html HTML content. + * + * @return string + */ + public function maybe_apply_optimizations( $html ): string { + return $this->processor->maybe_apply_optimizations( $html ); + } +} diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index ac63da8c8e..e1e55b0c5e 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -5,6 +5,8 @@ use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Common\PerformanceHints\AJAX\Subscriber as AjaxSubscriber; +use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Processor as FrontendProcessor; +use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Subscriber as FrontendSubscriber; class ServiceProvider extends AbstractServiceProvider { /** @@ -18,6 +20,8 @@ class ServiceProvider extends AbstractServiceProvider { */ protected $provides = [ 'performance_hints_ajax_subscriber', + 'frontend_processor', + 'performance_hints_frontend_subscriber', ]; /** @@ -38,9 +42,13 @@ public function provides( string $id ): bool { */ public function register(): void { - $factories = [ - $this->getContainer()->get( 'atf_factory' ), - ]; + $factories = []; + + $atf_factory = $this->getContainer()->get( 'atf_factory' ); + + if ( $atf_factory->get_context()->is_allowed() ) { + $factories[] = $atf_factory; + } $this->getContainer()->addShared( 'performance_hints_ajax_subscriber', AjaxSubscriber::class ) ->addArguments( @@ -48,5 +56,21 @@ public function register(): void { $factories, ] ); + + $this->getContainer()->add( 'frontend_processor', FrontendProcessor::class ) + ->addArguments( + [ + $factories, + $this->getContainer()->get( 'options' ), + $this->getContainer()->get( 'atf_query' ), + ] + ); + + $this->getContainer()->addShared( 'performance_hints_frontend_subscriber', FrontendSubscriber::class ) + ->addArguments( + [ + $this->getContainer()->get( 'frontend_processor' ), + ] + ); } } diff --git a/inc/Engine/Media/AboveTheFold/Factory.php b/inc/Engine/Media/AboveTheFold/Factory.php index 67d2970307..c81f053bb1 100644 --- a/inc/Engine/Media/AboveTheFold/Factory.php +++ b/inc/Engine/Media/AboveTheFold/Factory.php @@ -6,23 +6,43 @@ use WP_Rocket\Engine\Common\PerformanceHints\FactoryInterface; use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface as FrontendControllerInterface; +use WP_Rocket\Engine\Common\Context\ContextInterface; class Factory implements FactoryInterface { /** - * Ajax Controller. + * Ajax Controller instance. * * @var AjaxControllerInterface */ protected $ajax_controller; + /** + * Frontend Controller instance. + * + * @var FrontendControllerInterface + */ + protected $frontend_controller; + + /** + * Context instance. + * + * @var ContextInterface + */ + protected $context; + /** * Instatiate the class. * - * @param AjaxControllerInterface $ajax_controller ATF AJAX Controller. + * @param AjaxControllerInterface $ajax_controller ATF AJAX Controller instance. + * @param FrontendControllerInterface $frontend_controller ATF Frontend Controller instance. + * @param ContextInterface $context ATF Context instance. */ - public function __construct( AjaxControllerInterface $ajax_controller ) { - $this->ajax_controller = $ajax_controller; + public function __construct( AjaxControllerInterface $ajax_controller, FrontendControllerInterface $frontend_controller, ContextInterface $context ) { + $this->ajax_controller = $ajax_controller; + $this->frontend_controller = $frontend_controller; + $this->context = $context; } /** @@ -36,9 +56,11 @@ public function get_ajax_controller(): AjaxControllerInterface { /** * Provides a Frontend object. + * + * @return FrontendControllerInterface */ - public function get_frontend_controller() { - // Return Fontend object. + public function get_frontend_controller(): FrontendControllerInterface { + return $this->frontend_controller; } /** @@ -54,4 +76,13 @@ public function table() { public function queries() { // Return Queries object. } + + /** + * Provides a Context object. + * + * @return ContextInterface + */ + public function get_context(): ContextInterface { + return $this->context; + } } diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php index c3f9fd4f5a..a580f76ee1 100644 --- a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php +++ b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php @@ -3,14 +3,14 @@ namespace WP_Rocket\Engine\Media\AboveTheFold\Frontend; -use WP_Filesystem_Direct; use WP_Rocket\Admin\Options_Data; use WP_Rocket\Engine\Media\AboveTheFold\Database\Queries\AboveTheFold as ATFQuery; use WP_Rocket\Engine\Media\AboveTheFold\Context\Context; use WP_Rocket\Engine\Optimization\RegexTrait; use WP_Rocket\Engine\Optimization\UrlTrait; +use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface; -class Controller { +class Controller implements ControllerInterface { use RegexTrait; use UrlTrait; @@ -35,50 +35,28 @@ class Controller { */ private $context; - /** - * WordPress filesystem. - * - * @var WP_Filesystem_Direct - */ - protected $filesystem; - /** * Constructor * - * @param Options_Data $options Options instance. - * @param ATFQuery $query Queries instance. - * @param Context $context Context instance. - * @param WP_Filesystem_Direct|null $filesystem WordPress filesystem. + * @param Options_Data $options Options instance. + * @param ATFQuery $query Queries instance. + * @param Context $context Context instance. */ - public function __construct( Options_Data $options, ATFQuery $query, Context $context, WP_Filesystem_Direct $filesystem = null ) { - $this->options = $options; - $this->query = $query; - $this->context = $context; - $this->filesystem = $filesystem ?: rocket_direct_filesystem(); + public function __construct( Options_Data $options, ATFQuery $query, Context $context ) { + $this->options = $options; + $this->query = $query; + $this->context = $context; } /** * Optimize the LCP image * * @param string $html HTML content. + * @param object $row Database Row. * * @return string */ - public function lcp( $html ): string { - if ( ! $this->context->is_allowed() ) { - return $html; - } - - global $wp; - - $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); - $is_mobile = $this->is_mobile(); - $row = $this->query->get_row( $url, $is_mobile ); - - if ( empty( $row ) ) { - return $this->inject_beacon( $html, $url, $is_mobile ); - } - + public function optimize( string $html, $row ): string { if ( ! $row->has_lcp() ) { return $html; } @@ -361,91 +339,6 @@ private function is_mobile(): bool { && wp_is_mobile(); } - /** - * The `inject_beacon` function is used to inject a JavaScript beacon into the HTML content. - * - * @param string $html The HTML content where the beacon will be injected. - * @param string $url The current URL. - * @param bool $is_mobile True for mobile device, false otherwise. - * - * @return string The modified HTML content with the beacon script injected just before the closing body tag. - */ - public function inject_beacon( $html, $url, $is_mobile ): string { - $min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; - - if ( ! $this->filesystem->exists( rocket_get_constant( 'WP_ROCKET_ASSETS_JS_PATH' ) . 'lcp-beacon' . $min . '.js' ) ) { - return $html; - } - - $default_width_threshold = $is_mobile ? 393 : 1600; - $default_height_threshold = $is_mobile ? 830 : 700; - /** - * Filters the width threshold for the LCP beacon. - * - * @param int $width_threshold The width threshold. Default is 393 for mobile and 1920 for others. - * @param bool $is_mobile True if the current device is mobile, false otherwise. - * @param string $url The current URL. - * - * @return int The filtered width threshold. - */ - $width_threshold = apply_filters( 'rocket_lcp_width_threshold', $default_width_threshold, $is_mobile, $url ); - - /** - * Filters the height threshold for the LCP beacon. - * - * @param int $height_threshold The height threshold. Default is 830 for mobile and 1080 for others. - * @param bool $is_mobile True if the current device is mobile, false otherwise. - * @param string $url The current URL. - * - * @return int The filtered height threshold. - */ - $height_threshold = apply_filters( 'rocket_lcp_height_threshold', $default_height_threshold, $is_mobile, $url ); - - if ( ! is_int( $width_threshold ) ) { - $width_threshold = $default_width_threshold; - } - - if ( ! is_int( $height_threshold ) ) { - $height_threshold = $default_height_threshold; - } - - $default_delay = 500; - - /** - * Filters the delay before the LCP beacon is triggered. - * - * @param int $delay The delay in milliseconds. Default is 500. - */ - $delay = apply_filters( 'rocket_lcp_delay', $default_delay ); - - if ( ! is_int( $delay ) ) { - $delay = $default_delay; - } - - $data = [ - 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'nonce' => wp_create_nonce( 'rocket_lcp' ), - 'url' => $url, - 'is_mobile' => $is_mobile, - 'elements' => $this->lcp_atf_elements(), - 'width_threshold' => $width_threshold, - 'height_threshold' => $height_threshold, - 'delay' => $delay, - 'debug' => rocket_get_constant( 'WP_ROCKET_DEBUG' ), - ]; - - $inline_script = ''; - - // Get the URL of the script. - $script_url = rocket_get_constant( 'WP_ROCKET_ASSETS_JS_URL' ) . 'lcp-beacon' . $min . '.js'; - - // Create the script tag. - $script_tag = ""; // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript - - // Append the script tag just before the closing body tag. - return str_replace( '', $inline_script . $script_tag . '', $html ); - } - /** * Generates the source tags for the given LCP object. * @@ -519,9 +412,11 @@ private function generate_source_tags( $lcp, $start_tag, $end_tag ) { /** * Returns a comma-separated list of elements to be considered for the lcp/above-the-fold optimization. * - * @return string + * @param array $data Array of data passed in beacon. + * + * @return array */ - private function lcp_atf_elements(): string { + public function target_elements( array $data ): array { $elements = [ 'img', 'video', @@ -552,6 +447,8 @@ private function lcp_atf_elements(): string { $elements = array_filter( $elements, 'is_string' ); - return implode( ', ', $elements ); + $data['elements'] = implode( ', ', $elements ); + + return $data; } } diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Subscriber.php b/inc/Engine/Media/AboveTheFold/Frontend/Subscriber.php index 949ed7f8c2..dff6efb339 100644 --- a/inc/Engine/Media/AboveTheFold/Frontend/Subscriber.php +++ b/inc/Engine/Media/AboveTheFold/Frontend/Subscriber.php @@ -29,23 +29,10 @@ public function __construct( Controller $controller ) { */ public static function get_subscribed_events() { return [ - 'rocket_buffer' => [ 'lcp', 17 ], - 'rocket_lazyload_excluded_src' => 'add_exclusions', - 'rocket_critical_image_saas_visit_buffer' => [ 'lcp', 17 ], + 'rocket_lazyload_excluded_src' => 'add_exclusions', ]; } - /** - * Optimize the LCP image - * - * @param string $html HTML content. - * - * @return string - */ - public function lcp( $html ): string { - return $this->controller->lcp( $html ); - } - /** * Add above the fold images to lazyload exclusions * diff --git a/inc/Engine/Media/AboveTheFold/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/ServiceProvider.php index 3c2e7b017e..3a2f78cdb6 100644 --- a/inc/Engine/Media/AboveTheFold/ServiceProvider.php +++ b/inc/Engine/Media/AboveTheFold/ServiceProvider.php @@ -120,6 +120,12 @@ public function register(): void { ->addArgument( $this->getContainer()->get( 'warmup_controller' ) ); $this->getContainer()->addShared( 'atf_factory', Factory::class ) - ->addArgument( $this->getContainer()->get( 'atf_ajax_controller' ) ); + ->addArguments( + [ + $this->getContainer()->get( 'atf_ajax_controller' ), + $this->getContainer()->get( 'atf_controller' ), + $this->getContainer()->get( 'atf_context' ), + ] + ); } } diff --git a/inc/Plugin.php b/inc/Plugin.php index 98e55335c1..d7afdd093f 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -396,6 +396,7 @@ private function init_common_subscribers() { 'saas_admin_subscriber', 'warmup_subscriber', 'performance_hints_ajax_subscriber', + 'performance_hints_frontend_subscriber', ]; $host_type = HostResolver::get_host_service(); diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_bg_responsive_imgset_template.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_bg_responsive_imgset_template.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_bg_responsive_imgset_template.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_bg_responsive_imgset_template.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_bg_responsive_webkit_template.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_image.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_image.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_image.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_image.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_layered_bg.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_layered_bg.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_layered_bg.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_layered_bg.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture_2.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture_2.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture_2.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture_2.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture_3.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture_3.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture_3.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture_3.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture_4.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture_4.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_picture_4.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_picture_4.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_responsive.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_responsive.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_responsive.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_responsive.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_single_bg.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_single_bg.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_single_bg.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_single_bg.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_with_fetchpriority.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_with_fetchpriority.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_with_fetchpriority.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_with_fetchpriority.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_with_markup_comment.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_with_markup_comment.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_lcp_with_markup_comment.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_lcp_with_markup_comment.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_w_bg_image_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_img_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_w_img_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_img_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_w_img_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_w_picture_img_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_with_absolute_img_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_absolute_img_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_with_absolute_img_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_absolute_img_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_with_relative_img_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_relative_img_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/input_with_relative_img_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_relative_img_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_bg_responsive_imgset_template.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_bg_responsive_webkit_template.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_image.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_image.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_image.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_image.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_layered_bg.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_layered_bg.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_layered_bg.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_layered_bg.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture_2.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture_2.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture_2.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture_2.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture_3.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture_3.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture_3.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture_3.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture_4.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture_4.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_picture_4.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_picture_4.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_responsive.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_responsive.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_responsive.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_responsive.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_single_bg.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_single_bg.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_single_bg.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_single_bg.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_with_fetchpriority.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_with_fetchpriority.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_with_fetchpriority.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_with_fetchpriority.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_with_markup_comment.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_with_markup_comment.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_lcp_with_markup_comment.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_lcp_with_markup_comment.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html similarity index 62% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_beacon.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html index bf6f38a064..f7c5a8fc66 100644 --- a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_beacon.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html @@ -3,5 +3,5 @@ Test - + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_bg_image_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_img_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_img_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_img_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_img_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_picture_img_lcp.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_preload.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_preload.html similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_w_preload.html rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_preload.html diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_with_absolute_img_lcp.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_absolute_img_lcp.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_with_absolute_img_lcp.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_absolute_img_lcp.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_with_relative_img_lcp.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_relative_img_lcp.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/HTML/output_with_relative_img_lcp.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_relative_img_lcp.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php similarity index 55% rename from tests/Integration/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php rename to tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php index a476ba03e4..3710993dd7 100644 --- a/tests/Integration/inc/Engine/Media/AboveTheFold/Frontend/Subscriber/lcp.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php @@ -1,17 +1,17 @@ unregisterAllCallbacksExcept( 'rocket_buffer', 'lcp', 17 ); + $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'maybe_apply_optimizations', 17 ); } public function tear_down() { self::uninstallAtfTable(); - remove_filter( 'rocket_lcp_delay', [ $this, 'add_delay' ] ); + remove_filter( 'rocket_performance_hints_optimization_delay', [ $this, 'add_delay' ] ); $this->restoreWpHook( 'rocket_buffer' ); parent::tear_down(); @@ -43,7 +43,7 @@ public function testShouldReturnAsExpected( $config, $expected ) { } if ( isset( $config['filter_delay'] ) ) { - add_filter( 'rocket_lcp_delay', [ $this, 'add_delay' ] ); + add_filter( 'rocket_performance_hints_optimization_delay', [ $this, 'add_delay' ] ); } Functions\when( 'wp_create_nonce' )->justReturn( '96ac96b69e' ); diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Frontend/Controller/addExclusions.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Frontend/Controller/addExclusions.php index fbb5f97b14..b313b41179 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/Frontend/Controller/addExclusions.php +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/Frontend/Controller/addExclusions.php @@ -31,9 +31,8 @@ protected function setUp(): void { $this->options = Mockery::mock( Options_Data::class ); $this->query = $this->createPartialMock( AboveTheFold::class, [ 'get_row' ] ); $this->context = Mockery::mock( Context::class ); - $this->filesystem = Mockery::mock( WP_Filesystem_Direct::class ); - $this->controller = new Controller( $this->options, $this->query, $this->context, $this->filesystem ); + $this->controller = new Controller( $this->options, $this->query, $this->context ); } protected function tearDown(): void { From fab26304ae94dec3da2ee34e894f9e7e2155ca94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Robin?= Date: Thu, 25 Jul 2024 12:46:03 +0200 Subject: [PATCH 017/192] Closes #6764: Refactor lcp beacon script (#6789) Co-authored-by: WordPressFan --- README.md | 28 +- assets/js/lcp-beacon.min.js | 2 - assets/js/lcp-beacon.min.js.map | 7 - assets/js/{lcp-beacon.js => wpr-beacon.js} | 169 +++++---- assets/js/wpr-beacon.min.js | 2 + assets/js/wpr-beacon.min.js.map | 7 + gulpfile.js | 4 +- .../PerformanceHints/AJAX/Subscriber.php | 8 +- .../PerformanceHints/Frontend/Processor.php | 2 +- .../Media/AboveTheFold/AJAX/Controller.php | 12 +- package-lock.json | 324 ++++++++---------- package.json | 2 +- src/js/gulp/gulpconfig.js | 2 +- src/js/gulp/tasks/js.js | 7 +- .../AJAX/Subscriber/checkData.php | 12 +- .../Subscriber/HTML/output_w_beacon.html | 2 +- .../AboveTheFold/AJAX/Controller/addData.php | 36 +- ...disableImageDimensionsHeightPercentage.php | 2 +- .../AJAX/Subscriber/addData.php | 6 +- .../AJAX/Subscriber/checkData.php | 2 +- .../AboveTheFold/AJAX/Controller/addData.php | 8 +- 21 files changed, 320 insertions(+), 324 deletions(-) delete mode 100644 assets/js/lcp-beacon.min.js delete mode 100644 assets/js/lcp-beacon.min.js.map rename assets/js/{lcp-beacon.js => wpr-beacon.js} (86%) create mode 100644 assets/js/wpr-beacon.min.js create mode 100644 assets/js/wpr-beacon.min.js.map diff --git a/README.md b/README.md index 492015cf3e..a206cf30b5 100644 --- a/README.md +++ b/README.md @@ -32,20 +32,20 @@ To be able to validate your license and use the plugin, you will also have to ma ## Gulp Tasks -| Command | Description | -|--------------------------------|:--------------------------------------------------------------------------------------------------------------------------------:| -| **CSS Tasks** | | -| `gulp build:saas:unmin` | Builds Full admin CSS, the unminified version (wpr-admin.css) | -| `gulp build:saas:min` | Builds Full admin CSS, the minified version (wpr-admin.min.css) | -| `gulp build:sass:all` | Builds all admin CSS files (wpr-admin.css, wpr-admin.min.css, wpr-admin-rtl.css, wpr-admin-rtl.min.css) | -| `gulp sass:watch` | Watches all admin CSS files mentioned above and builds them again with any change. | -| **JS Tasks** | | -| `gulp build:js:app:unmin` | Builds admin app js file, the unminified version (wpr-admin.js) | -| `gulp build:js:app:min` | Builds admin app js file, the minified version (wpr-admin.min.js) | -| `gulp build:js:lazyloadcss:min` | Builds lazyload CSS js file, the minified version (lazyload-css.min.js) | -| `gulp build:js:lcp` | Builds lcp beacon script, the minified version (lcp-beacon.min.js, source file, and map file) | -| `gulp build:js:all` | Builds all js files mentioned above (wpr-admin.js, wpr-admin.min.js, lazyload-css.min.js, lcp-beacon) | -| `gulp js:watch` | Watches all js files changes and build them again with any change. | +| Command | Description | +|---------------------------------|:-------------------------------------------------------------------------------------------------------:| +| **CSS Tasks** | | +| `gulp build:saas:unmin` | Builds Full admin CSS, the unminified version (wpr-admin.css) | +| `gulp build:saas:min` | Builds Full admin CSS, the minified version (wpr-admin.min.css) | +| `gulp build:sass:all` | Builds all admin CSS files (wpr-admin.css, wpr-admin.min.css, wpr-admin-rtl.css, wpr-admin-rtl.min.css) | +| `gulp sass:watch` | Watches all admin CSS files mentioned above and builds them again with any change. | +| **JS Tasks** | | +| `gulp build:js:app:unmin` | Builds admin app js file, the unminified version (wpr-admin.js) | +| `gulp build:js:app:min` | Builds admin app js file, the minified version (wpr-admin.min.js) | +| `gulp build:js:lazyloadcss:min` | Builds lazyload CSS js file, the minified version (lazyload-css.min.js) | +| `gulp build:js:all` | Builds all js files mentioned above (wpr-admin.js, wpr-admin.min.js, lazyload-css.min.js, wpr-beacon) | +| `gulp build:js:beacon` | Builds beacon script (wpr-beacon.min.js, source file, and map file) | +| `gulp js:watch` | Watches all js files changes and build them again with any change. | ## Support diff --git a/assets/js/lcp-beacon.min.js b/assets/js/lcp-beacon.min.js deleted file mode 100644 index fde1c5b3fc..0000000000 --- a/assets/js/lcp-beacon.min.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{var l=class{constructor(e){this.config=e,this.performanceImages=[],this.errorCode="",this.scriptTimer=new Date,this.infiniteLoopId=null}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this._logMessage("Script Error: "+e)}this._saveFinalResultIntoDB()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage("Bailing out because screen size is not acceptable"),!1):this._isPageCached()&&await this._isGeneratedBefore()?(this._logMessage("Bailing out because data is already available"),!1):!0}_isPageCached(){const e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:"";return e&&e.includes("Debug: cached")}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).success}_isNotValidScreensize(){const e=window.innerWidth||document.documentElement.clientWidth,i=window.innerHeight||document.documentElement.clientHeight,t=this.config.is_mobile&&(e>this.config.width_threshold||i>this.config.height_threshold),c=!this.config.is_mobile&&(e{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&this._isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_isIntersecting(e){return e.bottom>=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const a=[...o.matchAll(c)];t.bg_set=a.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=a.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this._logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_saveFinalResultIntoDB(){const e=new FormData;e.append("action","rocket_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("images",JSON.stringify(this.performanceImages)),e.append("status",this._getFinalStatus()),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e,headers:{"wpr-saas-no-intercept":!0}}).then(i=>i.json()).then(i=>{this._logMessage(i)}).catch(i=>{this._logMessage(i)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-lcp-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}},d=l;(e=>{if(!e)return;const i=new d(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_lcp_data)})(); -//# sourceMappingURL=lcp-beacon.min.js.map diff --git a/assets/js/lcp-beacon.min.js.map b/assets/js/lcp-beacon.min.js.map deleted file mode 100644 index 2aa52049bb..0000000000 --- a/assets/js/lcp-beacon.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["lcp-beacon.js"], - "sourcesContent": ["(() => {\n // src/LcpBeacon.js\n var LcpBeacon = class {\n constructor(config) {\n this.config = config;\n this.performanceImages = [];\n this.errorCode = \"\";\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.infiniteLoopId = null;\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this._logMessage(\"Script Error: \" + err);\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n if (this._isNotValidScreensize()) {\n this._logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n if (this._isPageCached() && await this._isGeneratedBefore()) {\n this._logMessage(\"Bailing out because data is already available\");\n return false;\n }\n return true;\n }\n _isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n async _isGeneratedBefore() {\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_lcp\");\n data_check.append(\"rocket_lcp_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const lcp_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return lcp_data_response.success;\n }\n _isNotValidScreensize() {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = this.config.is_mobile && (screenWidth > this.config.width_threshold || screenHeight > this.config.height_threshold);\n const isNotValidForDesktop = !this.config.is_mobile && (screenWidth < this.config.width_threshold || screenHeight < this.config.height_threshold);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && this._isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this._logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _saveFinalResultIntoDB() {\n const data = new FormData();\n data.append(\"action\", \"rocket_lcp\");\n data.append(\"rocket_lcp_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"images\", JSON.stringify(this.performanceImages));\n data.append(\"status\", this._getFinalStatus());\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this._logMessage(data2);\n }).catch((error) => {\n this._logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-lcp-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n _logMessage(msg) {\n if (!this.config.debug) {\n return;\n }\n console.log(msg);\n }\n };\n var LcpBeacon_default = LcpBeacon;\n\n // src/rocketLcpBeacon.js\n ((rocket_lcp_data) => {\n if (!rocket_lcp_data) {\n return;\n }\n const instance = new LcpBeacon_default(rocket_lcp_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_lcp_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_lcp_data.delay);\n });\n })(window.rocket_lcp_data);\n})();\n"], - "mappings": "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", - "names": ["LcpBeacon", "config", "above_the_fold_images", "err", "signature", "data_check", "data", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "count", "lcpElements", "element", "rect", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "response", "data2", "error", "msg", "LcpBeacon_default", "rocket_lcp_data", "instance"] -} diff --git a/assets/js/lcp-beacon.js b/assets/js/wpr-beacon.js similarity index 86% rename from assets/js/lcp-beacon.js rename to assets/js/wpr-beacon.js index 906bd8b516..b503459d0d 100644 --- a/assets/js/lcp-beacon.js +++ b/assets/js/wpr-beacon.js @@ -1,21 +1,12 @@ (() => { - // src/LcpBeacon.js - var LcpBeacon = class { + // src/RocketLcpBeacon.js + var RocketLcpBeacon = class { constructor(config) { this.config = config; this.performanceImages = []; this.errorCode = ""; - this.scriptTimer = /* @__PURE__ */ new Date(); - this.infiniteLoopId = null; } - async init() { - if (!await this._isValidPreconditions()) { - this._finalize(); - return; - } - this.infiniteLoopId = setTimeout(() => { - this._handleInfiniteLoop(); - }, 1e4); + async run() { try { const above_the_fold_images = this._generateLcpCandidates(Infinity); if (above_the_fold_images) { @@ -26,42 +17,6 @@ this.errorCode = "script_error"; this._logMessage("Script Error: " + err); } - this._saveFinalResultIntoDB(); - } - async _isValidPreconditions() { - if (this._isNotValidScreensize()) { - this._logMessage("Bailing out because screen size is not acceptable"); - return false; - } - if (this._isPageCached() && await this._isGeneratedBefore()) { - this._logMessage("Bailing out because data is already available"); - return false; - } - return true; - } - _isPageCached() { - const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : ""; - return signature && signature.includes("Debug: cached"); - } - async _isGeneratedBefore() { - let data_check = new FormData(); - data_check.append("action", "rocket_check_lcp"); - data_check.append("rocket_lcp_nonce", this.config.nonce); - data_check.append("url", this.config.url); - data_check.append("is_mobile", this.config.is_mobile); - const lcp_data_response = await fetch(this.config.ajax_url, { - method: "POST", - credentials: "same-origin", - body: data_check - }).then((data) => data.json()); - return lcp_data_response.success; - } - _isNotValidScreensize() { - const screenWidth = window.innerWidth || document.documentElement.clientWidth; - const screenHeight = window.innerHeight || document.documentElement.clientHeight; - const isNotValidForMobile = this.config.is_mobile && (screenWidth > this.config.width_threshold || screenHeight > this.config.height_threshold); - const isNotValidForDesktop = !this.config.is_mobile && (screenWidth < this.config.width_threshold || screenHeight < this.config.height_threshold); - return isNotValidForMobile || isNotValidForDesktop; } _generateLcpCandidates(count) { const lcpElements = document.querySelectorAll(this.config.elements); @@ -89,7 +44,7 @@ rect }; }).filter((item) => item !== null).filter((item) => { - return item.rect.width > 0 && item.rect.height > 0 && this._isIntersecting(item.rect); + return item.rect.width > 0 && item.rect.height > 0 && RocketBeacon._isIntersecting(item.rect); }).map((item) => ({ item, area: this._getElementArea(item.rect), @@ -100,9 +55,6 @@ elementInfo: candidate.elementInfo })); } - _isIntersecting(rect) { - return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth); - } _getElementArea(rect) { const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left); const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top); @@ -213,24 +165,89 @@ const isBgImageOrPicture = elementInfo.type === "bg-img" || elementInfo.type === "bg-img-set" || elementInfo.type === "picture"; return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src); } - _getFinalStatus() { - if ("" !== this.errorCode) { - return this.errorCode; + _logMessage(msg) { + if (!this.config.debug) { + return; } - const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3; - if (10 <= scriptTime) { - return "timeout"; + console.log(msg); + } + getResults() { + return this.performanceImages; + } + }; + var RocketLcpBeacon_default = RocketLcpBeacon; + + // src/RocketBeacon.js + var RocketBeacon2 = class { + constructor(config) { + this.config = config; + this.lcpBeacon = null; + this.infiniteLoopId = null; + this.scriptTimer = /* @__PURE__ */ new Date(); + this.errorCode = ""; + } + async init() { + if (!await this._isValidPreconditions()) { + this._finalize(); + return; } - return "success"; + this.infiniteLoopId = setTimeout(() => { + this._handleInfiniteLoop(); + }, 1e4); + const isGeneratedBefore = await this._isGeneratedBefore(); + if (!isGeneratedBefore.lcp) { + this.lcpBeacon = new RocketLcpBeacon_default(this.config); + await this.lcpBeacon.run(); + } + this._saveFinalResultIntoDB(); + } + async _isValidPreconditions() { + if (this._isNotValidScreensize()) { + this._logMessage("Bailing out because screen size is not acceptable"); + return false; + } + if (this._isPageCached() && await this._isGeneratedBefore()) { + this._logMessage("Bailing out because data is already available"); + return false; + } + return true; + } + _isPageCached() { + const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : ""; + return signature && signature.includes("Debug: cached"); + } + async _isGeneratedBefore() { + let data_check = new FormData(); + data_check.append("action", "rocket_check_beacon"); + data_check.append("rocket_beacon_nonce", this.config.nonce); + data_check.append("url", this.config.url); + data_check.append("is_mobile", this.config.is_mobile); + const beacon_data_response = await fetch(this.config.ajax_url, { + method: "POST", + credentials: "same-origin", + body: data_check + }).then((data) => data.json()); + return beacon_data_response.data; + } + _isNotValidScreensize() { + const screenWidth = window.innerWidth || document.documentElement.clientWidth; + const screenHeight = window.innerHeight || document.documentElement.clientHeight; + const isNotValidForMobile = this.config.is_mobile && (screenWidth > this.config.width_threshold || screenHeight > this.config.height_threshold); + const isNotValidForDesktop = !this.config.is_mobile && (screenWidth < this.config.width_threshold || screenHeight < this.config.height_threshold); + return isNotValidForMobile || isNotValidForDesktop; + } + static _isIntersecting(rect) { + return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth); } _saveFinalResultIntoDB() { + const lcpResults = this.lcpBeacon ? this.lcpBeacon.getResults() : null; const data = new FormData(); - data.append("action", "rocket_lcp"); - data.append("rocket_lcp_nonce", this.config.nonce); + data.append("action", "rocket_beacon"); + data.append("rocket_beacon_nonce", this.config.nonce); data.append("url", this.config.url); data.append("is_mobile", this.config.is_mobile); - data.append("images", JSON.stringify(this.performanceImages)); data.append("status", this._getFinalStatus()); + data.append("lcp_images", JSON.stringify(lcpResults)); fetch(this.config.ajax_url, { method: "POST", credentials: "same-origin", @@ -246,11 +263,21 @@ this._finalize(); }); } + _getFinalStatus() { + if ("" !== this.errorCode) { + return this.errorCode; + } + const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3; + if (10 <= scriptTime) { + return "timeout"; + } + return "success"; + } _handleInfiniteLoop() { this._saveFinalResultIntoDB(); } _finalize() { - const beaconscript = document.querySelector('[data-name="wpr-lcp-beacon"]'); + const beaconscript = document.querySelector('[data-name="wpr-wpr-beacon"]'); beaconscript.setAttribute("beacon-completed", "true"); clearTimeout(this.infiniteLoopId); } @@ -261,24 +288,24 @@ console.log(msg); } }; - var LcpBeacon_default = LcpBeacon; + var RocketBeacon_default = RocketBeacon2; - // src/rocketLcpBeacon.js - ((rocket_lcp_data) => { - if (!rocket_lcp_data) { + // src/RocketFinalBeacon.js + ((rocket_beacon_data) => { + if (!rocket_beacon_data) { return; } - const instance = new LcpBeacon_default(rocket_lcp_data); + const instance = new RocketBeacon_default(rocket_beacon_data); if (document.readyState !== "loading") { setTimeout(() => { instance.init(); - }, rocket_lcp_data.delay); + }, rocket_beacon_data.delay); return; } document.addEventListener("DOMContentLoaded", () => { setTimeout(() => { instance.init(); - }, rocket_lcp_data.delay); + }, rocket_beacon_data.delay); }); - })(window.rocket_lcp_data); + })(window.rocket_beacon_data); })(); diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js new file mode 100644 index 0000000000..e9f16562eb --- /dev/null +++ b/assets/js/wpr-beacon.min.js @@ -0,0 +1,2 @@ +(()=>{var l=class{constructor(e){this.config=e,this.performanceImages=[],this.errorCode=""}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this._logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&RocketBeacon._isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const a=[...o.matchAll(c)];t.bg_set=a.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=a.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this._logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}_logMessage(e){this.config.debug&&console.log(e)}getResults(){return this.performanceImages}},g=l,u=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode=""}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4),(await this._isGeneratedBefore()).lcp||(this.lcpBeacon=new g(this.config),await this.lcpBeacon.run()),this._saveFinalResultIntoDB()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage("Bailing out because screen size is not acceptable"),!1):this._isPageCached()&&await this._isGeneratedBefore()?(this._logMessage("Bailing out because data is already available"),!1):!0}_isPageCached(){const e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:"";return e&&e.includes("Debug: cached")}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_isNotValidScreensize(){const e=window.innerWidth||document.documentElement.clientWidth,i=window.innerHeight||document.documentElement.clientHeight,t=this.config.is_mobile&&(e>this.config.width_threshold||i>this.config.height_threshold),c=!this.config.is_mobile&&(e=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_saveFinalResultIntoDB(){const e=this.lcpBeacon?this.lcpBeacon.getResults():null,i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("lcp_images",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this._logMessage(t)}).catch(t=>{this._logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}},d=u;(e=>{if(!e)return;const i=new d(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); +//# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map new file mode 100644 index 0000000000..919e8ba0da --- /dev/null +++ b/assets/js/wpr-beacon.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["wpr-beacon.js"], + "sourcesContent": ["(() => {\n // src/RocketLcpBeacon.js\n var RocketLcpBeacon = class {\n constructor(config) {\n this.config = config;\n this.performanceImages = [];\n this.errorCode = \"\";\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this._logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && RocketBeacon._isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this._logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n _logMessage(msg) {\n if (!this.config.debug) {\n return;\n }\n console.log(msg);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var RocketLcpBeacon_default = RocketLcpBeacon;\n\n // src/RocketBeacon.js\n var RocketBeacon2 = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.errorCode = \"\";\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._isGeneratedBefore();\n if (!isGeneratedBefore.lcp) {\n this.lcpBeacon = new RocketLcpBeacon_default(this.config);\n await this.lcpBeacon.run();\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n if (this._isNotValidScreensize()) {\n this._logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n if (this._isPageCached() && await this._isGeneratedBefore()) {\n this._logMessage(\"Bailing out because data is already available\");\n return false;\n }\n return true;\n }\n _isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n async _isGeneratedBefore() {\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _isNotValidScreensize() {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = this.config.is_mobile && (screenWidth > this.config.width_threshold || screenHeight > this.config.height_threshold);\n const isNotValidForDesktop = !this.config.is_mobile && (screenWidth < this.config.width_threshold || screenHeight < this.config.height_threshold);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static _isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n _saveFinalResultIntoDB() {\n const lcpResults = this.lcpBeacon ? this.lcpBeacon.getResults() : null;\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"lcp_images\", JSON.stringify(lcpResults));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this._logMessage(data2);\n }).catch((error) => {\n this._logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n _logMessage(msg) {\n if (!this.config.debug) {\n return;\n }\n console.log(msg);\n }\n };\n var RocketBeacon_default = RocketBeacon2;\n\n // src/RocketFinalBeacon.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new RocketBeacon_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], + "mappings": "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", + "names": ["RocketLcpBeacon", "config", "above_the_fold_images", "err", "count", "lcpElements", "element", "rect", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "msg", "RocketLcpBeacon_default", "RocketBeacon2", "signature", "data_check", "data", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "lcpResults", "response", "data2", "error", "RocketBeacon_default", "rocket_beacon_data", "instance"] +} diff --git a/gulpfile.js b/gulpfile.js index fb34f3def4..d69d1294b2 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -17,8 +17,8 @@ requireDir('./src/js/gulp/tasks', { recurse: true }); * gulp build:js:app:unmin => Builds admin app js file, the unminified version (wpr-admin.js) * gulp build:js:app:min => Builds admin app js file, the minified version (wpr-admin.min.js) * gulp build:js:lazyloadcss:min => Builds lazyload CSS js file, the minified version (lazyload-css.min.js) -* gulp build:js:lcp => Builds lcp beacon script, the minified version (lcp-beacon.min.js, source file, and map file) -* gulp build:js:all => Builds all js files mentioned above (wpr-admin.js, wpr-admin.min.js, lazyload-css.min.js, lcp-beacon) +* gulp build:js:all => Builds all js files mentioned above (wpr-admin.js, wpr-admin.min.js, lazyload-css.min.js, wpr-beacon.min.js) +* gulp build:js:beacon => Builds lcp beacon script, the minified version (wpr-beacon.min.js, source file, and map file) * gulp js:watch => Watches all js files changes and build them again with any change. * */ diff --git a/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php b/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php index ec935fbf1a..ef26dc446c 100644 --- a/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php @@ -31,10 +31,10 @@ public function __construct( array $factories ) { */ public static function get_subscribed_events(): array { return [ - 'wp_ajax_rocket_lcp' => 'add_data', - 'wp_ajax_nopriv_rocket_lcp' => 'add_data', - 'wp_ajax_rocket_check_lcp' => 'check_data', - 'wp_ajax_nopriv_rocket_check_lcp' => 'check_data', + 'wp_ajax_rocket_beacon' => 'add_data', + 'wp_ajax_nopriv_rocket_beacon' => 'add_data', + 'wp_ajax_rocket_check_beacon' => 'check_data', + 'wp_ajax_nopriv_rocket_check_beacon' => 'check_data', ]; } diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index 1a3dd065e6..c8ea64940d 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -111,7 +111,7 @@ public function maybe_apply_optimizations( string $html ): string { private function inject_beacon( $html, $url, $is_mobile ): string { $min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; - if ( ! $this->filesystem->exists( rocket_get_constant( 'WP_ROCKET_ASSETS_JS_PATH' ) . 'lcp-beacon' . $min . '.js' ) ) { + if ( ! $this->filesystem->exists( rocket_get_constant( 'WP_ROCKET_ASSETS_JS_PATH' ) . 'wpr-beacon' . $min . '.js' ) ) { return $html; } diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php index 6cb1a7d887..24167c4d1b 100644 --- a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php +++ b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php @@ -51,7 +51,7 @@ public function __construct( ATFQuery $query, ContextInterface $context ) { * @return void */ public function add_data(): void { - check_ajax_referer( 'rocket_lcp', 'rocket_lcp_nonce' ); + check_ajax_referer( 'rocket_beacon', 'rocket_beacon_nonce' ); if ( ! $this->context->is_allowed() ) { wp_send_json_error( 'not allowed' ); @@ -60,7 +60,7 @@ public function add_data(): void { $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; - $images = isset( $_POST['images'] ) ? json_decode( wp_unslash( $_POST['images'] ) ) : []; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $images = isset( $_POST['lcp_images'] ) ? json_decode( wp_unslash( $_POST['lcp_images'] ) ) : []; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $lcp = 'not found'; $viewport = []; @@ -241,7 +241,7 @@ private function sanitize_image_url( string $url ) { } /** - * Checks if there is existing LCP data for the current URL and device type. + * Checks if there is existing data for the current URL and device type from the beacon script. * * This method is called via AJAX. It checks if there is existing LCP data for the current URL and device type. * If the data exists, it returns a JSON success response with true. If the data does not exist, it returns a JSON success response with false. @@ -250,7 +250,7 @@ private function sanitize_image_url( string $url ) { * @return void */ public function check_data(): void { - check_ajax_referer( 'rocket_lcp', 'rocket_lcp_nonce' ); + check_ajax_referer( 'rocket_beacon', 'rocket_beacon_nonce' ); if ( ! $this->context->is_allowed() ) { wp_send_json_error( false ); @@ -276,7 +276,7 @@ public function check_data(): void { * @param object $image_object Image full object. * @return bool */ - private function validate_image( $image_object ) { + private function validate_image( $image_object ): bool { $valid_image = ! empty( $image_object->src ) ? $this->validate_image_src( $image_object->src ?? '' ) : true; /** @@ -295,7 +295,7 @@ private function validate_image( $image_object ) { * @param string $image_src Image src url. * @return bool */ - private function validate_image_src( $image_src ) { + private function validate_image_src( string $image_src ): bool { if ( empty( $image_src ) ) { return false; } diff --git a/package-lock.json b/package-lock.json index c1d49b6e54..68aebb1960 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,8 +12,7 @@ "isomorphic-fetch": "^3.0", "prop-types": "^15.6.2", "react": "^16.5.2", - "react-dom": "^16.5.2", - "wp-rocket-scripts": "^1.0.1" + "react-dom": "^16.5.2" }, "devDependencies": { "@babel/core": "^7.16.0", @@ -44,6 +43,7 @@ "watchify": "^4.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.9.1", + "wp-rocket-scripts": "^1.0.2-alpha", "yargs": "^17.3.0" } }, @@ -74,30 +74,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.8.tgz", - "integrity": "sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.8.tgz", - "integrity": "sha512-6AWcmZC/MZCO0yKys4uhg5NlxL0ESF3K6IAaoQ+xSXvPyPyxNWRafP+GDbI88Oh68O7QkJgmEtedWPM9U0pZNg==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", + "@babel/generator": "^7.24.9", "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", "@babel/helpers": "^7.24.8", "@babel/parser": "^7.24.8", "@babel/template": "^7.24.7", "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/types": "^7.24.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -131,12 +131,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.8.tgz", - "integrity": "sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.8", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -306,9 +306,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.8.tgz", - "integrity": "sha512-m4vWKVqvkVAWLXfHCCfff2luJj86U+J0/x+0N3ArG/tP0Fq7zky2dYwMbtPmkc/oulkkbjdL3uWzuoBwQ8R00Q==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -1867,9 +1867,9 @@ } }, "node_modules/@babel/types": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.8.tgz", - "integrity": "sha512-SkSBEHwwJRU52QEVZBmMBnE5Ux2/6WU1grdYyOhpbCNxbmJrDuDCphBzKZSO3taf0zztp+qkWlymE5tVL5l0TA==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -2203,9 +2203,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2241,9 +2241,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2745,18 +2745,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", @@ -4054,9 +4042,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001641", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", - "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", "dev": true, "funding": [ { @@ -4751,15 +4739,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.827", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz", - "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz", + "integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==", "dev": true }, "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "version": "6.5.6", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.6.tgz", + "integrity": "sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -5214,35 +5202,35 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", - "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -6670,9 +6658,9 @@ } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true }, "node_modules/import-fresh": { @@ -6692,9 +6680,9 @@ } }, "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -6923,9 +6911,9 @@ } }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "dependencies": { "hasown": "^2.0.2" @@ -7908,9 +7896,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-path": { @@ -8042,23 +8030,6 @@ "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -9460,6 +9431,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -9621,9 +9602,9 @@ } }, "node_modules/terser": { - "version": "5.31.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz", - "integrity": "sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==", + "version": "5.31.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -9924,9 +9905,9 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", + "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -10746,9 +10727,10 @@ } }, "node_modules/wp-rocket-scripts": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.1.tgz", - "integrity": "sha512-GZyqgCOo2fjMeNfuHDZ3B1ZH2UgeCoI8/Ts9vJbIXxuvSunF+lE+3tLhSfyDnM416KMa23u13S29i8eZ1CR82g==" + "version": "1.0.2-alpha", + "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.2-alpha.tgz", + "integrity": "sha512-LnP09lxaTDkXef1Wi6+1syqmFsGGk6V982uvliILBJwA8OeBY4zWHAOh/NFIiBcKOkiYYoA+u30Q2xuAF3nvsw==", + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -10892,27 +10874,27 @@ } }, "@babel/compat-data": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.8.tgz", - "integrity": "sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true }, "@babel/core": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.8.tgz", - "integrity": "sha512-6AWcmZC/MZCO0yKys4uhg5NlxL0ESF3K6IAaoQ+xSXvPyPyxNWRafP+GDbI88Oh68O7QkJgmEtedWPM9U0pZNg==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", + "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", + "@babel/generator": "^7.24.9", "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", "@babel/helpers": "^7.24.8", "@babel/parser": "^7.24.8", "@babel/template": "^7.24.7", "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/types": "^7.24.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -10932,12 +10914,12 @@ } }, "@babel/generator": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.8.tgz", - "integrity": "sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "requires": { - "@babel/types": "^7.24.8", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -11065,9 +11047,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.8.tgz", - "integrity": "sha512-m4vWKVqvkVAWLXfHCCfff2luJj86U+J0/x+0N3ArG/tP0Fq7zky2dYwMbtPmkc/oulkkbjdL3uWzuoBwQ8R00Q==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.24.7", @@ -12121,9 +12103,9 @@ } }, "@babel/types": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.8.tgz", - "integrity": "sha512-SkSBEHwwJRU52QEVZBmMBnE5Ux2/6WU1grdYyOhpbCNxbmJrDuDCphBzKZSO3taf0zztp+qkWlymE5tVL5l0TA==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.24.8", @@ -12375,9 +12357,9 @@ } }, "@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", "dev": true, "requires": { "@types/estree": "*", @@ -12413,9 +12395,9 @@ "dev": true }, "@types/node": { - "version": "20.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", - "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -12818,18 +12800,6 @@ "es-shim-unscopables": "^1.0.0" } }, - "array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", @@ -13986,9 +13956,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001641", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", - "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", "dev": true }, "chalk": { @@ -14557,15 +14527,15 @@ } }, "electron-to-chromium": { - "version": "1.4.827", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz", - "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz", + "integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==", "dev": true }, "elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "version": "6.5.6", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.6.tgz", + "integrity": "sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==", "dev": true, "requires": { "bn.js": "^4.11.9", @@ -15032,29 +15002,29 @@ } }, "eslint-plugin-react": { - "version": "7.34.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", - "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", "dev": true, "requires": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.hasown": "^1.1.4", "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "dependencies": { "doctrine": { @@ -16046,9 +16016,9 @@ "dev": true }, "immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true }, "import-fresh": { @@ -16062,9 +16032,9 @@ } }, "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -16232,9 +16202,9 @@ "dev": true }, "is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "requires": { "hasown": "^2.0.2" @@ -16966,9 +16936,9 @@ } }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-path": { @@ -17061,17 +17031,6 @@ "es-abstract": "^1.23.2" } }, - "object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -18151,6 +18110,16 @@ "side-channel": "^1.0.6" } }, + "string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -18270,9 +18239,9 @@ } }, "terser": { - "version": "5.31.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.2.tgz", - "integrity": "sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==", + "version": "5.31.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -18495,9 +18464,9 @@ "dev": true }, "uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", + "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", "dev": true }, "umd": { @@ -19117,9 +19086,10 @@ "dev": true }, "wp-rocket-scripts": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.1.tgz", - "integrity": "sha512-GZyqgCOo2fjMeNfuHDZ3B1ZH2UgeCoI8/Ts9vJbIXxuvSunF+lE+3tLhSfyDnM416KMa23u13S29i8eZ1CR82g==" + "version": "1.0.2-alpha", + "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.2-alpha.tgz", + "integrity": "sha512-LnP09lxaTDkXef1Wi6+1syqmFsGGk6V982uvliILBJwA8OeBY4zWHAOh/NFIiBcKOkiYYoA+u30Q2xuAF3nvsw==", + "dev": true }, "wrap-ansi": { "version": "7.0.0", diff --git a/package.json b/package.json index 074cbc60d6..d1eb595ced 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "watchify": "^4.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.9.1", - "wp-rocket-scripts": "^1.0.1", + "wp-rocket-scripts": "^1.0.2-alpha", "yargs": "^17.3.0" } } diff --git a/src/js/gulp/gulpconfig.js b/src/js/gulp/gulpconfig.js index c5c26937e8..a26a242e16 100644 --- a/src/js/gulp/gulpconfig.js +++ b/src/js/gulp/gulpconfig.js @@ -34,7 +34,7 @@ module.exports = { }, { - task: 'build:js:lcp', + task: 'build:js:beacon', method: 'buildLcpBeacon', }, diff --git a/src/js/gulp/tasks/js.js b/src/js/gulp/tasks/js.js index 45344a4b84..0d43613efe 100644 --- a/src/js/gulp/tasks/js.js +++ b/src/js/gulp/tasks/js.js @@ -55,7 +55,7 @@ class gulpJs { } buildLcpBeacon() { - return gulp.src(['./node_modules/wp-rocket-scripts/dist/lcp-beacon*']) + return gulp.src(['./node_modules/wp-rocket-scripts/dist/wpr-beacon*']) .pipe(gulp.dest('./assets/js')); } @@ -64,15 +64,14 @@ class gulpJs { () => this.buildAppUnmin(), () => this.buildAppMin(), () => this.buildLazyloadCssMin(), - () => this.buildLcpBeaconUnMin(), - () => this.buildLcpBeaconMin() + () => this.buildLcpBeacon() ); } watch() { gulp.watch('./src/js/global/*.js', gulp.series( 'build:js:app:unmin', 'build:js:app:min' )); gulp.watch( './src/js/custom/lazyload-css.js', gulp.series( 'build:js:lazyloadcss:min' ) ); - gulp.watch( './assets/js/lcp-beacon.js', gulp.series( 'build:js:lcp:min' ) ); + gulp.watch( './assets/js/wpr-beacon.js', gulp.series( 'build:js:lcp:min' ) ); } } diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php index 61a65ae4b2..3a3caf2c75 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php @@ -7,8 +7,8 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'post' => [ - 'rocket_lcp_nonce' => wp_create_nonce( 'rocket_lcp' ), - 'action' => 'rocket_check_lcp', + 'rocket_beacon_nonce' => wp_create_nonce( 'rocket_beacon' ), + 'action' => 'rocket_check_beacon', 'url' => 'http://example.org', 'is_mobile' => false, ], @@ -24,8 +24,8 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'post' => [ - 'rocket_lcp_nonce' => wp_create_nonce( 'rocket_lcp' ), - 'action' => 'rocket_check_lcp', + 'rocket_beacon_nonce' => wp_create_nonce( 'rocket_beacon' ), + 'action' => 'rocket_check_beacon', 'url' => 'http://example.org', 'is_mobile' => false, ], @@ -55,8 +55,8 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'post' => [ - 'rocket_lcp_nonce' => wp_create_nonce( 'rocket_lcp' ), - 'action' => 'rocket_check_lcp', + 'rocket_beacon_nonce' => wp_create_nonce( 'rocket_beacon' ), + 'action' => 'rocket_check_beacon', 'url' => 'http://example.org', 'is_mobile' => false, ], diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html index f7c5a8fc66..ddbf862a86 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html @@ -3,5 +3,5 @@ Test - + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php index b3d0eaf2dc..b23debf7e8 100644 --- a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php @@ -31,7 +31,7 @@ 'filter' => false, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( [] ), + 'lcp_images' => json_encode( [] ), ], 'expected' => [ 'images_valid_sources' => [], @@ -52,7 +52,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'type' => 'img', @@ -112,7 +112,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -190,7 +190,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => true, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -270,7 +270,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -351,7 +351,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -454,7 +454,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -563,7 +563,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( $long_array ), 'filetype' => [ @@ -610,7 +610,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => '', + 'lcp_images' => '', ], 'expected' => [ 'images_valid_sources' => [], @@ -640,7 +640,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -685,7 +685,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => '', + 'lcp_images' => '', 'status' => 'script_error', ], 'expected' => [ @@ -716,7 +716,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => '', + 'lcp_images' => '', 'status' => 'timeout', ], 'expected' => [ @@ -748,7 +748,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -800,7 +800,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -852,7 +852,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -904,7 +904,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -956,7 +956,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', @@ -1008,7 +1008,7 @@ 'filter' => true, 'url' => 'http://example.org', 'is_mobile' => false, - 'images' => json_encode( + 'lcp_images' => json_encode( [ (object) [ 'label' => 'lcp', diff --git a/tests/Fixtures/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php b/tests/Fixtures/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php index df47d5c52c..ea7ca34b84 100644 --- a/tests/Fixtures/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php +++ b/tests/Fixtures/inc/ThirdParty/Themes/Divi/Integration/disableImageDimensionsHeightPercentage.php @@ -11,7 +11,7 @@ ORIGINALHTML; -$nonce = wp_create_nonce( 'rocket_lcp' ); +$nonce = wp_create_nonce( 'rocket_beacon' ); $expected_html = << diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php index c2927dd5c1..c14020831c 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php @@ -17,7 +17,7 @@ public function set_up() { self::installAtfTable(); - $this->action = 'rocket_lcp'; + $this->action = 'rocket_beacon'; } /** @@ -37,8 +37,8 @@ public function tear_down() { * @dataProvider configTestData */ public function testShouldReturnExpected( $config, $expected ) { - $_POST['rocket_lcp_nonce'] = wp_create_nonce( 'rocket_lcp' ); - $_POST['action'] = 'rocket_lcp'; + $_POST['rocket_beacon_nonce'] = wp_create_nonce( 'rocket_beacon' ); + $_POST['action'] = 'rocket_beacon'; $_POST['url'] = $config['url']; $_POST['is_mobile'] = $config['is_mobile']; $_POST['images'] = $config['images']; diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php index 5244c7cac4..e66b937040 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php @@ -17,7 +17,7 @@ public function set_up() { self::installAtfTable(); - $this->action = 'rocket_check_lcp'; + $this->action = 'rocket_check_beacon'; } /** diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php index a850451ce2..b539e6a8e9 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php @@ -11,11 +11,11 @@ use Brain\Monkey\Filters; /** - * Test class covering WP_Rocket\Engine\Media\AboveTheFold\AJAX\Controller::add_lcp_data + * Test class covering WP_Rocket\Engine\Media\AboveTheFold\AJAX\Controller::add_data * * @group AboveTheFold */ -class Test_AddLcpData extends TestCase { +class Test_AddBeaconData extends TestCase { private $query; private $controller; private $context; @@ -50,13 +50,13 @@ public function testShouldReturnExpected( $config, $expected ) { $_POST = [ 'url' => addslashes( $config['url'] ), 'is_mobile' => addslashes( $config['is_mobile'] ), - 'images' => addslashes( $config['images'] ), + 'lcp_images' => addslashes( $config['lcp_images'] ), 'status' => addslashes( $config['status'] ?? 'success' ), ]; Functions\expect( 'check_ajax_referer' ) ->once() - ->with( 'rocket_lcp', 'rocket_lcp_nonce' ) + ->with( 'rocket_beacon', 'rocket_beacon_nonce' ) ->andReturn( true ); $this->context->shouldReceive( 'is_allowed' ) From 064e02ef63c46f8ed98af6c838a45c7790781273 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:57:11 +0100 Subject: [PATCH 018/192] Closes #6774: 3.17 - Refactor WarmUp (#6810) Co-authored-by: Opeyemi Ibrahim --- inc/Engine/Activation/Activation.php | 10 +-- .../Activation/Activation.php | 21 +++-- .../Activation/ServiceProvider.php | 89 +++++++++++++++++++ .../ActivationFactoryInterface.php | 15 ++++ .../PerformanceHints/ServiceProvider.php | 29 ++++++ .../PerformanceHints}/WarmUp/APIClient.php | 13 +-- .../PerformanceHints}/WarmUp/Controller.php | 58 ++++++------ .../PerformanceHints}/WarmUp/Queue.php | 6 +- .../PerformanceHints}/WarmUp/Subscriber.php | 6 +- .../Activation/ActivationFactory.php | 36 ++++++++ .../Activation/ServiceProvider.php | 75 ---------------- .../Media/AboveTheFold/ServiceProvider.php | 30 +------ inc/Plugin.php | 2 +- .../addWPRImageDimensionQueryArg.php | 4 +- .../WarmUp/Controller/fetchLinks.php | 0 .../WarmUp/Controller/sendToSass.php | 0 .../WarmUp/Subscriber/warmUp.php | 14 ++- .../WarmUp/Subscriber/warmUp.php | 54 +++++++++++ .../Admin/Controller/truncateAtfAdmin.php | 2 - .../AboveTheFold/WarmUp/Subscriber/warmUp.php | 71 --------------- .../addWPRImageDimensionQueryArg.php | 50 +++++++++++ .../WarmUp/Controller/fetchLinks.php | 15 ++-- .../WarmUp/Controller/sendToSass.php | 15 ++-- .../addWPRImageDimensionQueryArg.php | 56 ------------ 24 files changed, 353 insertions(+), 318 deletions(-) rename inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Activation/Activation.php (53%) create mode 100644 inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php create mode 100644 inc/Engine/Common/PerformanceHints/ActivationFactoryInterface.php rename inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/APIClient.php (67%) rename inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Controller.php (82%) rename inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Queue.php (79%) rename inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Subscriber.php (94%) create mode 100644 inc/Engine/Media/AboveTheFold/Activation/ActivationFactory.php delete mode 100644 inc/Engine/Media/AboveTheFold/Activation/ServiceProvider.php rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Controller/addWPRImageDimensionQueryArg.php (87%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Controller/fetchLinks.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Controller/sendToSass.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Subscriber/warmUp.php (72%) create mode 100644 tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php delete mode 100644 tests/Integration/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber/warmUp.php create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/addWPRImageDimensionQueryArg.php rename tests/Unit/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Controller/fetchLinks.php (76%) rename tests/Unit/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/WarmUp/Controller/sendToSass.php (66%) delete mode 100644 tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php diff --git a/inc/Engine/Activation/Activation.php b/inc/Engine/Activation/Activation.php index c60153ef48..f3b54bb5b3 100644 --- a/inc/Engine/Activation/Activation.php +++ b/inc/Engine/Activation/Activation.php @@ -4,11 +4,11 @@ use WP_Rocket\Admin\Options; use WP_Rocket\Dependencies\League\Container\Container; -use WP_Rocket\ServiceProvider\Options as OptionsServiceProvider; -use WP_Rocket\Engine\Preload\Activation\ServiceProvider as PreloadActivationServiceProvider; +use WP_Rocket\Engine\Common\PerformanceHints\Activation\ServiceProvider as PerformanceHintsActivationServiceProvider; use WP_Rocket\Engine\License\ServiceProvider as LicenseServiceProvider; +use WP_Rocket\Engine\Preload\Activation\ServiceProvider as PreloadActivationServiceProvider; use WP_Rocket\Logger\ServiceProvider as LoggerServiceProvider; -use WP_Rocket\Engine\Media\AboveTheFold\Activation\ServiceProvider as AboveTheFoldActivationServiceProvider; +use WP_Rocket\ServiceProvider\Options as OptionsServiceProvider; use WP_Rocket\ThirdParty\Hostings\HostResolver; use WP_Rocket\ThirdParty\Hostings\ServiceProvider as HostingsServiceProvider; @@ -29,7 +29,7 @@ class Activation { 'wp_cache', 'action_scheduler_check', 'preload_activation', - 'atf_activation', + 'performance_hints_activation', ]; /** @@ -50,7 +50,7 @@ public static function activate_plugin() { $container->addServiceProvider( new LicenseServiceProvider() ); $container->addServiceProvider( new LoggerServiceProvider() ); $container->get( 'logger' ); - $container->addServiceProvider( new AboveTheFoldActivationServiceProvider() ); + $container->addServiceProvider( new PerformanceHintsActivationServiceProvider() ); $host_type = HostResolver::get_host_service(); diff --git a/inc/Engine/Media/AboveTheFold/Activation/Activation.php b/inc/Engine/Common/PerformanceHints/Activation/Activation.php similarity index 53% rename from inc/Engine/Media/AboveTheFold/Activation/Activation.php rename to inc/Engine/Common/PerformanceHints/Activation/Activation.php index 5075a5be25..9dbb2d17dd 100644 --- a/inc/Engine/Media/AboveTheFold/Activation/Activation.php +++ b/inc/Engine/Common/PerformanceHints/Activation/Activation.php @@ -1,11 +1,10 @@ controller = $controller; - $this->context = $context; + $this->factories = $factories; } /** @@ -46,7 +45,7 @@ public function activate() { * @return void */ public function warm_up() { - if ( ! $this->context->is_allowed() ) { + if ( empty( $this->factories ) ) { return; } diff --git a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php new file mode 100644 index 0000000000..8a774d18d1 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php @@ -0,0 +1,89 @@ +provides, true ); + } + + /** + * Registers items with the container + * + * @return void + */ + public function register(): void { + + $this->getContainer()->add( 'atf_context', ATFContext::class ); + + $this->getContainer()->addShared( 'atf_activation_factory', ATFActivationFactory::class ) + ->addArguments( + [ + $this->getContainer()->get( 'atf_context' ), + ] + ); + + $factories = []; + + $atf_activation_factory = $this->getContainer()->get( 'atf_activation_factory' ); + + if ( $atf_activation_factory->get_context()->is_allowed() ) { + $factories[] = $atf_activation_factory; + } + + $this->getContainer()->add( 'performance_hints_warmup_apiclient', APIClient::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ); + + $this->getContainer()->add( 'performance_hints_warmup_queue', Queue::class ); + + $this->getContainer()->add( 'performance_hints_warmup_controller', WarmUpController::class ) + ->addArguments( + [ + $factories, + $this->getContainer()->get( 'options' ), + $this->getContainer()->get( 'performance_hints_warmup_apiclient' ), + $this->getContainer()->get( 'user' ), + $this->getContainer()->get( 'performance_hints_warmup_queue' ), + ] + ); + + $this->getContainer()->add( 'performance_hints_activation', Activation::class ) + ->addArguments( + [ + $this->getContainer()->get( 'performance_hints_warmup_controller' ), + $factories, + ] + ); + } +} diff --git a/inc/Engine/Common/PerformanceHints/ActivationFactoryInterface.php b/inc/Engine/Common/PerformanceHints/ActivationFactoryInterface.php new file mode 100644 index 0000000000..a6b1a077ea --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/ActivationFactoryInterface.php @@ -0,0 +1,15 @@ +getContainer()->get( 'frontend_processor' ), ] ); + + $this->getContainer()->add( 'performance_hints_warmup_apiclient', APIClient::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ); + + $this->getContainer()->add( 'performance_hints_warmup_queue', Queue::class ); + + $this->getContainer()->add( 'performance_hints_warmup_controller', WarmUpController::class ) + ->addArguments( + [ + $factories, + $this->getContainer()->get( 'options' ), + $this->getContainer()->get( 'performance_hints_warmup_apiclient' ), + $this->getContainer()->get( 'user' ), + $this->getContainer()->get( 'performance_hints_warmup_queue' ), + ] + ); + + $this->getContainer()->addShared( 'performance_hints_warmup_subscriber', WarmUpSubscriber::class ) + ->addArgument( $this->getContainer()->get( 'performance_hints_warmup_controller' ) ); } } diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php b/inc/Engine/Common/PerformanceHints/WarmUp/APIClient.php similarity index 67% rename from inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php rename to inc/Engine/Common/PerformanceHints/WarmUp/APIClient.php index 22814b11b6..7f9f3bf60b 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/APIClient.php @@ -1,7 +1,7 @@ 1, - ], - $url - ); - $config = [ 'optimization_list' => '', 'is_home' => $is_home, diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php similarity index 82% rename from inc/Engine/Media/AboveTheFold/WarmUp/Controller.php rename to inc/Engine/Common/PerformanceHints/WarmUp/Controller.php index 004ebe1cb1..775bfa202f 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php @@ -1,20 +1,19 @@ context = $context; + public function __construct( array $factories, Options_Data $options, APIClient $api_client, User $user, Queue $queue ) { + $this->factories = $factories; $this->options = $options; $this->api_client = $api_client; $this->user = $user; @@ -71,7 +70,7 @@ public function warm_up_home(): void { return; } - if ( ! $this->context->is_allowed() ) { + if ( empty( $this->factories ) ) { return; } @@ -93,7 +92,7 @@ public function warm_up(): void { return; } - if ( ! $this->context->is_allowed() ) { + if ( empty( $this->factories ) ) { return; } @@ -188,7 +187,12 @@ function ( $link ) use ( $home_url, $reject_uri_pattern ) { * * @param int $links_limit number of links to return. */ - $links_limit = apply_filters( 'rocket_atf_warmup_links_number', $default_limit ); + $links_limit = rocket_apply_filter_and_deprecated( + 'rocket_performance_hints_warmup_links_number', + [ $default_limit ], + '3.16', + 'rocket_atf_warmup_links_number' + ); if ( ! is_int( $links_limit ) || $links_limit < 1 ) { $links_limit = $default_limit; @@ -207,13 +211,22 @@ function ( $link ) use ( $home_url, $reject_uri_pattern ) { * @return void */ public function send_to_saas( string $url ) { - $this->api_client->add_to_atf_queue( $url ); + $this->api_client->add_to_performance_hints_queue( $url ); if ( $this->is_mobile() ) { - $this->api_client->add_to_atf_queue( $url, 'mobile' ); + $this->api_client->add_to_performance_hints_queue( $url, 'mobile' ); } } + /** + * Check if the mobile cache is set. + * + * @return bool + */ + private function is_mobile(): bool { + return $this->options->get( 'cache_mobile', 1 ) && $this->options->get( 'do_caching_mobile_files', 1 ); + } + /** * Add wpr_imagedimensions to URL query. * @@ -222,7 +235,7 @@ public function send_to_saas( string $url ) { * @return string */ public function add_wpr_imagedimensions_query_arg( string $url ): string { - if ( ! $this->context->is_allowed() ) { + if ( empty( $this->factories ) ) { return $url; } @@ -233,13 +246,4 @@ public function add_wpr_imagedimensions_query_arg( string $url ): string { $url ); } - - /** - * Check if the mobile cache is set. - * - * @return bool - */ - private function is_mobile(): bool { - return $this->options->get( 'cache_mobile', 1 ) && $this->options->get( 'do_caching_mobile_files', 1 ); - } } diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Queue.php b/inc/Engine/Common/PerformanceHints/WarmUp/Queue.php similarity index 79% rename from inc/Engine/Media/AboveTheFold/WarmUp/Queue.php rename to inc/Engine/Common/PerformanceHints/WarmUp/Queue.php index 237a8a469e..5562fec3e6 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/Queue.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Queue.php @@ -1,17 +1,17 @@ controller = $controller; @@ -31,9 +31,9 @@ public static function get_subscribed_events(): array { return [ 'wp_rocket_upgrade' => [ 'warm_up_on_update', 10, 2 ], 'rocket_after_clear_atf' => 'warm_up_home', - 'rocket_saas_api_queued_url' => 'add_wpr_imagedimensions_query_arg', 'rocket_job_warmup' => 'warm_up', 'rocket_job_warmup_url' => 'send_to_saas', + 'rocket_saas_api_queued_url' => 'add_wpr_imagedimensions_query_arg', ]; } diff --git a/inc/Engine/Media/AboveTheFold/Activation/ActivationFactory.php b/inc/Engine/Media/AboveTheFold/Activation/ActivationFactory.php new file mode 100644 index 0000000000..42e2572f11 --- /dev/null +++ b/inc/Engine/Media/AboveTheFold/Activation/ActivationFactory.php @@ -0,0 +1,36 @@ +context = $context; + } + + /** + * Provides a Context object. + * + * @return ContextInterface + */ + public function get_context(): ContextInterface { + return $this->context; + } +} diff --git a/inc/Engine/Media/AboveTheFold/Activation/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/Activation/ServiceProvider.php deleted file mode 100644 index f768ba2996..0000000000 --- a/inc/Engine/Media/AboveTheFold/Activation/ServiceProvider.php +++ /dev/null @@ -1,75 +0,0 @@ -provides, true ); - } - - /** - * Registers items with the container - * - * @return void - */ - public function register(): void { - $this->getContainer()->add( 'atf_context', Context::class ); - - $this->getContainer()->add( 'warmup_apiclient', APIClient::class ) - ->addArgument( $this->getContainer()->get( 'options' ) ); - - $this->getContainer()->add( 'warmup_queue', Queue::class ); - - $this->getContainer()->add( 'warmup_controller', WarmUpController::class ) - ->addArguments( - [ - $this->getContainer()->get( 'atf_context' ), - $this->getContainer()->get( 'options' ), - $this->getContainer()->get( 'warmup_apiclient' ), - $this->getContainer()->get( 'user' ), - $this->getContainer()->get( 'warmup_queue' ), - ] - ); - - $this->getContainer()->add( 'atf_activation', Activation::class ) - ->addArguments( - [ - $this->getContainer()->get( 'warmup_controller' ), - $this->getContainer()->get( 'atf_context' ), - ] - ); - } -} diff --git a/inc/Engine/Media/AboveTheFold/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/ServiceProvider.php index 3a2f78cdb6..d9261a5104 100644 --- a/inc/Engine/Media/AboveTheFold/ServiceProvider.php +++ b/inc/Engine/Media/AboveTheFold/ServiceProvider.php @@ -5,18 +5,12 @@ use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Media\AboveTheFold\Admin\{Controller as AdminController, Subscriber as AdminSubscriber}; -use WP_Rocket\Engine\Media\AboveTheFold\AJAX\{Controller as AJAXController, Subscriber as AJAXSubscriber}; +use WP_Rocket\Engine\Media\AboveTheFold\AJAX\Controller as AJAXController; use WP_Rocket\Engine\Media\AboveTheFold\Context\Context; use WP_Rocket\Engine\Media\AboveTheFold\Database\Tables\AboveTheFold as ATFTable; use WP_Rocket\Engine\Media\AboveTheFold\Database\Queries\AboveTheFold as ATFQuery; use WP_Rocket\Engine\Media\AboveTheFold\Frontend\{Controller as FrontController, Subscriber as FrontSubscriber}; use WP_Rocket\Engine\Media\AboveTheFold\Cron\{Controller as CronController, Subscriber as CronSubscriber}; -use WP_Rocket\Engine\Media\AboveTheFold\WarmUp\{ - APIClient, - Controller as WarmUpController, - Subscriber as WarmUpSubscriber, - Queue -}; class ServiceProvider extends AbstractServiceProvider { /** @@ -40,10 +34,6 @@ class ServiceProvider extends AbstractServiceProvider { 'atf_cron_subscriber', 'atf_ajax_controller', 'atf_ajax_subscriber', - 'warmup_controller', - 'warmup_subscriber', - 'warmup_apiclient', - 'warmup_queue', 'atf_factory', ]; @@ -101,24 +91,6 @@ public function register(): void { ] ); - $this->getContainer()->add( 'warmup_apiclient', APIClient::class ) - ->addArgument( $this->getContainer()->get( 'options' ) ); - - $this->getContainer()->add( 'warmup_queue', Queue::class ); - - $this->getContainer()->add( 'warmup_controller', WarmUpController::class ) - ->addArguments( - [ - $this->getContainer()->get( 'atf_context' ), - $this->getContainer()->get( 'options' ), - $this->getContainer()->get( 'warmup_apiclient' ), - $this->getContainer()->get( 'user' ), - $this->getContainer()->get( 'warmup_queue' ), - ] - ); - $this->getContainer()->addShared( 'warmup_subscriber', WarmUpSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'warmup_controller' ) ); - $this->getContainer()->addShared( 'atf_factory', Factory::class ) ->addArguments( [ diff --git a/inc/Plugin.php b/inc/Plugin.php index d7afdd093f..dd285c427f 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -394,9 +394,9 @@ private function init_common_subscribers() { 'rucss_cron_subscriber', 'atf_cron_subscriber', 'saas_admin_subscriber', - 'warmup_subscriber', 'performance_hints_ajax_subscriber', 'performance_hints_frontend_subscriber', + 'performance_hints_warmup_subscriber', ]; $host_type = HostResolver::get_host_service(); diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/addWPRImageDimensionQueryArg.php similarity index 87% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/addWPRImageDimensionQueryArg.php index 7722da99e4..4be03763c2 100644 --- a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/addWPRImageDimensionQueryArg.php @@ -3,14 +3,14 @@ return [ 'testShoulDoNothingWhenDisabled' => [ 'config' => [ - 'filter' => false, + 'filter' => [], 'url' => 'http://example.com' ], 'expected' => 'http://example.com', ], 'testShoulDoReturnArgument' => [ 'config' => [ - 'filter' => true, + 'filter' => [1], 'url' => 'http://example.com' ], 'expected' => 'http://example.com/?wpr_imagedimensions=1', diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/sendToSass.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/sendToSass.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber/warmUp.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php similarity index 72% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber/warmUp.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php index adbcf4ee34..892aaad7b6 100644 --- a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber/warmUp.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php @@ -4,7 +4,7 @@ 'config' => [ 'wp_env' => 'production', 'remove_unused_css' => 0, - 'is_allowed' => true, + 'is_allowed' => [1], 'links' => [ 'http://example.com/link1', 'http://example.com/link2', @@ -16,8 +16,10 @@ 'config' => [ 'wp_env' => 'local', 'remove_unused_css' => 0, - 'is_allowed' => true, + 'is_allowed' => [1], 'links' => [ + 'http://example.com/link1', + 'http://example.com/link2', ], ], 'expected' => 0, @@ -26,8 +28,10 @@ 'config' => [ 'wp_env' => 'production', 'remove_unused_css' => 1, - 'is_allowed' => true, + 'is_allowed' => [1], 'links' => [ + 'http://example.com/link1', + 'http://example.com/link2', ], ], 'expected' => 0, @@ -36,8 +40,10 @@ 'config' => [ 'wp_env' => 'production', 'remove_unused_css' => 0, - 'is_allowed' => false, + 'is_allowed' => [], 'links' => [ + 'http://example.com/link1', + 'http://example.com/link2', ], ], 'expected' => 0, diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php new file mode 100644 index 0000000000..f8ba9d85ab --- /dev/null +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php @@ -0,0 +1,54 @@ +makePartial(); + + $controller->shouldReceive('fetch_links') + ->andReturn($config['links']); + + Functions\expect( 'wp_get_environment_type' )->andReturn($config['wp_env']); + + if ( 'local' !== $config['wp_env'] ) { + $options->shouldReceive('get') + ->with('remove_unused_css', 0) + ->andReturn($config['remove_unused_css']); + } + + $queue->shouldReceive('add_job_warmup_url') + ->times($expected); + + + add_action('rocket_job_warmup', [$controller, 'warm_up']); + + do_action('rocket_job_warmup'); + + remove_action('rocket_job_warmup', [$controller, 'warm_up']); + } +} diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php b/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php index 434b813e2a..5461c94f3b 100644 --- a/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php +++ b/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php @@ -5,7 +5,6 @@ use WP_Rocket\Tests\Integration\TestCase; use Brain\Monkey\Functions; use Mockery; -use WP_Rocket\Engine\Media\AboveTheFold\WarmUp\Controller; /** * Test class covering \WP_Rocket\Engine\Media\AboveTheFold\Admin\Controller::truncate_atf_admin @@ -36,7 +35,6 @@ public static function tear_down_after_class() { public function testShouldDoAsExpected( $config, $expected ) { $this->config = $config; $container = apply_filters( 'rocket_container', null ); - $warm_up_controller = Mockery::mock( Controller::class ); foreach ( $this->config['rows'] as $row ) { self::addLcp( $row ); } diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber/warmUp.php b/tests/Integration/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber/warmUp.php deleted file mode 100644 index 0f13c44f4f..0000000000 --- a/tests/Integration/inc/Engine/Media/AboveTheFold/WarmUp/Subscriber/warmUp.php +++ /dev/null @@ -1,71 +0,0 @@ -config = $config; - $context = Mockery::mock(ContextInterface::class); - $options = Mockery::mock(Options_Data::class); - $api_client = Mockery::mock(APIClient::class); - $user = Mockery::mock(User::class); - $queue = Mockery::mock(Queue::class); - - $controller = Mockery::mock(Controller::class, [$context, $options, $api_client, $user, $queue])->makePartial(); - - $options->shouldReceive('get') - ->with('cache_mobile', 0) - ->andReturn(0); - - $context->shouldReceive('is_allowed') - ->andReturn($config['is_allowed']); - - $controller->shouldReceive('fetch_links') - ->andReturn($config['links']); - - - Functions\expect( 'wp_get_environment_type' )->once()->andReturn($config['wp_env']); - - if ( 'local' !== $config['wp_env'] ) { - $options->shouldReceive('get') - ->with('remove_unused_css', 0) - ->andReturn($config['remove_unused_css']); - } - - $queue->shouldReceive('add_job_warmup_url') - ->times($expected); - - $controller->warm_up(); - } -} diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/addWPRImageDimensionQueryArg.php b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/addWPRImageDimensionQueryArg.php new file mode 100644 index 0000000000..159b35ab0b --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/addWPRImageDimensionQueryArg.php @@ -0,0 +1,50 @@ +options = Mockery::mock( Options_Data::class ); + $this->api_client = Mockery::mock( APIClient::class ); + $this->user = Mockery::mock( User::class ); + $this->queue = Mockery::mock( Queue::class ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $this->controller = new Controller( $config['filter'], $this->options, $this->api_client, $this->user, $this->queue ); + + Functions\expect( 'add_query_arg' ) + ->with( + [ 'wpr_imagedimensions' => 1 ] + ) + ->andReturn( $expected ); + + $this->assertSame( + $expected, + $this->controller->add_wpr_imagedimensions_query_arg( $config['url'] ) + ); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php similarity index 76% rename from tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php rename to tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php index 7a0d86a4c2..b8786206b6 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/fetchLinks.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php @@ -1,20 +1,18 @@ user = Mockery::mock( User::class ); $this->queue = Mockery::mock( Queue::class ); - $this->controller = new Controller( $context, $options, $api_client, $this->user, $this->queue ); + $this->controller = new Controller( [1], $options, $api_client, $this->user, $this->queue ); } /** @@ -74,7 +71,7 @@ function ( $link ) { } ); - Filters\expectApplied( 'rocket_atf_warmup_links_number' ) + Filters\expectApplied( 'rocket_performance_hints_warmup_links_number' ) ->once() ->with( 10 ); } diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/sendToSass.php similarity index 66% rename from tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php rename to tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/sendToSass.php index 5f4bbfdd02..ba8d8c92dd 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/sendToSass.php @@ -1,13 +1,10 @@ context = Mockery::mock( ContextInterface::class ); $this->options = Mockery::mock( Options_Data::class ); $this->api_client = Mockery::mock( APIClient::class ); $this->user = Mockery::mock( User::class ); $this->queue = Mockery::mock( Queue::class ); - $this->controller = new Controller( $this->context, $this->options, $this->api_client, $this->user, $this->queue ); + $this->controller = new Controller( [1], $this->options, $this->api_client, $this->user, $this->queue ); } /** @@ -46,13 +41,13 @@ public function testShouldReturnExpected( $config, $expected ) { ->with( 'do_caching_mobile_files', 1 ) ->andReturn( $mobile_cache ); - $this->api_client->shouldReceive('add_to_atf_queue') + $this->api_client->shouldReceive('add_to_performance_hints_queue') ->with('http://example.com') ->once() ->andReturn([$config['url'], []]); if('mobile' === $config['device']) { - $this->api_client->shouldReceive('add_to_atf_queue') + $this->api_client->shouldReceive('add_to_performance_hints_queue') ->with( 'http://example.com', $config['device'] ) ->once() ->andReturn( [$config['url'], []] ); diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php b/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php deleted file mode 100644 index f60848f859..0000000000 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/addWPRImageDimensionQueryArg.php +++ /dev/null @@ -1,56 +0,0 @@ -context = Mockery::mock( ContextInterface::class ); - $options = Mockery::mock( Options_Data::class ); - $api_client = Mockery::mock( APIClient::class ); - $this->user = Mockery::mock( User::class ); - $this->queue = Mockery::mock( Queue::class ); - $this->controller = new Controller( $this->context, $options, $api_client, $this->user, $this->queue ); - } - - /** - * @dataProvider configTestData - */ - public function testShouldReturnExpected( $config, $expected ) { - $this->context->shouldReceive( 'is_allowed' ) - ->atMost() - ->once() - ->andReturn( $config['filter'] ); - - Functions\expect( 'add_query_arg' ) - ->with( - [ 'wpr_imagedimensions' => 1 ] - ) - ->andReturn( $expected ); - - $this->assertSame( - $expected, - $this->controller->add_wpr_imagedimensions_query_arg( $config['url'] ) - ); - } -} From 95a8cd9b2637794b7d82d0f3029eb1ad7968f5ec Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 25 Jul 2024 19:09:48 +0100 Subject: [PATCH 019/192] Updated interface --- .../Database/QueriesInterface.php | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php b/inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php index c33fcbda14..d921458bc5 100644 --- a/inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php +++ b/inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php @@ -3,24 +3,9 @@ /** * The Queries interface defines the contract for database query operations. */ -namespace WP_Rocket\Engine\Common\PerformanceHints\Database; +namespace WP_Rocket\Engine\Common\PerformanceHints\Database\Query; interface QueriesInterface { - - /** - * Marks a job as completed. - * - * This method is used to mark a job as completed in the database. It takes in the URL of the job, - * a boolean indicating whether the job is for a mobile device, and an array of data related to the job. - * - * @param string $url The URL of the job to be marked as completed. - * @param boolean $is_mobile A boolean indicating whether the job is for a mobile device. - * @param array $data An array of data related to the job. This typically includes LCP and Above the fold data. - * - * @return boolean|int Returns a boolean or integer value. The exact return value depends on the implementation. - */ - public function make_job_completed( string $url, bool $is_mobile, array $data ); - /** * Deletes old rows from the database. * From b23a7510b6b3ead5aaddf4cf2ddb9aa97639db4b Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 25 Jul 2024 20:36:28 +0100 Subject: [PATCH 020/192] Updated concrete factory --- .../{ => Queries}/QueriesInterface.php | 0 .../Database/{ => Table}/TableInterface.php | 0 inc/Engine/Media/AboveTheFold/Factory.php | 34 ++++++++++++++++--- .../Media/AboveTheFold/ServiceProvider.php | 2 ++ 4 files changed, 31 insertions(+), 5 deletions(-) rename inc/Engine/Common/PerformanceHints/Database/{ => Queries}/QueriesInterface.php (100%) rename inc/Engine/Common/PerformanceHints/Database/{ => Table}/TableInterface.php (100%) diff --git a/inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php b/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php similarity index 100% rename from inc/Engine/Common/PerformanceHints/Database/QueriesInterface.php rename to inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php diff --git a/inc/Engine/Common/PerformanceHints/Database/TableInterface.php b/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php similarity index 100% rename from inc/Engine/Common/PerformanceHints/Database/TableInterface.php rename to inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php diff --git a/inc/Engine/Media/AboveTheFold/Factory.php b/inc/Engine/Media/AboveTheFold/Factory.php index c81f053bb1..85599012b0 100644 --- a/inc/Engine/Media/AboveTheFold/Factory.php +++ b/inc/Engine/Media/AboveTheFold/Factory.php @@ -7,6 +7,8 @@ use WP_Rocket\Engine\Common\PerformanceHints\FactoryInterface; use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface; use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface as FrontendControllerInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Table\TableInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries\QueriesInterface; use WP_Rocket\Engine\Common\Context\ContextInterface; class Factory implements FactoryInterface { @@ -25,6 +27,20 @@ class Factory implements FactoryInterface { */ protected $frontend_controller; + /** + * Table instance. + * + * @var TableInterface + */ + protected $table; + + /** + * Queries instance. + * + * @var QueriesInterface + */ + protected $queries; + /** * Context instance. * @@ -37,11 +53,15 @@ class Factory implements FactoryInterface { * * @param AjaxControllerInterface $ajax_controller ATF AJAX Controller instance. * @param FrontendControllerInterface $frontend_controller ATF Frontend Controller instance. + * @param TableInterface $table ATF Table instance. + * @param QueriesInterface $queries ATF Queries instance. * @param ContextInterface $context ATF Context instance. */ - public function __construct( AjaxControllerInterface $ajax_controller, FrontendControllerInterface $frontend_controller, ContextInterface $context ) { + public function __construct( AjaxControllerInterface $ajax_controller, FrontendControllerInterface $frontend_controller, TableInterface $table, QueriesInterface $queries, ContextInterface $context ) { $this->ajax_controller = $ajax_controller; $this->frontend_controller = $frontend_controller; + $this->table = $table; + $this->queries = $queries; $this->context = $context; } @@ -65,16 +85,20 @@ public function get_frontend_controller(): FrontendControllerInterface { /** * Provides a Table object. + * + * @return TableInterface */ - public function table() { - // Return Table object. + public function table(): TableInterface { + return $this->table; } /** * Provides a Queries object. + * + * @return QueriesInterface */ - public function queries() { - // Return Queries object. + public function queries(): QueriesInterface { + return $this->queries; } /** diff --git a/inc/Engine/Media/AboveTheFold/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/ServiceProvider.php index d9261a5104..0f55b0b3ea 100644 --- a/inc/Engine/Media/AboveTheFold/ServiceProvider.php +++ b/inc/Engine/Media/AboveTheFold/ServiceProvider.php @@ -96,6 +96,8 @@ public function register(): void { [ $this->getContainer()->get( 'atf_ajax_controller' ), $this->getContainer()->get( 'atf_controller' ), + $this->getContainer()->get( 'atf_table' ), + $this->getContainer()->get( 'atf_query' ), $this->getContainer()->get( 'atf_context' ), ] ); From 348c005b4912f5ac8e321e5f56082472eb25e4eb Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 25 Jul 2024 20:37:06 +0100 Subject: [PATCH 021/192] Updated database concrete products --- .../Database/Queries/AboveTheFold.php | 34 ++----------------- .../Database/Tables/AboveTheFold.php | 18 ++-------- 2 files changed, 5 insertions(+), 47 deletions(-) diff --git a/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php index 3d7f5bd0e5..ac95dd1a4b 100644 --- a/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php +++ b/inc/Engine/Media/AboveTheFold/Database/Queries/AboveTheFold.php @@ -3,13 +3,13 @@ namespace WP_Rocket\Engine\Media\AboveTheFold\Database\Queries; -use WP_Rocket\Engine\Common\Database\Queries\AbstractQuery; -use WP_Rocket\Engine\Common\PerformanceHints\Database\QueriesInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries\AbstractQueries; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries\QueriesInterface; use WP_Rocket\Engine\Media\AboveTheFold\Database\Schemas\AboveTheFold as AboveTheFoldSchema; use WP_Rocket\Engine\Media\AboveTheFold\Database\Rows\AboveTheFold as AboveTheFoldRow; -class AboveTheFold extends AbstractQuery implements QueriesInterface { +class AboveTheFold extends AbstractQueries implements QueriesInterface { /** * Name of the database table to query. @@ -78,34 +78,6 @@ class AboveTheFold extends AbstractQuery implements QueriesInterface { * * @return boolean|int */ - public function make_job_completed( string $url, bool $is_mobile, array $data ) { - if ( ! self::$table_exists && ! $this->table_exists() ) { - return false; - } - - // Get the database interface. - $db = $this->get_db(); - - // Bail if no database interface is available. - if ( ! $db ) { - return false; - } - - $prefixed_table_name = $db->prefix . $this->table_name; - - $data = [ - 'status' => 'completed', - 'lcp' => $data['lcp'], - 'viewport' => $data['viewport'], - ]; - - $where = [ - 'url' => untrailingslashit( $url ), - 'is_mobile' => $is_mobile, - ]; - - return $db->update( $prefixed_table_name, $data, $where ); - } /** * Delete all rows which were not accessed in the last month. diff --git a/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php index 25421073dc..99f6f27132 100644 --- a/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php +++ b/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php @@ -3,10 +3,9 @@ namespace WP_Rocket\Engine\Media\AboveTheFold\Database\Tables; -use WP_Rocket\Engine\Common\Database\Tables\AbstractTable; -use WP_Rocket\Engine\Common\PerformanceHints\Database\TableInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Table\AbstractTable; -class AboveTheFold extends AbstractTable implements TableInterface { +class AboveTheFold extends AbstractTable { /** * Table name * @@ -57,19 +56,6 @@ class AboveTheFold extends AbstractTable implements TableInterface { KEY last_accessed (last_accessed), INDEX `status_index` (`status`(191))"; - /** - * Truncate DB table. - * - * @return bool - */ - public function truncate_table(): bool { - if ( ! $this->exists() ) { - return false; - } - - return $this->truncate(); - } - /** * This function is responsible for deleting old columns from the 'wpr_above_the_fold' table. * The columns to be deleted are: 'error_code', 'retries', 'job_id', 'queue_name', 'submitted_at', 'next_retry_time'. From f66c6ee25d43e741504786106d5e00563c9aee60 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 25 Jul 2024 20:38:13 +0100 Subject: [PATCH 022/192] Updated abstract database modules --- .../Database/Queries/AbstractQueries.php | 138 ++++++++++++++++++ .../Database/Queries/QueriesInterface.php | 2 +- .../Database/Table/AbstractTable.php | 93 ++++++++++++ .../Database/Table/TableInterface.php | 9 +- 4 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php create mode 100644 inc/Engine/Common/PerformanceHints/Database/Table/AbstractTable.php diff --git a/inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php b/inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php new file mode 100644 index 0000000000..2ed2a92b90 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php @@ -0,0 +1,138 @@ +table_exists() ) { + return false; + } + + $query = $this->query( + [ + 'url' => untrailingslashit( $url ), + 'is_mobile' => $is_mobile, + ] + ); + + if ( empty( $query[0] ) ) { + return false; + } + + return $query[0]; + } + + /** + * Delete DB row by url. + * + * @param string $url Page url to be deleted. + * + * @return bool + */ + public function delete_by_url( string $url ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $items = $this->get_rows_by_url( $url ); + + if ( ! $items ) { + return false; + } + + $deleted = true; + foreach ( $items as $item ) { + $deleted = $deleted && $this->delete_item( $item->id ); + } + + return $deleted; + } + + /** + * Get the count of not completed rows. + * + * @return int + */ + public function get_not_completed_count() { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return 0; + } + + return $this->query( + [ + 'count' => true, + 'status__in' => [ 'pending', 'in-progress' ], + ] + ); + } + + /** + * Get the count of completed rows. + * + * @return int + */ + public function get_completed_count() { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return 0; + } + + return $this->query( + [ + 'count' => true, + 'status' => 'completed', + ] + ); + } + + /** + * Returns the current status of the table; true if it exists, false otherwise. + * + * @return boolean + */ + protected function table_exists(): bool { + if ( self::$table_exists ) { + return true; + } + + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( ! $db ) { + return false; + } + + // Query statement. + $query = 'SHOW TABLES LIKE %s'; + $like = $db->esc_like( $db->{$this->table_name} ); + $prepared = $db->prepare( $query, $like ); + $result = $db->get_var( $prepared ); + + // Does the table exist? + $exists = $this->is_success( $result ); + + if ( $exists ) { + self::$table_exists = $exists; + } + + return $exists; + } +} diff --git a/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php b/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php index d921458bc5..9af48990bc 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php +++ b/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php @@ -3,7 +3,7 @@ /** * The Queries interface defines the contract for database query operations. */ -namespace WP_Rocket\Engine\Common\PerformanceHints\Database\Query; +namespace WP_Rocket\Engine\Common\PerformanceHints\Database\Queries; interface QueriesInterface { /** diff --git a/inc/Engine/Common/PerformanceHints/Database/Table/AbstractTable.php b/inc/Engine/Common/PerformanceHints/Database/Table/AbstractTable.php new file mode 100644 index 0000000000..a244f30b98 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Database/Table/AbstractTable.php @@ -0,0 +1,93 @@ +schema_data ) { + return; + } + + $this->schema = $this->schema_data; + } + + /** + * Remove all completed rows. + * + * @return bool|int + */ + public function remove_all_completed_rows() { + if ( ! $this->exists() ) { + return false; + } + // Get the database interface. + $db = $this->get_db(); + + // Bail if no database interface is available. + if ( ! $db ) { + return false; + } + + $prefixed_table_name = $this->apply_prefix( $this->table_name ); + return $db->query( "DELETE FROM `$prefixed_table_name` WHERE status IN ( 'failed', 'completed' )" ); + } + + /** + * Truncate DB table. + * + * @return bool + */ + public function truncate_table(): bool { + if ( ! $this->exists() ) { + return false; + } + + return $this->truncate(); + } + + /** + * Returns name from table. + * + * @return string + */ + public function get_name() { + return $this->apply_prefix( $this->table_name ); + } + + /** + * Trigger recreation of cache table if not exist. + * + * @return void + */ + public function maybe_trigger_recreate_table() { + if ( $this->exists() ) { + return; + } + + delete_option( $this->db_version_key ); + } +} diff --git a/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php b/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php index 57cc07cd38..aaf90c38bd 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php +++ b/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php @@ -3,7 +3,7 @@ /** * The Table interface defines the contract for database table operations. */ -namespace WP_Rocket\Engine\Common\PerformanceHints\Database; +namespace WP_Rocket\Engine\Common\PerformanceHints\Database\Table; interface TableInterface { @@ -15,4 +15,11 @@ interface TableInterface { * @return bool Returns a boolean value indicating the success or failure of the operation. */ public function truncate_table(): bool; + + /** + * Remove all completed rows. + * + * @return bool|int + */ + public function remove_all_completed_rows(); } From b5df8a7750891a50a978cb7aa3121592634334ed Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 25 Jul 2024 20:39:19 +0100 Subject: [PATCH 023/192] Updated processor to use factories instead of atf query --- .../PerformanceHints/Frontend/Processor.php | 51 +++++-------------- .../PerformanceHints/ServiceProvider.php | 1 - 2 files changed, 12 insertions(+), 40 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index c8ea64940d..4f4f1820bd 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -4,7 +4,6 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\Frontend; use WP_Rocket\Admin\Options_Data; -use WP_Rocket\Engine\Media\AboveTheFold\Database\Queries\AboveTheFold as ATFQuery; use WP_Filesystem_Direct; class Processor { @@ -23,16 +22,6 @@ class Processor { */ private $options; - /** - * This property would no longer be needed once the database products(table, queries) are returned in the concrete factory. - * Right now we try to keep things Black Box as much as we can. - * - * Queries instance - * - * @var ATFQuery - */ - private $query; - /** * WordPress filesystem. * @@ -45,13 +34,11 @@ class Processor { * * @param array $factories Array of factories. * @param Options_Data $options Options instance. - * @param ATFQuery $query Queries instance.( Should removed when the database products are returned in the concrete factory ). * @param WP_Filesystem_Direct|null $filesystem WordPress filesystem. */ - public function __construct( array $factories, Options_Data $options, ATFQuery $query, WP_Filesystem_Direct $filesystem = null ) { + public function __construct( array $factories, Options_Data $options, WP_Filesystem_Direct $filesystem = null ) { $this->factories = $factories; $this->options = $options; - $this->query = $query; // Should removed when the database products are returned in the concrete factory. $this->filesystem = $filesystem ?: rocket_direct_filesystem(); } @@ -71,29 +58,15 @@ public function maybe_apply_optimizations( string $html ): string { $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); $is_mobile = $this->is_mobile(); - $row = $this->query->get_row( $url, $is_mobile ); - if ( empty( $row ) ) { - return $this->inject_beacon( $html, $url, $is_mobile ); - } - - // The DB row check above will need to be updated during the database refactor to something below. - - // phpcs:disable Squiz.Commenting.InlineComment.InvalidEndChar - // $html_optimized = null; - // foreach ( $this->factories as $factory ) { - // $row = $factory->queries()->get_row( $url, $is_mobile ); - // if ( empty( $row ) ) { - // return $this->inject_beacon( $html, $url, $is_mobile ); - // } - - // $html = $html_optimized ?? $html; - // $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); - // } - - // phpcs:enable Squiz.Commenting.InlineComment.InvalidEndChar + $html_optimized = null; foreach ( $this->factories as $factory ) { - $html = $html_optimized ?? $html; - $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); + $row = $factory->queries()->get_row( $url, $is_mobile ); + if ( empty( $row ) ) { + return $this->inject_beacon( $html, $url, $is_mobile ); + } + + $html = $html_optimized ?? $html; + $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); } return $html_optimized; @@ -192,13 +165,13 @@ private function inject_beacon( $html, $url, $is_mobile ): string { $data_modified = $factory->get_frontend_controller()->target_elements( $data ); } - $inline_script = ''; + $inline_script = ''; // Get the URL of the script. - $script_url = rocket_get_constant( 'WP_ROCKET_ASSETS_JS_URL' ) . 'lcp-beacon' . $min . '.js'; + $script_url = rocket_get_constant( 'WP_ROCKET_ASSETS_JS_URL' ) . 'wpr-beacon' . $min . '.js'; // Create the script tag. - $script_tag = ""; // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + $script_tag = ""; // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript // Append the script tag just before the closing body tag. return str_replace( '', $inline_script . $script_tag . '', $html ); diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 20f3b79370..8c69b4940f 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -72,7 +72,6 @@ public function register(): void { [ $factories, $this->getContainer()->get( 'options' ), - $this->getContainer()->get( 'atf_query' ), ] ); From c6de3a3bade021871faf57f288ce844eb7691699 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 25 Jul 2024 20:39:37 +0100 Subject: [PATCH 024/192] Updated abstract factory --- inc/Engine/Common/PerformanceHints/FactoryInterface.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/FactoryInterface.php b/inc/Engine/Common/PerformanceHints/FactoryInterface.php index 48037bd88f..a7cf08273c 100644 --- a/inc/Engine/Common/PerformanceHints/FactoryInterface.php +++ b/inc/Engine/Common/PerformanceHints/FactoryInterface.php @@ -6,8 +6,8 @@ use WP_Rocket\Engine\Common\PerformanceHints\AJAX\ControllerInterface as AjaxControllerInterface; use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface as FrontendControllerInterface; use WP_Rocket\Engine\Common\Context\ContextInterface; -use WP_Rocket\Engine\Common\PerformanceHints\Database\QueriesInterface; -use WP_Rocket\Engine\Common\PerformanceHints\Database\TableInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Queries\QueriesInterface; +use WP_Rocket\Engine\Common\PerformanceHints\Database\Table\TableInterface; interface FactoryInterface { /** From 463c1577acc03f326ae6ede5f515218851be4454 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Fri, 26 Jul 2024 10:42:07 +0200 Subject: [PATCH 025/192] Add `get_rows_by_url` as it's missing from abstract class --- .../Database/Queries/AbstractQueries.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php b/inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php index 2ed2a92b90..6d9b5f8c12 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php +++ b/inc/Engine/Common/PerformanceHints/Database/Queries/AbstractQueries.php @@ -135,4 +135,29 @@ protected function table_exists(): bool { return $exists; } + + /** + * Get all rows with the same url (desktop and mobile versions). + * + * @param string $url Page url. + * + * @return array|false + */ + public function get_rows_by_url( string $url ) { + if ( ! self::$table_exists && ! $this->table_exists() ) { + return false; + } + + $query = $this->query( + [ + 'url' => untrailingslashit( $url ), + ] + ); + + if ( empty( $query ) ) { + return false; + } + + return $query; + } } From 383a264c9260edd380d5bbc01cf08bcf9d39631a Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Fri, 26 Jul 2024 10:54:31 +0200 Subject: [PATCH 026/192] Fix nonce name --- inc/Engine/Common/PerformanceHints/Frontend/Processor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index 4f4f1820bd..8098539078 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -150,7 +150,7 @@ private function inject_beacon( $html, $url, $is_mobile ): string { $data = [ 'ajax_url' => admin_url( 'admin-ajax.php' ), - 'nonce' => wp_create_nonce( 'rocket_lcp' ), + 'nonce' => wp_create_nonce( 'rocket_beacon' ), 'url' => $url, 'is_mobile' => $is_mobile, 'width_threshold' => $width_threshold, From 0c99b0c05578d3f3994517585f1653b217c4555a Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Fri, 26 Jul 2024 10:56:24 +0200 Subject: [PATCH 027/192] apply linter --- .../Database/Queries/QueriesInterface.php | 2 +- .../Database/Table/AbstractTable.php | 2 +- .../Database/Table/TableInterface.php | 2 +- .../PerformanceHints/Frontend/Processor.php | 12 +++++------ inc/Engine/Media/AboveTheFold/Factory.php | 20 +++++++++---------- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php b/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php index 9af48990bc..dd362f1b52 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php +++ b/inc/Engine/Common/PerformanceHints/Database/Queries/QueriesInterface.php @@ -1,8 +1,8 @@ query( "DELETE FROM `$prefixed_table_name` WHERE status IN ( 'failed', 'completed' )" ); } - /** + /** * Truncate DB table. * * @return bool diff --git a/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php b/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php index aaf90c38bd..44c6252733 100644 --- a/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php +++ b/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php @@ -1,8 +1,8 @@ factories as $factory ) { - $row = $factory->queries()->get_row( $url, $is_mobile ); - if ( empty( $row ) ) { - return $this->inject_beacon( $html, $url, $is_mobile ); - } + $row = $factory->queries()->get_row( $url, $is_mobile ); + if ( empty( $row ) ) { + return $this->inject_beacon( $html, $url, $is_mobile ); + } - $html = $html_optimized ?? $html; - $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); + $html = $html_optimized ?? $html; + $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); } return $html_optimized; diff --git a/inc/Engine/Media/AboveTheFold/Factory.php b/inc/Engine/Media/AboveTheFold/Factory.php index 85599012b0..8121410c17 100644 --- a/inc/Engine/Media/AboveTheFold/Factory.php +++ b/inc/Engine/Media/AboveTheFold/Factory.php @@ -27,14 +27,14 @@ class Factory implements FactoryInterface { */ protected $frontend_controller; - /** + /** * Table instance. * * @var TableInterface */ protected $table; - /** + /** * Queries instance. * * @var QueriesInterface @@ -53,15 +53,15 @@ class Factory implements FactoryInterface { * * @param AjaxControllerInterface $ajax_controller ATF AJAX Controller instance. * @param FrontendControllerInterface $frontend_controller ATF Frontend Controller instance. - * @param TableInterface $table ATF Table instance. - * @param QueriesInterface $queries ATF Queries instance. + * @param TableInterface $table ATF Table instance. + * @param QueriesInterface $queries ATF Queries instance. * @param ContextInterface $context ATF Context instance. */ public function __construct( AjaxControllerInterface $ajax_controller, FrontendControllerInterface $frontend_controller, TableInterface $table, QueriesInterface $queries, ContextInterface $context ) { $this->ajax_controller = $ajax_controller; $this->frontend_controller = $frontend_controller; - $this->table = $table; - $this->queries = $queries; + $this->table = $table; + $this->queries = $queries; $this->context = $context; } @@ -85,8 +85,8 @@ public function get_frontend_controller(): FrontendControllerInterface { /** * Provides a Table object. - * - * @return TableInterface + * + * @return TableInterface */ public function table(): TableInterface { return $this->table; @@ -94,8 +94,8 @@ public function table(): TableInterface { /** * Provides a Queries object. - * - * @return QueriesInterface + * + * @return QueriesInterface */ public function queries(): QueriesInterface { return $this->queries; From 3ea850be91c4929945f1878b0070a2f944be1b82 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 26 Jul 2024 13:22:31 +0100 Subject: [PATCH 028/192] Fixed unreasonable failing test for RUCSS --- .../JobManager/Cron/Subscriber/checkJobStatus.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/checkJobStatus.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/checkJobStatus.php index e990c5c918..e3087becfc 100644 --- a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/checkJobStatus.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/checkJobStatus.php @@ -14,10 +14,22 @@ class Test_CheckJobStatus extends FilesystemTestCase { protected $config; + public static function set_up_before_class() { + parent::set_up_before_class(); + + // Install in set_up_before_class because of exists() requiring not temporary table. + self::installUsedCssTable(); + } + + public static function tear_down_after_class() { + self::uninstallUsedCssTable(); + + parent::tear_down_after_class(); + } + public function set_up() { parent::set_up(); - self::installUsedCssTable(); self::installPreloadCacheTable(); add_filter( 'pre_http_request', [ $this, 'mock_http' ], 10, 3 ); @@ -25,7 +37,6 @@ public function set_up() { } public function tear_down() { - self::uninstallUsedCssTable(); self::uninstallPreloadCacheTable(); remove_filter( 'rocket_rucss_hash', [ $this, 'rucss_hash' ] ); From b87f0fb66dc3a00bb9c193529cc3ccd7edaeee19 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 26 Jul 2024 13:30:48 +0100 Subject: [PATCH 029/192] Updated test --- .../Frontend/Subscriber/HTML/output_w_beacon.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html index ddbf862a86..fa81bea27b 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html @@ -3,5 +3,5 @@ Test - + From 6efc8cccc8be49d53ff7d5cc28fc3e5212338af9 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 26 Jul 2024 14:07:07 +0100 Subject: [PATCH 030/192] Closes #6781: 3.17 - Refactor Cron (#6797) Co-authored-by: Michael Lee --- .../PerformanceHints}/Cron/Controller.php | 28 ++++--- .../PerformanceHints/Cron/Subscriber.php | 66 ++++++++++++++++ .../PerformanceHints/ServiceProvider.php | 16 ++++ .../Media/AboveTheFold/Cron/Subscriber.php | 70 ----------------- .../Media/AboveTheFold/ServiceProvider.php | 8 -- inc/Plugin.php | 2 +- .../Cron/Controller/scheduleCleanup.php | 16 ++++ .../Cron/Subscriber/cleanup.php | 75 +++++++++++++++++++ .../Cron/Controller/scheduleCleanup.php | 42 +++++++++++ .../Cron/Subscriber/cleanup.php} | 12 +-- 10 files changed, 235 insertions(+), 100 deletions(-) rename inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Cron/Controller.php (52%) create mode 100644 inc/Engine/Common/PerformanceHints/Cron/Subscriber.php delete mode 100644 inc/Engine/Media/AboveTheFold/Cron/Subscriber.php create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php create mode 100644 tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php rename tests/Integration/inc/Engine/{Media/AboveTheFold/Cron/Subscriber/atfCleanup.php => Common/PerformanceHints/Cron/Subscriber/cleanup.php} (79%) diff --git a/inc/Engine/Media/AboveTheFold/Cron/Controller.php b/inc/Engine/Common/PerformanceHints/Cron/Controller.php similarity index 52% rename from inc/Engine/Media/AboveTheFold/Cron/Controller.php rename to inc/Engine/Common/PerformanceHints/Cron/Controller.php index 982b6567e4..f7bfd47380 100644 --- a/inc/Engine/Media/AboveTheFold/Cron/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Cron/Controller.php @@ -1,17 +1,16 @@ query->delete_old_rows(); } /** - * Unschedules the 'above the fold' cleanup, preventing it from running at the previously scheduled time. + * Unscheduled the performance hints cleanup, preventing it from running at the previously scheduled time. */ - public function unschedule_atf_cleanup() { - $timestamp = wp_next_scheduled( 'rocket_atf_cleanup' ); + public function unscheduled_cleanup() { + $timestamp = wp_next_scheduled( 'rocket_performance_hints_cleanup' ); if ( $timestamp ) { - wp_unschedule_event( $timestamp, 'rocket_atf_cleanup' ); + wp_unschedule_event( $timestamp, 'rocket_performance_hints_cleanup' ); } } } diff --git a/inc/Engine/Common/PerformanceHints/Cron/Subscriber.php b/inc/Engine/Common/PerformanceHints/Cron/Subscriber.php new file mode 100644 index 0000000000..a3826605fb --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Cron/Subscriber.php @@ -0,0 +1,66 @@ +controller = $controller; + } + + /** + * Returns an array of events that this class subscribes to. + * + * @return array An associative array where the keys are the event names and the values are the method names to call when the event is triggered. + */ + public static function get_subscribed_events(): array { + return [ + 'rocket_performance_hints_cleanup' => 'cleanup', + 'init' => 'schedule_cleanup', + 'rocket_deactivation' => 'unscheduled_cleanup', + ]; + } + + /** + * Executes the performance hints cleanup. + * + * @return void + */ + public function cleanup() { + $this->controller->cleanup(); + } + + /** + * Schedules the performance hints cleanup to run at a later time. + * + * @return void + */ + public function schedule_cleanup() { + $this->controller->schedule_cleanup(); + } + + /** + * Unscheduled the performance hints cleanup, preventing it from running at the previously scheduled time. + * + * @return void + */ + public function unscheduled_cleanup() { + $this->controller->unscheduled_cleanup(); + } +} diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 8c69b4940f..e52f4beb46 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -7,6 +7,7 @@ use WP_Rocket\Engine\Common\PerformanceHints\AJAX\Subscriber as AjaxSubscriber; use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Processor as FrontendProcessor; use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Subscriber as FrontendSubscriber; +use WP_Rocket\Engine\Common\PerformanceHints\Cron\{Controller as CronController, Subscriber as CronSubscriber}; use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{ APIClient, Controller as WarmUpController, @@ -28,6 +29,8 @@ class ServiceProvider extends AbstractServiceProvider { 'performance_hints_ajax_subscriber', 'frontend_processor', 'performance_hints_frontend_subscriber', + 'performance_hints_cron_subscriber', + 'cron_controller', 'performance_hints_warmup_apiclient', 'performance_hints_warmup_queue', 'performance_hints_warmup_controller', @@ -82,6 +85,19 @@ public function register(): void { ] ); + $this->getContainer()->add( 'cron_controller', CronController::class ) + ->addArguments( + [ + $this->getContainer()->get( 'atf_query' ), + ] + ); + + $this->getContainer()->addShared( 'performance_hints_cron_subscriber', CronSubscriber::class ) + ->addArguments( + [ + $this->getContainer()->get( 'cron_controller' ), + ] + ); $this->getContainer()->add( 'performance_hints_warmup_apiclient', APIClient::class ) ->addArgument( $this->getContainer()->get( 'options' ) ); diff --git a/inc/Engine/Media/AboveTheFold/Cron/Subscriber.php b/inc/Engine/Media/AboveTheFold/Cron/Subscriber.php deleted file mode 100644 index 5eea55118e..0000000000 --- a/inc/Engine/Media/AboveTheFold/Cron/Subscriber.php +++ /dev/null @@ -1,70 +0,0 @@ -controller = $controller; - } - - /** - * Returns an array of events that this class subscribes to. - * - * @return array An associative array where the keys are the event names and the values are the method names to call when the event is triggered. - */ - public static function get_subscribed_events() { - return [ - 'rocket_atf_cleanup' => 'atf_cleanup', - 'init' => 'schedule_atf_cleanup', - 'rocket_deactivation' => 'unschedule_atf_cleanup', - ]; - } - - /** - * Executes the 'above the fold' cleanup. - * - * @return void - */ - public function atf_cleanup() { - $this->controller->atf_cleanup(); - } - - /** - * Schedules the 'above the fold' cleanup to run at a later time. - * - * @return void - */ - public function schedule_atf_cleanup() { - $this->controller->schedule_atf_cleanup(); - } - - /** - * Unschedules the 'above the fold' cleanup, preventing it from running at the previously scheduled time. - * - * @return void - */ - public function unschedule_atf_cleanup() { - $this->controller->unschedule_atf_cleanup(); - } -} diff --git a/inc/Engine/Media/AboveTheFold/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/ServiceProvider.php index 0f55b0b3ea..4bbd3428a5 100644 --- a/inc/Engine/Media/AboveTheFold/ServiceProvider.php +++ b/inc/Engine/Media/AboveTheFold/ServiceProvider.php @@ -10,7 +10,6 @@ use WP_Rocket\Engine\Media\AboveTheFold\Database\Tables\AboveTheFold as ATFTable; use WP_Rocket\Engine\Media\AboveTheFold\Database\Queries\AboveTheFold as ATFQuery; use WP_Rocket\Engine\Media\AboveTheFold\Frontend\{Controller as FrontController, Subscriber as FrontSubscriber}; -use WP_Rocket\Engine\Media\AboveTheFold\Cron\{Controller as CronController, Subscriber as CronSubscriber}; class ServiceProvider extends AbstractServiceProvider { /** @@ -30,8 +29,6 @@ class ServiceProvider extends AbstractServiceProvider { 'atf_subscriber', 'atf_admin_controller', 'atf_admin_subscriber', - 'atf_cron_controller', - 'atf_cron_subscriber', 'atf_ajax_controller', 'atf_ajax_subscriber', 'atf_factory', @@ -78,11 +75,6 @@ public function register(): void { $this->getContainer()->addShared( 'atf_admin_subscriber', AdminSubscriber::class ) ->addArgument( $this->getContainer()->get( 'atf_admin_controller' ) ); - $this->getContainer()->add( 'atf_cron_controller', CronController::class ) - ->addArgument( $this->getContainer()->get( 'atf_query' ) ); - $this->getContainer()->addShared( 'atf_cron_subscriber', CronSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'atf_cron_controller' ) ); - $this->getContainer()->add( 'atf_ajax_controller', AJAXController::class ) ->addArguments( [ diff --git a/inc/Plugin.php b/inc/Plugin.php index dd285c427f..e95487ade0 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -392,10 +392,10 @@ private function init_common_subscribers() { 'contactform7', 'debug_subscriber', 'rucss_cron_subscriber', - 'atf_cron_subscriber', 'saas_admin_subscriber', 'performance_hints_ajax_subscriber', 'performance_hints_frontend_subscriber', + 'performance_hints_cron_subscriber', 'performance_hints_warmup_subscriber', ]; diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php new file mode 100644 index 0000000000..12976f2bda --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php @@ -0,0 +1,16 @@ + [ + 'config' => [ + 'scheduled' => false, + ], + 'expected' => true + ], + 'shouldScheduleCron' => [ + 'config' => [ + 'scheduled' => true, + ], + 'expected' => true + ], +]; diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php new file mode 100644 index 0000000000..a3f17e6af6 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php @@ -0,0 +1,75 @@ + [ + 'config' => [ + 'rows' => [ + [ + 'status' => 'failed', + 'url' => 'http://example.org', + 'last_accessed' => $current_date, + 'modified' => $current_date, + ], + [ + 'status' => 'completed', + 'url' => 'http://example.org/hello-world', + 'last_accessed' => $current_date, + 'modified' => $current_date, + ], + ], + ], + 'expected' => [ + 'numberRowStillInDb' => 1 + ], + ], + 'shouldDeleteRowWithOldEnough' => [ + 'config' => [ + 'rows' => [ + [ + 'status' => 'in-progress', + 'url' => 'http://example.org', + 'last_accessed' => $old_date, + 'modified' => $old_date, + ] + ], + ], + 'expected' => [ + 'numberRowStillInDb' => 0 + ], + ], + 'shouldDeleteRowWithOldEnoughAndFailed' => [ + 'config' => [ + 'rows' => [ + [ + 'status' => 'in-progress', + 'url' => 'http://example.org', + 'last_accessed' => $old_date, + 'modified' => $old_date, + ], + [ + 'status' => 'failed', + 'url' => 'http://example.org/hello-world', + 'last_accessed' => $current_date, + 'modified' => $current_date, + ], + [ + 'status' => 'completed', + 'url' => 'http://example.org/hello-world', + 'last_accessed' => $old_date, + 'modified' => $old_date, + ], + [ + 'status' => 'completed', + 'url' => 'http://example.org/hello-world', + 'last_accessed' => $current_date, + 'modified' => $current_date, + ], + ], + ], + 'expected' => + [ + 'numberRowStillInDb' => 1 + ], + ], +]; diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php new file mode 100644 index 0000000000..043f1e6d62 --- /dev/null +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Controller/scheduleCleanup.php @@ -0,0 +1,42 @@ +unregisterAllCallbacksExcept( 'init', 'schedule_cleanup' ); + } + + public function tear_down() { + $this->restoreWpHook( 'init' ); + + parent::tear_down(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoAsExpected( $config, $expected ) { + if ( $config['scheduled'] ) { + wp_schedule_event( time(), 'daily', 'rocket_performance_hints_cleanup' ); + } + + do_action( 'init' ); + + if ( $expected ) { + $this->assertNotFalse( wp_next_scheduled( 'rocket_performance_hints_cleanup' ) ); + } else { + $this->assertFalse( wp_next_scheduled( 'rocket_performance_hints_cleanup' ) ); + } + } +} diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/Cron/Subscriber/atfCleanup.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php similarity index 79% rename from tests/Integration/inc/Engine/Media/AboveTheFold/Cron/Subscriber/atfCleanup.php rename to tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php index cd3ecf07c1..9eb5d04e63 100644 --- a/tests/Integration/inc/Engine/Media/AboveTheFold/Cron/Subscriber/atfCleanup.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php @@ -1,17 +1,17 @@ get( 'atf_query' ); $result_atf_after_clean = $atf_query->query(); From cdb9cc7e4bd242ee2753789f601745fb229fae37 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 26 Jul 2024 17:06:39 +0100 Subject: [PATCH 031/192] Updated to use queries from factory --- .../PerformanceHints/Cron/Controller.php | 22 +++++++------------ .../PerformanceHints/ServiceProvider.php | 15 +++++-------- 2 files changed, 13 insertions(+), 24 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Cron/Controller.php b/inc/Engine/Common/PerformanceHints/Cron/Controller.php index f7bfd47380..ddf212849c 100644 --- a/inc/Engine/Common/PerformanceHints/Cron/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Cron/Controller.php @@ -3,22 +3,14 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\Cron; -use WP_Rocket\Engine\Media\AboveTheFold\Database\Queries\AboveTheFold as ATFQuery; -use WP_Rocket\Engine\Optimization\RegexTrait; - /** * The Controller Class is responsible for scheduling, executing, and unschedulin performance hints optimization cleanup. - * - * It uses the RegexTrait for regular expression related methods. - * It has private properties for ATFQuery */ class Controller { - use RegexTrait; - /** - * Instance of the ATFQuery class. + * Array of factories. * - * @var ATFQuery + * @var array */ private $query; @@ -26,10 +18,10 @@ class Controller { * Constructor method. * Initializes a new instance of the Controller class. * - * @param ATFQuery $query An instance of the ATFQuery class. + * @param array $factories Array of factories. */ - public function __construct( ATFQuery $query ) { - $this->query = $query; + public function __construct( array $factories ) { + $this->factories = $factories; } /** @@ -48,7 +40,9 @@ public function schedule_cleanup() { */ public function cleanup() { // Delete the rows with failed status or not accessed. - $this->query->delete_old_rows(); + foreach ( $this->factories as $factory ) { + $factory->queries()->delete_old_rows(); + } } /** diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index e52f4beb46..47eb0f67e7 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -86,18 +86,13 @@ public function register(): void { ); $this->getContainer()->add( 'cron_controller', CronController::class ) - ->addArguments( - [ - $this->getContainer()->get( 'atf_query' ), - ] - ); + ->addArgument( [ + $atf_factory, + ] ); $this->getContainer()->addShared( 'performance_hints_cron_subscriber', CronSubscriber::class ) - ->addArguments( - [ - $this->getContainer()->get( 'cron_controller' ), - ] - ); + ->addArgument( $this->getContainer()->get( 'cron_controller' ) ); + $this->getContainer()->add( 'performance_hints_warmup_apiclient', APIClient::class ) ->addArgument( $this->getContainer()->get( 'options' ) ); From 1ba7f7482cfecd4caa6bbef1fc9644c87d600231 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 26 Jul 2024 17:08:48 +0100 Subject: [PATCH 032/192] phpcs fix --- inc/Engine/Common/PerformanceHints/ServiceProvider.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 47eb0f67e7..6a00f2f856 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -86,12 +86,14 @@ public function register(): void { ); $this->getContainer()->add( 'cron_controller', CronController::class ) - ->addArgument( [ - $atf_factory, - ] ); + ->addArgument( + [ + $atf_factory, + ] + ); $this->getContainer()->addShared( 'performance_hints_cron_subscriber', CronSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'cron_controller' ) ); + ->addArgument( $this->getContainer()->get( 'cron_controller' ) ); $this->getContainer()->add( 'performance_hints_warmup_apiclient', APIClient::class ) ->addArgument( $this->getContainer()->get( 'options' ) ); From 881b1b174a38ebae5c37a28725d04b27928b7596 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 26 Jul 2024 17:19:18 +0100 Subject: [PATCH 033/192] Add correct property --- inc/Engine/Common/PerformanceHints/Cron/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/Cron/Controller.php b/inc/Engine/Common/PerformanceHints/Cron/Controller.php index ddf212849c..af0106df96 100644 --- a/inc/Engine/Common/PerformanceHints/Cron/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Cron/Controller.php @@ -12,7 +12,7 @@ class Controller { * * @var array */ - private $query; + private $factories; /** * Constructor method. From b244714076038d685158212d54f9de280142582f Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Mon, 29 Jul 2024 15:23:42 +0300 Subject: [PATCH 034/192] adjust the beacon script --- assets/js/wpr-beacon.js | 108 +++-- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 6 +- package-lock.json | 754 +++++++++++++++----------------- package.json | 2 +- 5 files changed, 419 insertions(+), 453 deletions(-) diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index b503459d0d..7ea86c6642 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -1,10 +1,29 @@ (() => { - // src/RocketLcpBeacon.js - var RocketLcpBeacon = class { - constructor(config) { + // src/Utils.js + var BeaconUtils = class { + static isNotValidScreensize(is_mobile, threshold) { + const screenWidth = window.innerWidth || document.documentElement.clientWidth; + const screenHeight = window.innerHeight || document.documentElement.clientHeight; + const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height); + const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height); + return isNotValidForMobile || isNotValidForDesktop; + } + static isPageCached() { + const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : ""; + return signature && signature.includes("Debug: cached"); + } + static isIntersecting(rect) { + return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth); + } + }; + var Utils_default = BeaconUtils; + + // src/BeaconLcp.js + var BeaconLcp = class { + constructor(config, logger) { this.config = config; this.performanceImages = []; - this.errorCode = ""; + this.logger = logger; } async run() { try { @@ -15,7 +34,7 @@ } } catch (err) { this.errorCode = "script_error"; - this._logMessage("Script Error: " + err); + this.logger.logMessage("Script Error: " + err); } } _generateLcpCandidates(count) { @@ -44,7 +63,7 @@ rect }; }).filter((item) => item !== null).filter((item) => { - return item.rect.width > 0 && item.rect.height > 0 && RocketBeacon._isIntersecting(item.rect); + return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect); }).map((item) => ({ item, area: this._getElementArea(item.rect), @@ -139,7 +158,7 @@ _initWithFirstElementWithInfo(elements) { const firstElementWithInfo = elements.find((item) => item.elementInfo !== null); if (!firstElementWithInfo) { - this._logMessage("No LCP candidate found."); + this.logger.logMessage("No LCP candidate found."); this.performanceImages = []; return; } @@ -165,26 +184,35 @@ const isBgImageOrPicture = elementInfo.type === "bg-img" || elementInfo.type === "bg-img-set" || elementInfo.type === "picture"; return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src); } - _logMessage(msg) { - if (!this.config.debug) { + getResults() { + return this.performanceImages; + } + }; + var BeaconLcp_default = BeaconLcp; + + // src/Logger.js + var Logger = class { + constructor(enabled) { + this.enabled = enabled; + } + logMessage(msg) { + if (!this.enabled) { return; } console.log(msg); } - getResults() { - return this.performanceImages; - } }; - var RocketLcpBeacon_default = RocketLcpBeacon; + var Logger_default = Logger; - // src/RocketBeacon.js - var RocketBeacon2 = class { + // src/BeaconManager.js + var BeaconManager = class { constructor(config) { this.config = config; this.lcpBeacon = null; this.infiniteLoopId = null; this.scriptTimer = /* @__PURE__ */ new Date(); this.errorCode = ""; + this.logger = new Logger_default(this.config.debug); } async init() { if (!await this._isValidPreconditions()) { @@ -196,26 +224,26 @@ }, 1e4); const isGeneratedBefore = await this._isGeneratedBefore(); if (!isGeneratedBefore.lcp) { - this.lcpBeacon = new RocketLcpBeacon_default(this.config); + this.lcpBeacon = new BeaconLcp_default(this.config, this.logger); await this.lcpBeacon.run(); } this._saveFinalResultIntoDB(); } async _isValidPreconditions() { - if (this._isNotValidScreensize()) { - this._logMessage("Bailing out because screen size is not acceptable"); + const threshold = { + width: this.config.width_threshold, + height: this.config.height_threshold + }; + if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) { + this.logger.logMessage("Bailing out because screen size is not acceptable"); return false; } - if (this._isPageCached() && await this._isGeneratedBefore()) { - this._logMessage("Bailing out because data is already available"); + if (Utils_default.isPageCached() && await this._isGeneratedBefore()) { + this.logger.logMessage("Bailing out because data is already available"); return false; } return true; } - _isPageCached() { - const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : ""; - return signature && signature.includes("Debug: cached"); - } async _isGeneratedBefore() { let data_check = new FormData(); data_check.append("action", "rocket_check_beacon"); @@ -229,25 +257,17 @@ }).then((data) => data.json()); return beacon_data_response.data; } - _isNotValidScreensize() { - const screenWidth = window.innerWidth || document.documentElement.clientWidth; - const screenHeight = window.innerHeight || document.documentElement.clientHeight; - const isNotValidForMobile = this.config.is_mobile && (screenWidth > this.config.width_threshold || screenHeight > this.config.height_threshold); - const isNotValidForDesktop = !this.config.is_mobile && (screenWidth < this.config.width_threshold || screenHeight < this.config.height_threshold); - return isNotValidForMobile || isNotValidForDesktop; - } - static _isIntersecting(rect) { - return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth); - } _saveFinalResultIntoDB() { - const lcpResults = this.lcpBeacon ? this.lcpBeacon.getResults() : null; + const results = { + lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null + }; const data = new FormData(); data.append("action", "rocket_beacon"); data.append("rocket_beacon_nonce", this.config.nonce); data.append("url", this.config.url); data.append("is_mobile", this.config.is_mobile); data.append("status", this._getFinalStatus()); - data.append("lcp_images", JSON.stringify(lcpResults)); + data.append("results", JSON.stringify(results)); fetch(this.config.ajax_url, { method: "POST", credentials: "same-origin", @@ -256,9 +276,9 @@ "wpr-saas-no-intercept": true } }).then((response) => response.json()).then((data2) => { - this._logMessage(data2); + this.logger.logMessage(data2); }).catch((error) => { - this._logMessage(error); + this.logger.logMessage(error); }).finally(() => { this._finalize(); }); @@ -281,21 +301,15 @@ beaconscript.setAttribute("beacon-completed", "true"); clearTimeout(this.infiniteLoopId); } - _logMessage(msg) { - if (!this.config.debug) { - return; - } - console.log(msg); - } }; - var RocketBeacon_default = RocketBeacon2; + var BeaconManager_default = BeaconManager; - // src/RocketFinalBeacon.js + // src/BeaconEntryPoint.js ((rocket_beacon_data) => { if (!rocket_beacon_data) { return; } - const instance = new RocketBeacon_default(rocket_beacon_data); + const instance = new BeaconManager_default(rocket_beacon_data); if (document.readyState !== "loading") { setTimeout(() => { instance.init(); diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index e9f16562eb..da9bb37938 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var l=class{constructor(e){this.config=e,this.performanceImages=[],this.errorCode=""}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this._logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&RocketBeacon._isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const a=[...o.matchAll(c)];t.bg_set=a.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=a.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this._logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}_logMessage(e){this.config.debug&&console.log(e)}getResults(){return this.performanceImages}},g=l,u=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode=""}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4),(await this._isGeneratedBefore()).lcp||(this.lcpBeacon=new g(this.config),await this.lcpBeacon.run()),this._saveFinalResultIntoDB()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage("Bailing out because screen size is not acceptable"),!1):this._isPageCached()&&await this._isGeneratedBefore()?(this._logMessage("Bailing out because data is already available"),!1):!0}_isPageCached(){const e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:"";return e&&e.includes("Debug: cached")}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_isNotValidScreensize(){const e=window.innerWidth||document.documentElement.clientWidth,i=window.innerHeight||document.documentElement.clientHeight,t=this.config.is_mobile&&(e>this.config.width_threshold||i>this.config.height_threshold),c=!this.config.is_mobile&&(e=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_saveFinalResultIntoDB(){const e=this.lcpBeacon?this.lcpBeacon.getResults():null,i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("lcp_images",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this._logMessage(t)}).catch(t=>{this._logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}},d=u;(e=>{if(!e)return;const i=new d(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); +(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4),(await this._isGeneratedBefore()).lcp||(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()),this._saveFinalResultIntoDB()}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return a.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):a.isPageCached()&&await this._isGeneratedBefore()?(this.logger.logMessage("Bailing out because data is already available"),!1):!0}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 919e8ba0da..722f40a702 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], - "sourcesContent": ["(() => {\n // src/RocketLcpBeacon.js\n var RocketLcpBeacon = class {\n constructor(config) {\n this.config = config;\n this.performanceImages = [];\n this.errorCode = \"\";\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this._logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && RocketBeacon._isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this._logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n _logMessage(msg) {\n if (!this.config.debug) {\n return;\n }\n console.log(msg);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var RocketLcpBeacon_default = RocketLcpBeacon;\n\n // src/RocketBeacon.js\n var RocketBeacon2 = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.errorCode = \"\";\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._isGeneratedBefore();\n if (!isGeneratedBefore.lcp) {\n this.lcpBeacon = new RocketLcpBeacon_default(this.config);\n await this.lcpBeacon.run();\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n if (this._isNotValidScreensize()) {\n this._logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n if (this._isPageCached() && await this._isGeneratedBefore()) {\n this._logMessage(\"Bailing out because data is already available\");\n return false;\n }\n return true;\n }\n _isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n async _isGeneratedBefore() {\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _isNotValidScreensize() {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = this.config.is_mobile && (screenWidth > this.config.width_threshold || screenHeight > this.config.height_threshold);\n const isNotValidForDesktop = !this.config.is_mobile && (screenWidth < this.config.width_threshold || screenHeight < this.config.height_threshold);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static _isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n _saveFinalResultIntoDB() {\n const lcpResults = this.lcpBeacon ? this.lcpBeacon.getResults() : null;\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"lcp_images\", JSON.stringify(lcpResults));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this._logMessage(data2);\n }).catch((error) => {\n this._logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n _logMessage(msg) {\n if (!this.config.debug) {\n return;\n }\n console.log(msg);\n }\n };\n var RocketBeacon_default = RocketBeacon2;\n\n // src/RocketFinalBeacon.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new RocketBeacon_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], - "mappings": "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", - "names": ["RocketLcpBeacon", "config", "above_the_fold_images", "err", "count", "lcpElements", "element", "rect", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "msg", "RocketLcpBeacon_default", "RocketBeacon2", "signature", "data_check", "data", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "lcpResults", "response", "data2", "error", "RocketBeacon_default", "rocket_beacon_data", "instance"] + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._isGeneratedBefore();\n if (!isGeneratedBefore.lcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n if (Utils_default.isPageCached() && await this._isGeneratedBefore()) {\n this.logger.logMessage(\"Bailing out because data is already available\");\n return false;\n }\n return true;\n }\n async _isGeneratedBefore() {\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], + "mappings": "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", + "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] } diff --git a/package-lock.json b/package-lock.json index 68aebb1960..b3754f9d8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "watchify": "^4.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.9.1", - "wp-rocket-scripts": "^1.0.2-alpha", + "wp-rocket-scripts": "github:wp-media/rocket-scripts#enhancement/beacon-script-refactoring-phase-2", "yargs": "^17.3.0" } }, @@ -74,9 +74,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.0.tgz", + "integrity": "sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -113,9 +113,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.8.tgz", - "integrity": "sha512-nYAikI4XTGokU2QX7Jx+v4rxZKhKivaQaREZjuW3mrJrbdWJ5yUfohnoUULge+zEEaKjPYNxhoRgUKktjXtbwA==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", + "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -131,12 +131,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.9", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -187,19 +187,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", - "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/traverse": "^7.25.0", "semver": "^6.3.1" }, "engines": { @@ -210,9 +208,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.0.tgz", + "integrity": "sha512-q0T+dknZS+L5LDazIP+02gEZITG5unzvb6yIjcmj5i0eFrs5ToBV2m2JGH4EsE/gtP8ygEGLGApBgRIZkTm7zg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -242,43 +240,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", @@ -306,16 +267,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.0.tgz", + "integrity": "sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -346,14 +306,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -363,14 +323,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -405,18 +365,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", @@ -445,28 +393,27 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -488,9 +435,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -500,13 +447,28 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", + "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -516,12 +478,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -548,13 +510,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -858,15 +820,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -908,12 +870,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -956,18 +918,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", - "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -1039,6 +999,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", @@ -1104,14 +1080,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1216,15 +1192,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1679,19 +1655,20 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", - "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.0.tgz", + "integrity": "sha512-vYAA8PrCOeZfG4D87hmw1KJ1BPubghXP1e2MacRFwECGNKL76dkA38JEwYllbvQCpf/kLxsTtir0b8MtxKoVCw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.0", "@babel/helper-compilation-targets": "^7.24.8", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1712,29 +1689,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-classes": "^7.25.0", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.0", "@babel/plugin-transform-json-strings": "^7.24.7", "@babel/plugin-transform-literals": "^7.24.7", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -1814,9 +1792,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1832,33 +1810,30 @@ "dev": true }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.1.tgz", + "integrity": "sha512-LrHHoWq08ZpmmFqBAzN+hUdWwy5zt7FGa/hVwMcOqW6OVtwqaoD5utfuGYU87JYxdZgLUvktAsn37j/sYR9siA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1867,9 +1842,9 @@ } }, "node_modules/@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", + "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -2241,12 +2216,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.0.0.tgz", + "integrity": "sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.11.1" } }, "node_modules/@ungap/structured-clone": { @@ -4523,9 +4498,9 @@ } }, "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -4739,9 +4714,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz", - "integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.2.tgz", + "integrity": "sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==", "dev": true }, "node_modules/elliptic": { @@ -4790,9 +4765,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -9905,9 +9880,9 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", - "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -9999,9 +9974,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", + "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -10093,13 +10068,16 @@ } }, "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "dev": true, "dependencies": { "punycode": "^1.4.1", - "qs": "^6.11.2" + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/util": { @@ -10727,10 +10705,10 @@ } }, "node_modules/wp-rocket-scripts": { - "version": "1.0.2-alpha", - "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.2-alpha.tgz", - "integrity": "sha512-LnP09lxaTDkXef1Wi6+1syqmFsGGk6V982uvliILBJwA8OeBY4zWHAOh/NFIiBcKOkiYYoA+u30Q2xuAF3nvsw==", - "dev": true + "version": "1.0.2-alpha2", + "resolved": "git+ssh://git@github.com/wp-media/rocket-scripts.git#13950ab2c353c7974ddc7de916cee7b680b217e0", + "dev": true, + "license": "ISC" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -10874,9 +10852,9 @@ } }, "@babel/compat-data": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", - "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.0.tgz", + "integrity": "sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==", "dev": true }, "@babel/core": { @@ -10903,9 +10881,9 @@ } }, "@babel/eslint-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.8.tgz", - "integrity": "sha512-nYAikI4XTGokU2QX7Jx+v4rxZKhKivaQaREZjuW3mrJrbdWJ5yUfohnoUULge+zEEaKjPYNxhoRgUKktjXtbwA==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz", + "integrity": "sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==", "dev": true, "requires": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -10914,12 +10892,12 @@ } }, "@babel/generator": { - "version": "7.24.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", - "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, "requires": { - "@babel/types": "^7.24.9", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -10958,26 +10936,24 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", - "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/traverse": "^7.25.0", "semver": "^6.3.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.0.tgz", + "integrity": "sha512-q0T+dknZS+L5LDazIP+02gEZITG5unzvb6yIjcmj5i0eFrs5ToBV2m2JGH4EsE/gtP8ygEGLGApBgRIZkTm7zg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -10998,34 +10974,6 @@ "resolve": "^1.14.2" } }, - "@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, "@babel/helper-member-expression-to-functions": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", @@ -11047,16 +10995,15 @@ } }, "@babel/helper-module-transforms": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", - "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.0.tgz", + "integrity": "sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" } }, "@babel/helper-optimise-call-expression": { @@ -11075,25 +11022,25 @@ "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" } }, "@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" } }, "@babel/helper-simple-access": { @@ -11116,15 +11063,6 @@ "@babel/types": "^7.24.7" } }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, "@babel/helper-string-parser": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", @@ -11144,25 +11082,24 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/helpers": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", - "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", "dev": true, "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.8" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/highlight": { @@ -11178,28 +11115,37 @@ } }, "@babel/parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", - "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "dev": true }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", + "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { @@ -11214,13 +11160,13 @@ } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" } }, "@babel/plugin-proposal-class-properties": { @@ -11422,15 +11368,15 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" } }, "@babel/plugin-transform-async-to-generator": { @@ -11454,12 +11400,12 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-class-properties": { @@ -11484,18 +11430,16 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", - "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" } }, @@ -11537,6 +11481,16 @@ "@babel/helper-plugin-utils": "^7.24.7" } }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + } + }, "@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", @@ -11578,14 +11532,14 @@ } }, "@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" } }, "@babel/plugin-transform-json-strings": { @@ -11648,15 +11602,15 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" } }, "@babel/plugin-transform-modules-umd": { @@ -11937,19 +11891,20 @@ } }, "@babel/preset-env": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.8.tgz", - "integrity": "sha512-vObvMZB6hNWuDxhSaEPTKCwcqkAIuDtE+bQGn4XMXne1DSLzFVY8Vmj1bm+mUQXYNN8NmaQEO+r8MMbzPr1jBQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.0.tgz", + "integrity": "sha512-vYAA8PrCOeZfG4D87hmw1KJ1BPubghXP1e2MacRFwECGNKL76dkA38JEwYllbvQCpf/kLxsTtir0b8MtxKoVCw==", "dev": true, "requires": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.0", "@babel/helper-compilation-targets": "^7.24.8", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -11970,29 +11925,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-classes": "^7.25.0", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.0", "@babel/plugin-transform-json-strings": "^7.24.7", "@babel/plugin-transform-literals": "^7.24.7", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -12057,9 +12013,9 @@ "dev": true }, "@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" @@ -12074,38 +12030,35 @@ } }, "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "requires": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/traverse": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", - "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.1.tgz", + "integrity": "sha512-LrHHoWq08ZpmmFqBAzN+hUdWwy5zt7FGa/hVwMcOqW6OVtwqaoD5utfuGYU87JYxdZgLUvktAsn37j/sYR9siA==", "dev": true, "requires": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.8", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.8", - "@babel/types": "^7.24.8", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", - "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", + "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.24.8", @@ -12395,12 +12348,12 @@ "dev": true }, "@types/node": { - "version": "20.14.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", - "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.0.0.tgz", + "integrity": "sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==", "dev": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.11.1" } }, "@ungap/structured-clone": { @@ -14358,9 +14311,9 @@ } }, "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { "ms": "2.1.2" @@ -14527,9 +14480,9 @@ } }, "electron-to-chromium": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.0.tgz", - "integrity": "sha512-Vb3xHHYnLseK8vlMJQKJYXJ++t4u1/qJ3vykuVrVjvdiOEhYyT1AuP4x03G8EnPmYvYOhe9T+dADTmthjRQMkA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.2.tgz", + "integrity": "sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==", "dev": true }, "elliptic": { @@ -14577,9 +14530,9 @@ } }, "enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -18464,9 +18417,9 @@ "dev": true }, "uglify-js": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz", - "integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", "dev": true }, "umd": { @@ -18536,9 +18489,9 @@ "dev": true }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", + "integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -18597,13 +18550,13 @@ } }, "url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "dev": true, "requires": { "punycode": "^1.4.1", - "qs": "^6.11.2" + "qs": "^6.12.3" } }, "util": { @@ -19086,10 +19039,9 @@ "dev": true }, "wp-rocket-scripts": { - "version": "1.0.2-alpha", - "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.2-alpha.tgz", - "integrity": "sha512-LnP09lxaTDkXef1Wi6+1syqmFsGGk6V982uvliILBJwA8OeBY4zWHAOh/NFIiBcKOkiYYoA+u30Q2xuAF3nvsw==", - "dev": true + "version": "git+ssh://git@github.com/wp-media/rocket-scripts.git#13950ab2c353c7974ddc7de916cee7b680b217e0", + "dev": true, + "from": "wp-rocket-scripts@github:wp-media/rocket-scripts#enhancement/beacon-script-refactoring-phase-2" }, "wrap-ansi": { "version": "7.0.0", diff --git a/package.json b/package.json index d1eb595ced..8f6c0f60b8 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "watchify": "^4.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.9.1", - "wp-rocket-scripts": "^1.0.2-alpha", + "wp-rocket-scripts": "github:wp-media/rocket-scripts#enhancement/beacon-script-refactoring-phase-2", "yargs": "^17.3.0" } } From 672dc3355e6b372387712cd984a0138b9d2e669c Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Tue, 30 Jul 2024 14:46:46 +0100 Subject: [PATCH 035/192] Closes: #6773 Refactor admin (#6802) Co-authored-by: Gael Robin Co-authored-by: Michael Lee --- composer.json | 4 +- .../PerformanceHints/Admin/Controller.php | 180 +++++++++++++++++ .../PerformanceHints/Admin/Subscriber.php | 107 ++++++++++ .../PerformanceHints/ServiceProvider.php | 16 ++ .../PerformanceHints/WarmUp/Subscriber.php | 10 +- .../Media/AboveTheFold/Admin/Controller.php | 184 ------------------ .../Media/AboveTheFold/Admin/Subscriber.php | 109 ----------- inc/Engine/Media/AboveTheFold/Factory.php | 2 +- .../Media/AboveTheFold/ServiceProvider.php | 10 - inc/Plugin.php | 3 +- .../Admin/Controller/deletePost.php} | 3 + .../Admin/Controller/deleteTerm.php} | 0 .../Admin/Controller/truncateFromAdmin.php} | 0 .../Admin/Controller/truncateOnUpdate.php | 0 .../Admin/Controller/truncateTables.php} | 0 tests/Integration/DBTrait.php | 4 +- tests/Integration/bootstrap.php | 7 + .../enableSeparateCacheFilesMobile.php | 4 - .../Engine/CDN/Subscriber/rewriteSrcset.php | 13 -- .../AdminSubscriber/addPurgeTermLink.php | 4 - .../changeCacheRejectUriWithPermalink.php | 6 - .../maybePurgeCacheOnTermChange.php | 6 - .../purgeCacheRejectUriPartially.php | 6 - .../purgeDatesArchives.php | 6 - .../purgePostTermsUrls.php | 6 - .../Cron/Subscriber/cronCleanRows.php | 6 - .../Cron/Subscriber/cronRemoveFailedJobs.php | 6 - .../Cron/Subscriber/processOnSubmitJobs.php | 6 - .../AJAX/Subscriber/addData.php | 17 +- .../AJAX/Subscriber/checkData.php | 17 +- .../Admin/Controller/truncateFromAdmin.php} | 15 +- .../Cron/Subscriber/cleanup.php | 13 +- .../Subscriber/maybe_apply_optimizations.php | 17 +- .../CriticalCSS/getCriticalCssContent.php | 6 - .../CriticalCSS/processHandler.php | 3 - .../CriticalCSSSubscriber/deleteCpcss.php | 6 - .../insertCriticalCssBuffer.php | 6 - .../Engine/CriticalPath/RESTWPPost/delete.php | 6 - .../CriticalPath/RESTWPPost/generate.php | 12 -- .../excludeRocketLazyloadExcludedSrc.php | 6 - .../CSS/Subscriber/maybeReplaceCssImages.php | 6 - .../Lazyload/Subscriber/addExclusions.php | 6 - .../Media/Lazyload/Subscriber/lazyload.php | 6 - .../Hostings/Pressidium/cleanPost.php | 6 - .../Hostings/SpinUpWP/removeActions.php | 14 -- .../showEmptyProductGalleryWithDelayJS.php | 6 - .../showNotemptyProductGalleryWithDelayJS.php | 6 - ...disableImageDimensionsHeightPercentage.php | 6 - .../Themes/Divi/handleSaveTemplate.php | 6 - .../Themes/Divi/removeAssetsGenerated.php | 6 - .../common/doAdminPostRocketPurgeCache.php | 6 - .../rocketCleanPostCacheOnSlugChange.php | 6 - .../functions/getRocketSamplePermalink.php | 6 - .../Admin/Controller/deletePost.php | 52 +++++ .../Admin/Controller/deleteTerm.php | 53 +++++ .../Admin/Controller/truncateOnUpdate.php | 57 ++++++ .../Admin/Controller/truncateTables.php | 61 ++++++ .../Admin/Controller/deletePostAtf.php | 55 ------ .../Admin/Controller/deleteTermAtf.php | 56 ------ .../Admin/Controller/truncateAtf.php | 60 ------ .../Admin/Controller/truncateOnUpdate.php | 56 ------ 61 files changed, 601 insertions(+), 767 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/Admin/Controller.php create mode 100644 inc/Engine/Common/PerformanceHints/Admin/Subscriber.php delete mode 100644 inc/Engine/Media/AboveTheFold/Admin/Controller.php delete mode 100644 inc/Engine/Media/AboveTheFold/Admin/Subscriber.php rename tests/Fixtures/inc/Engine/{Media/AboveTheFold/Admin/Controller/deletePostAtf.php => Common/PerformanceHints/Admin/Controller/deletePost.php} (90%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold/Admin/Controller/deleteTermAtf.php => Common/PerformanceHints/Admin/Controller/deleteTerm.php} (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php => Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php} (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold => Common/PerformanceHints}/Admin/Controller/truncateOnUpdate.php (100%) rename tests/Fixtures/inc/Engine/{Media/AboveTheFold/Admin/Controller/truncateAtf.php => Common/PerformanceHints/Admin/Controller/truncateTables.php} (100%) rename tests/Integration/inc/Engine/{Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php => Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php} (69%) create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deletePost.php create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deleteTerm.php create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateTables.php delete mode 100644 tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php delete mode 100644 tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php delete mode 100644 tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php delete mode 100644 tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php diff --git a/composer.json b/composer.json index 65ddf338a2..36996aa90c 100644 --- a/composer.json +++ b/composer.json @@ -123,8 +123,9 @@ }, "scripts": { "test-unit": "\"vendor/bin/phpunit\" --testsuite unit --colors=always --configuration tests/Unit/phpunit.xml.dist --coverage-php tests/report/unit.cov", - "test-integration": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --exclude-group AdminOnly,BeaverBuilder,Elementor,Hummingbird,WithSmush,WithWoo,WithAmp,WithAmpAndCloudflare,WithSCCSS,Cloudways,Dreampress,Cloudflare,CloudflareAdmin,Multisite,WPEngine,SpinUpWP,WordPressCom,O2Switch,PDFEmbedder,PDFEmbedderPremium,PDFEmbedderSecure,Godaddy,LiteSpeed,RevolutionSlider,WordFence,ConvertPlug,Kinsta,Jetpack,RankMathSEO,AllInOneSeoPack,SEOPress,TheSEOFramework,OneCom,RocketLazyLoad,WPXCloud,TheEventsCalendar,Perfmatters,RapidLoad,ProIsp,TranslatePress,WPGeotargeting,Weglot,Pressidium --coverage-php tests/report/integration.cov", + "test-integration": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --exclude-group AdminOnly,BeaverBuilder,Elementor,Hummingbird,WithSmush,WithWoo,WithAmp,WithAmpAndCloudflare,WithSCCSS,Cloudways,Dreampress,Cloudflare,CloudflareAdmin,Multisite,WPEngine,SpinUpWP,WordPressCom,O2Switch,PDFEmbedder,PDFEmbedderPremium,PDFEmbedderSecure,Godaddy,LiteSpeed,RevolutionSlider,WordFence,ConvertPlug,Kinsta,Jetpack,RankMathSEO,AllInOneSeoPack,SEOPress,TheSEOFramework,OneCom,RocketLazyLoad,WPXCloud,TheEventsCalendar,Perfmatters,RapidLoad,ProIsp,TranslatePress,WPGeotargeting,Weglot,Pressidium,PerformanceHints --coverage-php tests/report/integration.cov", "test-integration-adminonly": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group AdminOnly", + "test-integration-performancehints": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group PerformanceHints", "test-integration-bb": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group BeaverBuilder", "test-integration-cloudflare": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group Cloudflare", "test-integration-cloudflareadmin": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group CloudflareAdmin", @@ -177,6 +178,7 @@ ], "run-tests-integration-specific": [ "@test-integration-adminonly", + "@test-integration-performancehints", "@test-integration-cloudflare", "@test-integration-cloudflareadmin", "@test-integration-bb", diff --git a/inc/Engine/Common/PerformanceHints/Admin/Controller.php b/inc/Engine/Common/PerformanceHints/Admin/Controller.php new file mode 100644 index 0000000000..73328c56bc --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Admin/Controller.php @@ -0,0 +1,180 @@ +factories = $factories; + } + + /** + * Truncate performance hints optimization tables. + * + * @return void + */ + public function truncate_tables() { + if ( empty( $this->factories ) ) { + return; + } + + $this->delete_rows(); + } + + /** + * Deletes the rows from the table + * + * @return void + */ + private function delete_rows() { + foreach ( $this->factories as $factory ) { + if ( 0 < $factory->queries()->get_not_completed_count() ) { + $factory->table()->remove_all_completed_rows(); + continue; + } + + $factory->table()->truncate_table(); + } + + /** + * Fires after clearing performance hints optimization data. + */ + rocket_do_action_and_deprecated( + 'rocket_after_clear_performance_hints_data', + [], + '3.16.4', + 'rocket_after_clear_atf' + ); + } + + /** + * Delete row on update Post or delete post. + * + * @param int $post_id The post ID. + * + * @return void + */ + public function delete_post( $post_id ) { + if ( empty( $this->factories ) ) { + return; + } + + $url = get_permalink( $post_id ); + + if ( false === $url ) { + return; + } + + $this->delete_by_url( $url ); + } + + /** + * Deletes performance hints optimizations when updating a term + * + * @param int $term_id the term ID. + * + * @return void + */ + public function delete_term( $term_id ) { + if ( empty( $this->factories ) ) { + return; + } + + $url = get_term_link( (int) $term_id ); + + if ( is_wp_error( $url ) ) { + return; + } + + $this->delete_by_url( $url ); + } + + /** + * Deletes rows when triggering clean from admin + * + * @return array + */ + public function truncate_from_admin() { + if ( empty( $this->factories ) ) { + return; + } + + if ( ! current_user_can( 'rocket_manage_options' ) ) { + return [ + 'status' => 'die', + ]; + } + + $this->delete_rows(); + + return [ + 'status' => 'success', + 'message' => sprintf( + // translators: %1$s = plugin name. + __( '%1$s: Critical images cleared!', 'rocket' ), + 'WP Rocket' + ), + ]; + } + + /** + * Cleans rows for the current URL. + * + * @return void + */ + public function clean_url() { + if ( ! current_user_can( 'rocket_manage_options' ) ) { + wp_nonce_ays( '' ); + } + + $url = wp_get_referer(); + + if ( 0 !== strpos( $url, 'http' ) ) { + $parse_url = get_rocket_parse_url( untrailingslashit( home_url() ) ); + $url = $parse_url['scheme'] . '://' . $parse_url['host'] . $url; + } + + $this->delete_by_url( $url ); + } + + /** + * Truncate Performance hints optimization tables on update to 3.16.1.1 and higher + * + * @param string $new_version New plugin version. + * @param string $old_version Old plugin version. + * + * @return void + */ + public function truncate_on_update( $new_version, $old_version ) { + if ( version_compare( $old_version, '3.16.1', '>=' ) ) { + return; + } + + $this->truncate_tables(); + } + + /** + * Deletes row by url from table. + * + * @param string $url Url to delete. + * @return void + */ + private function delete_by_url( string $url ) { + foreach ( $this->factories as $factory ) { + $factory->queries()->delete_by_url( untrailingslashit( $url ) ); + } + } +} diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php new file mode 100644 index 0000000000..d6bbe6f6bc --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -0,0 +1,107 @@ +controller = $controller; + } + + /** + * Return an array of events that this subscriber listens to. + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'switch_theme' => 'truncate_tables', + 'permalink_structure_changed' => 'truncate_tables', + 'rocket_domain_options_changed' => 'truncate_tables', + 'wp_trash_post' => 'delete_post', + 'delete_post' => 'delete_post', + 'clean_post_cache' => 'delete_post', + 'wp_update_comment_count' => 'delete_post', + 'edit_term' => 'delete_term', + 'pre_delete_term' => 'delete_term', + 'rocket_saas_clean_all' => 'truncate_from_admin', + 'rocket_saas_clean_url' => 'clean_url', + 'wp_rocket_upgrade' => [ 'truncate_on_update', 10, 2 ], + ]; + } + + /** + * Callback for truncating performance hints tables + * + * @return void + */ + public function truncate_tables(): void { + $this->controller->truncate_tables(); + } + + /** + * Callback for deleting row or update post. + * + * @param int $post_id The post ID. + * + * @return void + */ + public function delete_post( int $post_id ): void { + $this->controller->delete_post( $post_id ); + } + + /** + * Callback for Deleting Performance hints optimization row on update or delete term. + * + * @param int $term_id The term ID. + * + * @return void + */ + public function delete_term( int $term_id ): void { + $this->controller->delete_term( $term_id ); + } + + /** + * Deletes rows when triggering clean from admin + * + * @return array + */ + public function truncate_from_admin(): array { + return $this->controller->truncate_from_admin(); + } + + /** + * Cleans rows for the current URL. + * + * @return void + */ + public function clean_url() { + $this->controller->clean_url(); + } + + /** + * Truncate Performance hints optimization tables on update to 3.16.1 and higher + * + * @param string $new_version New plugin version. + * @param string $old_version Old plugin version. + * + * @return void + */ + public function truncate_on_update( $new_version, $old_version ) { + $this->controller->truncate_on_update( $new_version, $old_version ); + } +} diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 6a00f2f856..d141da8f82 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -7,6 +7,7 @@ use WP_Rocket\Engine\Common\PerformanceHints\AJAX\Subscriber as AjaxSubscriber; use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Processor as FrontendProcessor; use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Subscriber as FrontendSubscriber; +use WP_Rocket\Engine\Common\PerformanceHints\Admin\{Controller as AdminController, Subscriber as AdminSubscriber}; use WP_Rocket\Engine\Common\PerformanceHints\Cron\{Controller as CronController, Subscriber as CronSubscriber}; use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{ APIClient, @@ -29,6 +30,8 @@ class ServiceProvider extends AbstractServiceProvider { 'performance_hints_ajax_subscriber', 'frontend_processor', 'performance_hints_frontend_subscriber', + 'performance_hints_admin_subscriber', + 'performance_hints_admin_controller', 'performance_hints_cron_subscriber', 'cron_controller', 'performance_hints_warmup_apiclient', @@ -85,6 +88,19 @@ public function register(): void { ] ); + $this->getContainer()->add( 'performance_hints_admin_controller', AdminController::class ) + ->addArguments( + [ + $factories, + ] + ); + + $this->getContainer()->addShared( 'performance_hints_admin_subscriber', AdminSubscriber::class ) + ->addArguments( + [ + $this->getContainer()->get( 'performance_hints_admin_controller' ), + ] + ); $this->getContainer()->add( 'cron_controller', CronController::class ) ->addArgument( [ diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php index 342807b7b4..2184c04b97 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php @@ -29,11 +29,11 @@ public function __construct( Controller $controller ) { */ public static function get_subscribed_events(): array { return [ - 'wp_rocket_upgrade' => [ 'warm_up_on_update', 10, 2 ], - 'rocket_after_clear_atf' => 'warm_up_home', - 'rocket_job_warmup' => 'warm_up', - 'rocket_job_warmup_url' => 'send_to_saas', - 'rocket_saas_api_queued_url' => 'add_wpr_imagedimensions_query_arg', + 'wp_rocket_upgrade' => [ 'warm_up_on_update', 10, 2 ], + 'rocket_after_clear_performance_hints_data' => 'warm_up_home', + 'rocket_job_warmup' => 'warm_up', + 'rocket_job_warmup_url' => 'send_to_saas', + 'rocket_saas_api_queued_url' => 'add_wpr_imagedimensions_query_arg', ]; } diff --git a/inc/Engine/Media/AboveTheFold/Admin/Controller.php b/inc/Engine/Media/AboveTheFold/Admin/Controller.php deleted file mode 100644 index 0cb2f8bdac..0000000000 --- a/inc/Engine/Media/AboveTheFold/Admin/Controller.php +++ /dev/null @@ -1,184 +0,0 @@ -table = $table; - $this->query = $query; - $this->context = $context; - } - - /** - * Truncate delete ATF DB table. - * - * @return void - */ - public function truncate_atf() { - if ( ! $this->context->is_allowed() ) { - return; - } - - $this->delete_rows(); - } - - /** - * Deletes the rows from the table - * - * @return void - */ - private function delete_rows() { - if ( 0 < $this->query->get_not_completed_count() ) { - $this->table->remove_all_completed_rows(); - return; - } - - $this->table->truncate_table(); - - /** - * Fires after clearing lcp & atf data. - */ - do_action( 'rocket_after_clear_atf' ); - } - - /** - * Delete ATF row on update Post or delete post. - * - * @param int $post_id The post ID. - * - * @return void - */ - public function delete_post_atf( $post_id ) { - if ( ! $this->context->is_allowed() ) { - return; - } - - $url = get_permalink( $post_id ); - - if ( false === $url ) { - return; - } - - $this->query->delete_by_url( untrailingslashit( $url ) ); - } - - /** - * Deletes the ATF when updating a term - * - * @param int $term_id the term ID. - * - * @return void - */ - public function delete_term_atf( $term_id ) { - if ( ! $this->context->is_allowed() ) { - return; - } - - $url = get_term_link( (int) $term_id ); - - if ( is_wp_error( $url ) ) { - return; - } - - $this->query->delete_by_url( untrailingslashit( $url ) ); - } - - /** - * Deletes rows when triggering clean from admin - * - * @param array $clean An array containing the status and message. - * - * @return array - */ - public function truncate_atf_admin( $clean ) { - if ( ! $this->context->is_allowed() ) { - return $clean; - } - - if ( ! current_user_can( 'rocket_manage_options' ) ) { - return [ - 'status' => 'die', - ]; - } - - $this->delete_rows(); - - return [ - 'status' => 'success', - 'message' => sprintf( - // translators: %1$s = plugin name. - __( '%1$s: Critical images cleared!', 'rocket' ), - 'WP Rocket' - ), - ]; - } - - /** - * Cleans rows for the current URL. - * - * @return void - */ - public function clean_url() { - if ( ! current_user_can( 'rocket_manage_options' ) ) { - wp_nonce_ays( '' ); - } - - $url = wp_get_referer(); - - if ( 0 !== strpos( $url, 'http' ) ) { - $parse_url = get_rocket_parse_url( untrailingslashit( home_url() ) ); - $url = $parse_url['scheme'] . '://' . $parse_url['host'] . $url; - } - - $this->query->delete_by_url( untrailingslashit( $url ) ); - } - - /** - * Truncate ATF table on update to 3.16.1.1 and higher - * - * @param string $new_version New plugin version. - * @param string $old_version Old plugin version. - * - * @return void - */ - public function truncate_on_update( $new_version, $old_version ) { - if ( version_compare( $old_version, '3.16.1', '>=' ) ) { - return; - } - - $this->truncate_atf(); - } -} diff --git a/inc/Engine/Media/AboveTheFold/Admin/Subscriber.php b/inc/Engine/Media/AboveTheFold/Admin/Subscriber.php deleted file mode 100644 index e18e608fc2..0000000000 --- a/inc/Engine/Media/AboveTheFold/Admin/Subscriber.php +++ /dev/null @@ -1,109 +0,0 @@ -controller = $controller; - } - - /** - * Array of events this subscriber listens to - * - * @return array - */ - public static function get_subscribed_events(): array { - return [ - 'switch_theme' => 'truncate_atf', - 'permalink_structure_changed' => 'truncate_atf', - 'rocket_domain_options_changed' => 'truncate_atf', - 'wp_trash_post' => 'delete_post_atf', - 'delete_post' => 'delete_post_atf', - 'clean_post_cache' => 'delete_post_atf', - 'wp_update_comment_count' => 'delete_post_atf', - 'edit_term' => 'delete_term_atf', - 'pre_delete_term' => 'delete_term_atf', - 'rocket_saas_clean_all' => 'truncate_atf_admin', - 'rocket_saas_clean_url' => 'clean_url', - 'wp_rocket_upgrade' => [ 'truncate_on_update', 10, 2 ], - ]; - } - - /** - * Truncate delete ATF DB table. - * - * @return void - */ - public function truncate_atf() { - $this->controller->truncate_atf(); - } - - /** - * Delete ATF row on update Post or delete post. - * - * @param int $post_id The post ID. - * - * @return void - */ - public function delete_post_atf( $post_id ) { - $this->controller->delete_post_atf( $post_id ); - } - - /** - * Delete ATF row on update or delete term. - * - * @param int $term_id the term ID. - * - * @return void - */ - public function delete_term_atf( $term_id ) { - $this->controller->delete_term_atf( $term_id ); - } - - /** - * Deletes rows when triggering clean from admin - * - * @param array $clean An array containing the status and message. - * - * @return array - */ - public function truncate_atf_admin( $clean ) { - return $this->controller->truncate_atf_admin( $clean ); - } - - /** - * Cleans rows for the current URL. - * - * @return void - */ - public function clean_url() { - $this->controller->clean_url(); - } - - /** - * Truncate ATF table on update to 3.16.1 and higher - * - * @param string $new_version New plugin version. - * @param string $old_version Old plugin version. - * - * @return void - */ - public function truncate_on_update( $new_version, $old_version ) { - $this->controller->truncate_on_update( $new_version, $old_version ); - } -} diff --git a/inc/Engine/Media/AboveTheFold/Factory.php b/inc/Engine/Media/AboveTheFold/Factory.php index 8121410c17..8748af6095 100644 --- a/inc/Engine/Media/AboveTheFold/Factory.php +++ b/inc/Engine/Media/AboveTheFold/Factory.php @@ -49,7 +49,7 @@ class Factory implements FactoryInterface { protected $context; /** - * Instatiate the class. + * Instantiate the class. * * @param AjaxControllerInterface $ajax_controller ATF AJAX Controller instance. * @param FrontendControllerInterface $frontend_controller ATF Frontend Controller instance. diff --git a/inc/Engine/Media/AboveTheFold/ServiceProvider.php b/inc/Engine/Media/AboveTheFold/ServiceProvider.php index 4bbd3428a5..55c1f4999f 100644 --- a/inc/Engine/Media/AboveTheFold/ServiceProvider.php +++ b/inc/Engine/Media/AboveTheFold/ServiceProvider.php @@ -4,7 +4,6 @@ namespace WP_Rocket\Engine\Media\AboveTheFold; use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; -use WP_Rocket\Engine\Media\AboveTheFold\Admin\{Controller as AdminController, Subscriber as AdminSubscriber}; use WP_Rocket\Engine\Media\AboveTheFold\AJAX\Controller as AJAXController; use WP_Rocket\Engine\Media\AboveTheFold\Context\Context; use WP_Rocket\Engine\Media\AboveTheFold\Database\Tables\AboveTheFold as ATFTable; @@ -27,10 +26,7 @@ class ServiceProvider extends AbstractServiceProvider { 'atf_context', 'atf_controller', 'atf_subscriber', - 'atf_admin_controller', - 'atf_admin_subscriber', 'atf_ajax_controller', - 'atf_ajax_subscriber', 'atf_factory', ]; @@ -68,12 +64,6 @@ public function register(): void { $this->getContainer()->addShared( 'atf_subscriber', FrontSubscriber::class ) ->addArgument( $this->getContainer()->get( 'atf_controller' ) ); - $this->getContainer()->add( 'atf_admin_controller', AdminController::class ) - ->addArgument( $this->getContainer()->get( 'atf_table' ) ) - ->addArgument( $this->getContainer()->get( 'atf_query' ) ) - ->addArgument( $this->getContainer()->get( 'atf_context' ) ); - $this->getContainer()->addShared( 'atf_admin_subscriber', AdminSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'atf_admin_controller' ) ); $this->getContainer()->add( 'atf_ajax_controller', AJAXController::class ) ->addArguments( diff --git a/inc/Plugin.php b/inc/Plugin.php index e95487ade0..8eca0c6366 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -386,9 +386,7 @@ private function init_common_subscribers() { 'wpgeotargeting', 'lazyload_css_subscriber', 'weglot', - 'atf_subscriber', 'cron_subscriber', - 'atf_admin_subscriber', 'contactform7', 'debug_subscriber', 'rucss_cron_subscriber', @@ -397,6 +395,7 @@ private function init_common_subscribers() { 'performance_hints_frontend_subscriber', 'performance_hints_cron_subscriber', 'performance_hints_warmup_subscriber', + 'performance_hints_admin_subscriber', ]; $host_type = HostResolver::get_host_service(); diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/deletePost.php similarity index 90% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/deletePost.php index b37bab0f12..53e1eb6483 100644 --- a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/deletePost.php @@ -6,6 +6,9 @@ 'filter' => false, 'post_id' => 1, 'url' => 'http://example.org', + 'factories' => [ + 'get_admin_controller' + ] ], 'expected' => false, ], diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/deleteTerm.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/deleteTerm.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateTables.php similarity index 100% rename from tests/Fixtures/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php rename to tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateTables.php diff --git a/tests/Integration/DBTrait.php b/tests/Integration/DBTrait.php index 22da2731d6..5358318c9a 100644 --- a/tests/Integration/DBTrait.php +++ b/tests/Integration/DBTrait.php @@ -131,7 +131,9 @@ public static function uninstallAtfTable() { $container = apply_filters( 'rocket_container', null ); $atf_table = $container->get( 'atf_table' ); - $atf_table->uninstall(); + if ( $atf_table->exists() ) { + $atf_table->uninstall(); + } } public static function removeDBHooks() { diff --git a/tests/Integration/bootstrap.php b/tests/Integration/bootstrap.php index ec45e1775b..7ce0f0af88 100644 --- a/tests/Integration/bootstrap.php +++ b/tests/Integration/bootstrap.php @@ -17,6 +17,9 @@ 'muplugins_loaded', function() { + // Disable ATF optimization to prevent DB request (unrelated to other tests). + add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); + if ( BootstrapManager::isGroup( 'TranslatePress' ) ) { require WP_ROCKET_TESTS_FIXTURES_DIR . '/classes/TRP_Translate_Press.php'; require WP_ROCKET_TESTS_FIXTURES_DIR . '/classes/TRP_Url_Converter.php'; @@ -259,6 +262,10 @@ function() { $_SERVER[ 'GROUPONE_BRAND_NAME'] = 'proisp.no'; } + if ( BootstrapManager::isGroup( 'PerformanceHints' ) ) { + add_filter( 'rocket_above_the_fold_optimization', '__return_true' ); + } + // Load the plugin. require WP_ROCKET_PLUGIN_ROOT . '/wp-rocket.php'; } diff --git a/tests/Integration/inc/Engine/Admin/Settings/Subscriber/enableSeparateCacheFilesMobile.php b/tests/Integration/inc/Engine/Admin/Settings/Subscriber/enableSeparateCacheFilesMobile.php index adf3601100..9dfc231025 100644 --- a/tests/Integration/inc/Engine/Admin/Settings/Subscriber/enableSeparateCacheFilesMobile.php +++ b/tests/Integration/inc/Engine/Admin/Settings/Subscriber/enableSeparateCacheFilesMobile.php @@ -15,14 +15,10 @@ public function set_up() { parent::set_up(); $this->unregisterAllCallbacksExcept( 'wp_rocket_upgrade', 'enable_separate_cache_files_mobile', 10 ); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { parent::tear_down(); - - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); $this->restoreWpHook( 'wp_rocket_upgrade' ); } diff --git a/tests/Integration/inc/Engine/CDN/Subscriber/rewriteSrcset.php b/tests/Integration/inc/Engine/CDN/Subscriber/rewriteSrcset.php index 4c147d0b85..7f53d9e8b6 100644 --- a/tests/Integration/inc/Engine/CDN/Subscriber/rewriteSrcset.php +++ b/tests/Integration/inc/Engine/CDN/Subscriber/rewriteSrcset.php @@ -10,19 +10,6 @@ * @group CDN */ class Test_RewriteSrcset extends TestCase { - public function set_up() { - parent::set_up(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - } - - public function tear_down() { - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - - parent::tear_down(); - } - /** * @dataProvider configTestData */ diff --git a/tests/Integration/inc/Engine/Cache/AdminSubscriber/addPurgeTermLink.php b/tests/Integration/inc/Engine/Cache/AdminSubscriber/addPurgeTermLink.php index 258ded6c35..ed2d7049b2 100644 --- a/tests/Integration/inc/Engine/Cache/AdminSubscriber/addPurgeTermLink.php +++ b/tests/Integration/inc/Engine/Cache/AdminSubscriber/addPurgeTermLink.php @@ -16,11 +16,7 @@ class Test_AddPurgeTermLink extends AdminTestCase { private $tag; public function tear_down() { - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); wp_delete_term( $this->tag->term_id, 'post_tag' ); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/Cache/Config/ConfigSubscriber/changeCacheRejectUriWithPermalink.php b/tests/Integration/inc/Engine/Cache/Config/ConfigSubscriber/changeCacheRejectUriWithPermalink.php index 0356e600b9..1a6a0e21d1 100644 --- a/tests/Integration/inc/Engine/Cache/Config/ConfigSubscriber/changeCacheRejectUriWithPermalink.php +++ b/tests/Integration/inc/Engine/Cache/Config/ConfigSubscriber/changeCacheRejectUriWithPermalink.php @@ -15,18 +15,12 @@ public function set_up() { // Install the preload cache table to prevent DB error caused by permalink changed. self::installPreloadCacheTable(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { // Uninstall the preload cache table. self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/maybePurgeCacheOnTermChange.php b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/maybePurgeCacheOnTermChange.php index f8757acaa3..21d18eb576 100644 --- a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/maybePurgeCacheOnTermChange.php +++ b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/maybePurgeCacheOnTermChange.php @@ -26,15 +26,9 @@ public function set_up() { 'publicly_queryable' => false, ] ); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - unregister_taxonomy( 'not_public' ); unset( $GLOBALS['sitepress'], $GLOBALS['q_config'], $GLOBALS['polylang'] ); unset( $GLOBALS['debug_fs'] ); diff --git a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeCacheRejectUriPartially.php b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeCacheRejectUriPartially.php index 36a50cecfb..ac2160521e 100644 --- a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeCacheRejectUriPartially.php +++ b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeCacheRejectUriPartially.php @@ -19,9 +19,6 @@ public function set_up() { // Install the preload cache table to prevent DB error caused by permalink changed. self::installPreloadCacheTable(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->set_permalink_structure( '/%postname%/' ); } @@ -29,9 +26,6 @@ public function tear_down() { // Uninstall the preload cache table. self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeDatesArchives.php b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeDatesArchives.php index 14dd2c7f52..a6f26b55ab 100644 --- a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeDatesArchives.php +++ b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgeDatesArchives.php @@ -32,9 +32,6 @@ public function set_up() { // Install the preload cache table to prevent DB error caused by permalink changed. self::installPreloadCacheTable(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - wp_set_current_user( self::$user_id ); $this->set_permalink_structure( "/%postname%/" ); set_current_screen( 'edit.php' ); @@ -44,9 +41,6 @@ public function tear_down() { // Uninstall the preload cache table. self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - set_current_screen( 'front' ); parent::tear_down(); diff --git a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgePostTermsUrls.php b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgePostTermsUrls.php index 0cccb9bab3..6184e266c8 100644 --- a/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgePostTermsUrls.php +++ b/tests/Integration/inc/Engine/Cache/PurgeActionsSubscriber/purgePostTermsUrls.php @@ -31,9 +31,6 @@ public function set_up() { // Install the preload cache table to prevent DB error caused by permalink changed. self::installPreloadCacheTable(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - wp_set_current_user( self::$user_id ); $this->set_permalink_structure( "/%postname%/" ); } @@ -42,9 +39,6 @@ public function tear_down() { // Uninstall the preload cache table. self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - parent::tear_down(); } diff --git a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronCleanRows.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronCleanRows.php index 86dc8eb408..47d27522b4 100644 --- a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronCleanRows.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronCleanRows.php @@ -30,17 +30,11 @@ public function set_up() { parent::set_up(); self::installPreloadCacheTable(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'rocket_saas_delete_interval', [ $this, 'set_rucss_delay' ] ); remove_filter( 'pre_get_rocket_option_remove_unused_css', [ $this, 'set_rucss_option' ] ); diff --git a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronRemoveFailedJobs.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronRemoveFailedJobs.php index 6e66da2840..e535e8ca41 100644 --- a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronRemoveFailedJobs.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/cronRemoveFailedJobs.php @@ -19,18 +19,12 @@ public function set_up() { self::installUsedCssTable(); self::installPreloadCacheTable(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - add_filter( 'pre_http_request', [ $this, 'edit_http_request' ], 10, 3 ); } public function tear_down() { self::uninstallUsedCssTable(); self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'pre_http_request', [$this, 'edit_http_request' ] ); remove_filter( 'pre_get_rocket_option_remove_unused_css', [ $this, 'set_rucss_option' ] ); parent::tear_down(); diff --git a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/processOnSubmitJobs.php b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/processOnSubmitJobs.php index c99ec0e95a..f000b0c263 100644 --- a/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/processOnSubmitJobs.php +++ b/tests/Integration/inc/Engine/Common/JobManager/Cron/Subscriber/processOnSubmitJobs.php @@ -22,9 +22,6 @@ public function set_up() { self::installUsedCssTable(); self::installPreloadCacheTable(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - add_filter( 'rocket_saas_max_pending_jobs', [ $this, 'max_rows' ] ); add_filter( 'pre_get_rocket_option_remove_unused_css', [ $this, 'rucss_enabled' ] ); $this->setup_http(); @@ -34,9 +31,6 @@ public function tear_down() { self::uninstallUsedCssTable(); self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->tear_down_http(); remove_filter( 'rocket_saas_max_pending_jobs', [ $this, 'max_rows' ] ); diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php index c14020831c..8656a0bdf2 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php @@ -12,10 +12,21 @@ class Test_AddData extends AjaxTestCase { private $allowed; - public function set_up() { - parent::set_up(); + public static function set_up_before_class() { + parent::set_up_before_class(); + // Install in set_up_before_class because of exists(). self::installAtfTable(); + } + + public static function tear_down_after_class() { + self::uninstallAtfTable(); + + parent::tear_down_after_class(); + } + + public function set_up() { + parent::set_up(); $this->action = 'rocket_beacon'; } @@ -26,8 +37,6 @@ public function set_up() { * @return void */ public function tear_down() { - self::uninstallAtfTable(); - remove_filter( 'rocket_above_the_fold_optimization', [ $this, 'set_allowed' ] ); parent::tear_down(); diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php index e66b937040..14f3a987c5 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php @@ -12,10 +12,21 @@ class Test_CheckData extends AjaxTestCase { private $allowed; - public function set_up() { - parent::set_up(); + public static function set_up_before_class() { + parent::set_up_before_class(); + // Install in set_up_before_class because of exists(). self::installAtfTable(); + } + + public static function tear_down_after_class() { + self::uninstallAtfTable(); + + parent::tear_down_after_class(); + } + + public function set_up() { + parent::set_up(); $this->action = 'rocket_check_beacon'; } @@ -26,8 +37,6 @@ public function set_up() { * @return void */ public function tear_down() { - self::uninstallAtfTable(); - remove_filter( 'rocket_above_the_fold_optimization', [ $this, 'set_allowed' ] ); parent::tear_down(); diff --git a/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php similarity index 69% rename from tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php rename to tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php index 5461c94f3b..a436239615 100644 --- a/tests/Integration/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtfAdmin.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php @@ -1,19 +1,17 @@ once()->with('rocket_manage_options')->andReturn($config['rocket_manage_options']); - do_action( 'rocket_saas_clean_all' ); + do_action( 'rocket_saas_clean_all', [] ); $atf_query = $container->get( 'atf_query' ); $result_atf_after_clean = $atf_query->query(); $this->assertCount( $expected, $result_atf_after_clean ); if ( ! $expected ) { - $this->assertSame( 1, did_action( 'rocket_after_clear_atf' ) ); + $this->assertSame( 1, did_action( 'rocket_after_clear_performance_hints_data' ) ); } - } } diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php index 9eb5d04e63..e1e7cf8f8f 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php @@ -18,16 +18,17 @@ class Test_Cleanup extends TestCase { */ protected $config; - public function set_up() { - parent::set_up(); + public static function set_up_before_class() { + parent::set_up_before_class(); - parent::installAtfTable(); + // Install in set_up_before_class because of exists(). + self::installAtfTable(); } - public function tear_down() { - parent::uninstallAtfTable(); + public static function tear_down_after_class() { + self::uninstallAtfTable(); - parent::tear_down(); + parent::tear_down_after_class(); } /** diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php index 3710993dd7..1c88771b2a 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php @@ -15,17 +15,26 @@ class Test_maybe_apply_optimizations extends FilesystemTestCase { protected $config; - public function set_up() { - parent::set_up(); + public static function set_up_before_class() { + parent::set_up_before_class(); + // Install in set_up_before_class because of exists(). self::installAtfTable(); + } + + public static function tear_down_after_class() { + self::uninstallAtfTable(); + + parent::tear_down_after_class(); + } + + public function set_up() { + parent::set_up(); $this->unregisterAllCallbacksExcept( 'rocket_buffer', 'maybe_apply_optimizations', 17 ); } public function tear_down() { - self::uninstallAtfTable(); - remove_filter( 'rocket_performance_hints_optimization_delay', [ $this, 'add_delay' ] ); $this->restoreWpHook( 'rocket_buffer' ); diff --git a/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/getCriticalCssContent.php b/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/getCriticalCssContent.php index f499f659ca..a997eaeaec 100644 --- a/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/getCriticalCssContent.php +++ b/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/getCriticalCssContent.php @@ -45,9 +45,6 @@ public static function set_up_before_class() { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - add_filter( 'wp_is_mobile', [ $this, 'is_mobile' ] ); add_filter( 'pre_get_rocket_option_do_caching_mobile_files', [ $this, 'cache_mobile' ] ); add_filter( 'pre_get_rocket_option_async_css_mobile', [ $this, 'async_css_mobile' ] ); @@ -58,9 +55,6 @@ public function set_up() { } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'wp_is_mobile', [ $this, 'is_mobile' ] ); remove_filter( 'pre_get_rocket_option_do_caching_mobile_files', [ $this, 'cache_mobile' ] ); remove_filter( 'pre_get_rocket_option_async_css_mobile', [ $this, 'async_css_mobile' ] ); diff --git a/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/processHandler.php b/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/processHandler.php index 3a56587dd1..29a47cf748 100644 --- a/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/processHandler.php +++ b/tests/Integration/inc/Engine/CriticalPath/CriticalCSS/processHandler.php @@ -31,8 +31,6 @@ class Test_ProcessHandler extends FilesystemTestCase { public function set_up() { parent::set_up(); - self::installAtfTable(); - $this->to_be_removed = [ 'filters' => [], 'transients' => [], @@ -52,7 +50,6 @@ public function set_up() { } public function tear_down() { - self::uninstallAtfTable(); foreach ( $this->to_be_removed as $item_name => $item ) { switch ( $item_name ) { diff --git a/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/deleteCpcss.php b/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/deleteCpcss.php index 262da98bb1..cd7fd304f4 100644 --- a/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/deleteCpcss.php +++ b/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/deleteCpcss.php @@ -22,9 +22,6 @@ class Test_DeleteCpcss extends FilesystemTestCase { private static $post_id; public static function wpSetUpBeforeClass( $factory ) { - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - self::$post_id = $factory->post->create(); // Re-enable ATF optimization. @@ -34,9 +31,6 @@ public static function wpSetUpBeforeClass( $factory ) { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - add_filter( 'pre_get_rocket_option_async_css', [ $this, 'async_css' ] ); add_filter( 'pre_get_rocket_option_async_css_mobile', [ $this, 'async_css_mobile' ] ); } diff --git a/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/insertCriticalCssBuffer.php b/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/insertCriticalCssBuffer.php index 4107912526..a98a642058 100644 --- a/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/insertCriticalCssBuffer.php +++ b/tests/Integration/inc/Engine/CriticalPath/CriticalCSSSubscriber/insertCriticalCssBuffer.php @@ -38,18 +38,12 @@ public static function wpSetUpBeforeClass( $factory ) { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - add_filter( 'pre_get_rocket_option_async_css', [ $this, 'return_1' ] ); wp_set_current_user( self::$user_id ); set_current_screen( 'front' ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->reset_post_types(); $this->reset_taxonomies(); diff --git a/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/delete.php b/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/delete.php index 20017d1f4a..dda0dc5a67 100644 --- a/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/delete.php +++ b/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/delete.php @@ -44,15 +44,9 @@ public static function tear_down_after_class() { public function set_up() { parent::set_up(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'pre_get_rocket_option_async_css_mobile', [ $this, 'async_css_mobile_cb' ] ); $admin = get_role( 'administrator' ); diff --git a/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php b/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php index c00e5e1d64..1f568ad1cf 100644 --- a/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php +++ b/tests/Integration/inc/Engine/CriticalPath/RESTWPPost/generate.php @@ -19,26 +19,14 @@ class Test_Generate extends RESTVfsTestCase { private $do_caching_mobile_files; public static function wpSetUpBeforeClass( $factory ) { - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - self::$post_id = $factory->post->create(); - - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function set_up() { parent::set_up(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'pre_get_rocket_option_async_css_mobile', [ $this, 'setAsyncCssMobileOption' ] ); remove_filter( 'pre_get_rocket_option_do_caching_mobile_files', [ $this, 'setDoCachingMobileFilesOption' ] ); diff --git a/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/excludeRocketLazyloadExcludedSrc.php b/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/excludeRocketLazyloadExcludedSrc.php index f1eb8caf88..fa11785460 100644 --- a/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/excludeRocketLazyloadExcludedSrc.php +++ b/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/excludeRocketLazyloadExcludedSrc.php @@ -15,16 +15,10 @@ class Test_ExcludeRocketLazyloadExcludedSrc extends TestCase { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - add_filter( 'rocket_lazyload_excluded_src', [ $this, 'rocket_lazyload_excluded_src' ] ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'rocket_lazyload_excluded_src', [ $this, 'rocket_lazyload_excluded_src' ] ); parent::tear_down(); diff --git a/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/maybeReplaceCssImages.php b/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/maybeReplaceCssImages.php index 6fe054ea9b..dec107d61c 100644 --- a/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/maybeReplaceCssImages.php +++ b/tests/Integration/inc/Engine/Media/Lazyload/CSS/Subscriber/maybeReplaceCssImages.php @@ -18,9 +18,6 @@ class Test_MaybeReplaceCssImages extends FilesystemTestCase { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->unregisterAllCallbacksExcept('rocket_buffer', 'maybe_replace_css_images', 1002); add_filter('pre_get_rocket_option_lazyload_css_bg_img', [$this, 'lazyload_css_bg_img']); @@ -30,9 +27,6 @@ public function set_up() { } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter('pre_http_request', [$this, 'mock_http']); remove_filter('rocket_lazyload_excluded_src', [$this, 'exclude_lazyload']); remove_filter('pre_get_rocket_option_lazyload_css_bg_img', [$this, 'lazyload_css_bg_img']); diff --git a/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/addExclusions.php b/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/addExclusions.php index 012a12f6de..31a9861421 100644 --- a/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/addExclusions.php +++ b/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/addExclusions.php @@ -15,15 +15,9 @@ class Test_AddExclusions extends TestCase { public function set_up() { parent::set_up(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'pre_get_rocket_option_exclude_lazyload', [ $this, 'set_option_exclusions' ] ); parent::tear_down(); diff --git a/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/lazyload.php b/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/lazyload.php index 3a176672cd..04fe15a980 100644 --- a/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/lazyload.php +++ b/tests/Integration/inc/Engine/Media/Lazyload/Subscriber/lazyload.php @@ -18,9 +18,6 @@ class Test_Lazyload extends TestCase { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->lazyload = null; $this->iframes = null; @@ -28,9 +25,6 @@ public function set_up() { } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'pre_get_rocket_option_lazyload', [ $this, 'setLazyload' ] ); remove_filter( 'pre_get_rocket_option_lazyload_iframes', [ $this, 'setIframes' ] ); remove_filter( 'rocket_use_native_lazyload_images', [ $this, 'return_false' ] ); diff --git a/tests/Integration/inc/ThirdParty/Hostings/Pressidium/cleanPost.php b/tests/Integration/inc/ThirdParty/Hostings/Pressidium/cleanPost.php index 8e1ebce2b3..2f5fa4a61b 100644 --- a/tests/Integration/inc/ThirdParty/Hostings/Pressidium/cleanPost.php +++ b/tests/Integration/inc/ThirdParty/Hostings/Pressidium/cleanPost.php @@ -17,16 +17,10 @@ class Test_CleanPost extends TestCase { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->ninukis_caching = Mockery::mock( 'overload:' . NinukisCaching::class ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - parent::tear_down(); } diff --git a/tests/Integration/inc/ThirdParty/Hostings/SpinUpWP/removeActions.php b/tests/Integration/inc/ThirdParty/Hostings/SpinUpWP/removeActions.php index ac91958cb8..593fc8fbc6 100644 --- a/tests/Integration/inc/ThirdParty/Hostings/SpinUpWP/removeActions.php +++ b/tests/Integration/inc/ThirdParty/Hostings/SpinUpWP/removeActions.php @@ -11,20 +11,6 @@ * @group ThirdParty */ class Test_RemoveActions extends TestCase { - public function set_up() { - parent::set_up(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - } - - public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - - parent::tear_down(); - } - public function testShouldRemoveRocketRegisteredActions() { Functions\expect( 'rocket_clean_domain' )->never(); diff --git a/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showEmptyProductGalleryWithDelayJS.php b/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showEmptyProductGalleryWithDelayJS.php index b1aa0f3211..6ac6c876e8 100644 --- a/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showEmptyProductGalleryWithDelayJS.php +++ b/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showEmptyProductGalleryWithDelayJS.php @@ -20,17 +20,11 @@ class Test_ShowEmptyProductGalleryWithDelayJS extends TestCase { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->product_without_gallery = $this->create_product(); $this->product_with_gallery = $this->create_product( [1, 2, 3] ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - remove_filter( 'pre_get_rocket_option_delay_js', [ $this, 'set_delay_js' ] ); $this->restoreWpHook( 'wp_head' ); diff --git a/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showNotemptyProductGalleryWithDelayJS.php b/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showNotemptyProductGalleryWithDelayJS.php index 560aba564c..f335944254 100644 --- a/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showNotemptyProductGalleryWithDelayJS.php +++ b/tests/Integration/inc/ThirdParty/Plugins/Ecommerce/WooCommerceSubscriber/showNotemptyProductGalleryWithDelayJS.php @@ -22,9 +22,6 @@ public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->product_without_gallery = $this->create_product(); $this->product_with_gallery = $this->create_product( [1, 2, 3] ); @@ -34,9 +31,6 @@ public function set_up() { public function tear_down() { global $wp_version; - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $wp_version = $this->wp_version; remove_filter( 'pre_get_rocket_option_delay_js', [ $this, 'set_delay_js' ] ); diff --git a/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php b/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php index 3efe95e7db..2b9b5391f0 100644 --- a/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php +++ b/tests/Integration/inc/ThirdParty/Themes/Divi/disableImageDimensionsHeightPercentage.php @@ -19,9 +19,6 @@ class Test_DisableImageDimensionsHeightPercentage extends WPThemeTestcase { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->container = apply_filters( 'rocket_container', '' ); $this->event = $this->container->get( 'event_manager' ); @@ -31,9 +28,6 @@ public function set_up() { } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->event->remove_subscriber( $this->subscriber ); $this->restoreWpHook( 'rocket_buffer' ); diff --git a/tests/Integration/inc/ThirdParty/Themes/Divi/handleSaveTemplate.php b/tests/Integration/inc/ThirdParty/Themes/Divi/handleSaveTemplate.php index 4ece6d65c4..4d6e5c69ae 100644 --- a/tests/Integration/inc/ThirdParty/Themes/Divi/handleSaveTemplate.php +++ b/tests/Integration/inc/ThirdParty/Themes/Divi/handleSaveTemplate.php @@ -41,9 +41,6 @@ public static function tear_down_after_class() { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->container = apply_filters( 'rocket_container', '' ); $this->event = $this->container->get( 'event_manager' ); @@ -51,9 +48,6 @@ public function set_up() { } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->event->remove_subscriber( $this->subscriber ); remove_filter( 'pre_option_stylesheet', [ $this, 'set_stylesheet' ] ); diff --git a/tests/Integration/inc/ThirdParty/Themes/Divi/removeAssetsGenerated.php b/tests/Integration/inc/ThirdParty/Themes/Divi/removeAssetsGenerated.php index 60b931bea5..a6098aefd8 100644 --- a/tests/Integration/inc/ThirdParty/Themes/Divi/removeAssetsGenerated.php +++ b/tests/Integration/inc/ThirdParty/Themes/Divi/removeAssetsGenerated.php @@ -20,17 +20,11 @@ class TestRemoveAssetsGenerated extends WPThemeTestcase { public function set_up() { parent::set_up(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->container = apply_filters( 'rocket_container', '' ); $this->event = $this->container->get( 'event_manager' ); } public function tear_down() { - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->event->remove_subscriber( $this->subscriber ); parent::tear_down(); diff --git a/tests/Integration/inc/common/doAdminPostRocketPurgeCache.php b/tests/Integration/inc/common/doAdminPostRocketPurgeCache.php index 1f67eb27e4..ec5c3dde2b 100644 --- a/tests/Integration/inc/common/doAdminPostRocketPurgeCache.php +++ b/tests/Integration/inc/common/doAdminPostRocketPurgeCache.php @@ -54,17 +54,11 @@ public static function tear_down_after_class() { public function set_up() { parent::set_up(); - - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); } public function tear_down() { parent::tear_down(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - foreach ( array_keys( self::$original_transients ) as $transient ) { delete_transient( $transient ); } diff --git a/tests/Integration/inc/common/rocketCleanPostCacheOnSlugChange.php b/tests/Integration/inc/common/rocketCleanPostCacheOnSlugChange.php index 40dc64acf2..a09010ebd5 100644 --- a/tests/Integration/inc/common/rocketCleanPostCacheOnSlugChange.php +++ b/tests/Integration/inc/common/rocketCleanPostCacheOnSlugChange.php @@ -40,9 +40,6 @@ public function set_up() { // Install the preload cache table to prevent DB error caused by permalink changed. self::installPreloadCacheTable(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - wp_set_current_user( self::$user_id ); $this->original_post = self::factory()->post->create_and_get( [ @@ -59,9 +56,6 @@ public function tear_down() { // Uninstall the preload cache table. self::uninstallPreloadCacheTable(); - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - parent::tear_down(); } diff --git a/tests/Integration/inc/functions/getRocketSamplePermalink.php b/tests/Integration/inc/functions/getRocketSamplePermalink.php index 0124efd7b2..6d7b496555 100644 --- a/tests/Integration/inc/functions/getRocketSamplePermalink.php +++ b/tests/Integration/inc/functions/getRocketSamplePermalink.php @@ -19,18 +19,12 @@ public function set_up() { // Install the preload cache table to prevent DB error caused by permalink changed. self::installPreloadCacheTable(); - // Disable ATF optimization to prevent DB request (unrelated to the test). - add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - $this->did_filter = [ 'editable_slug' => 0 ]; } public function tear_down() { // Uninstall the preload cache table. self::uninstallPreloadCacheTable(); - - // Re-enable ATF optimization. - remove_filter( 'rocket_above_the_fold_optimization', '__return_false' ); remove_filter( 'editable_slug', [ $this, 'editable_slug_cb' ] ); parent::tear_down(); diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deletePost.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deletePost.php new file mode 100644 index 0000000000..1c244493ef --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deletePost.php @@ -0,0 +1,52 @@ +queries = $this->createMock(AboveTheFold::class); + $atf_factory = $this->createMock(ATFFactory::class); + $atf_factory->method('queries')->willReturn($this->queries); + + $this->factories = [ + $atf_factory, + ]; + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + $controller = new Controller( ! $config['filter'] ? [] : $this->factories ); + + Functions\when( 'get_permalink' )->justReturn( $config['url'] ); + + if ( $expected ) { + $this->queries->expects( $this->once() ) + ->method( 'delete_by_url' ) + ->with( $config['url'] ); + } else { + $this->queries->expects( $this->never() ) + ->method( 'delete_by_url' ); + } + + $controller->delete_post( $config['post_id'] ); + } +} diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deleteTerm.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deleteTerm.php new file mode 100644 index 0000000000..0de919700b --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/deleteTerm.php @@ -0,0 +1,53 @@ +queries = $this->createMock(AboveTheFold::class); + $atf_factory = $this->createMock(ATFFactory::class); + $atf_factory->method('queries')->willReturn($this->queries); + + $this->factories = [ + $atf_factory, + ]; + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + $controller = new Controller( ! $config['filter'] ? [] : $this->factories ); + + Functions\when( 'get_term_link' )->justReturn( $config['url'] ); + Functions\when( 'is_wp_error' )->justReturn( ! $expected ); + + if ( $expected ) { + $this->queries->expects( $this->once() ) + ->method( 'delete_by_url' ) + ->with( $config['url'] ); + } else { + $this->queries->expects( $this->never() ) + ->method( 'delete_by_url' ); + } + + $controller->delete_term( $config['term_id'] ); + } +} diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php new file mode 100644 index 0000000000..640353397a --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php @@ -0,0 +1,57 @@ +queries = $this->createMock(AboveTheFold::class); + $this->table = $this->createMock(ATFTable::class); + $atf_factory = $this->createMock(ATFFactory::class); + $atf_factory->method('queries')->willReturn($this->queries); + $atf_factory->method('table')->willReturn($this->table); + + $this->factories = [ + $atf_factory, + ]; + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + $controller = new Controller( ! $config['filter'] ? [] : $this->factories ); + + if ( ! $expected ) { + $this->queries->expects( $this->never() ) + ->method( 'get_not_completed_count' ); + } else { + $this->queries->expects( $this->once() ) + ->method( 'get_not_completed_count' ) + ->willReturn( $config['not_completed'] ); + + $this->table->expects( $this->once() ) + ->method( 'truncate_table' ); + } + + $controller->truncate_on_update( $config['new_version'], $config['old_version'] ); + } +} diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateTables.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateTables.php new file mode 100644 index 0000000000..c2094c22a3 --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateTables.php @@ -0,0 +1,61 @@ +queries = $this->createMock(AboveTheFold::class); + $this->table = $this->createMock(ATFTable::class); + $atf_factory = $this->createMock(ATFFactory::class); + $atf_factory->method('queries')->willReturn($this->queries); + $atf_factory->method('table')->willReturn($this->table); + + $this->factories = [ + $atf_factory, + ]; + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + $controller = new Controller( ! $config['filter'] ? [] : $this->factories ); + + if ( ! $expected ) { + $this->queries->expects( $this->never() ) + ->method( 'get_not_completed_count' ); + } else { + $this->queries->expects( $this->once() ) + ->method( 'get_not_completed_count' ) + ->willReturn( $config['not_completed'] ); + + if ( 'partial' === $expected ) { + $this->table->expects( $this->once() ) + ->method( 'remove_all_completed_rows' ); + } elseif ( 'truncate' === $expected ) { + $this->table->expects( $this->once() ) + ->method( 'truncate_table' ); + } + } + + $controller->truncate_tables(); + } +} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php deleted file mode 100644 index b694e2da65..0000000000 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deletePostAtf.php +++ /dev/null @@ -1,55 +0,0 @@ -query = $this->createMock( ATFQuery::class ); - $this->table = $this->createMock( ATFTable::class ); - $this->context = Mockery::mock( Context::class ); - $this->controller = new Controller( $this->table, $this->query, $this->context ); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoExpected( $config, $expected ) { - $this->context->shouldReceive( 'is_allowed' ) - ->atMost() - ->once() - ->andReturn( $config['filter'] ); - - Functions\when( 'get_permalink' )->justReturn( $config['url'] ); - - if ( $expected ) { - $this->query->expects( $this->once() ) - ->method( 'delete_by_url' ) - ->with( $config['url'] ); - } else { - $this->query->expects( $this->never() ) - ->method( 'delete_by_url' ); - } - - $this->controller->delete_post_atf( $config['post_id'] ); - } -} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php deleted file mode 100644 index 981e6bc130..0000000000 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/deleteTermAtf.php +++ /dev/null @@ -1,56 +0,0 @@ -query = $this->createMock( ATFQuery::class ); - $this->table = $this->createMock( ATFTable::class ); - $this->context = Mockery::mock( Context::class ); - $this->controller = new Controller( $this->table, $this->query, $this->context ); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoExpected( $config, $expected ) { - $this->context->shouldReceive( 'is_allowed' ) - ->atMost() - ->once() - ->andReturn( $config['filter'] ); - - Functions\when( 'get_term_link' )->justReturn( $config['url'] ); - Functions\when( 'is_wp_error' )->justReturn( ! $expected ); - - if ( $expected ) { - $this->query->expects( $this->once() ) - ->method( 'delete_by_url' ) - ->with( $config['url'] ); - } else { - $this->query->expects( $this->never() ) - ->method( 'delete_by_url' ); - } - - $this->controller->delete_term_atf( $config['term_id'] ); - } -} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php deleted file mode 100644 index 71212cbe54..0000000000 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateAtf.php +++ /dev/null @@ -1,60 +0,0 @@ -query = $this->createMock( ATFQuery::class ); - $this->table = $this->createMock( ATFTable::class ); - $this->context = Mockery::mock( Context::class ); - $this->controller = new Controller( $this->table, $this->query, $this->context ); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoExpected( $config, $expected ) { - $this->context->shouldReceive( 'is_allowed' ) - ->atMost() - ->once() - ->andReturn( $config['filter'] ); - - if ( ! $expected ) { - $this->query->expects( $this->never() ) - ->method( 'get_not_completed_count' ); - } else { - $this->query->expects( $this->once() ) - ->method( 'get_not_completed_count' ) - ->willReturn( $config['not_completed'] ); - - if ( 'partial' === $expected ) { - $this->table->expects( $this->once() ) - ->method( 'remove_all_completed_rows' ); - } elseif ( 'truncate' === $expected ) { - $this->table->expects( $this->once() ) - ->method( 'truncate_table' ); - } - } - - $this->controller->truncate_atf(); - } -} diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php b/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php deleted file mode 100644 index e01ee1d638..0000000000 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/Admin/Controller/truncateOnUpdate.php +++ /dev/null @@ -1,56 +0,0 @@ -query = $this->createMock( ATFQuery::class ); - $this->table = $this->createMock( ATFTable::class ); - $this->context = Mockery::mock( Context::class ); - $this->controller = new Controller( $this->table, $this->query, $this->context ); - } - - /** - * @dataProvider configTestData - */ - public function testShouldDoExpected( $config, $expected ) { - $this->context->shouldReceive( 'is_allowed' ) - ->atMost() - ->once() - ->andReturn( $config['filter'] ); - - if ( ! $expected ) { - $this->query->expects( $this->never() ) - ->method( 'get_not_completed_count' ); - } else { - $this->query->expects( $this->once() ) - ->method( 'get_not_completed_count' ) - ->willReturn( $config['not_completed'] ); - - $this->table->expects( $this->once() ) - ->method( 'truncate_table' ); - } - - $this->controller->truncate_on_update( $config['new_version'], $config['old_version'] ); - } -} From baf5fc1471522df78d106e5fafb824e913dabb29 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 1 Aug 2024 08:53:06 +0200 Subject: [PATCH 036/192] Fix phpstan --- inc/Engine/Common/PerformanceHints/Admin/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/Admin/Controller.php b/inc/Engine/Common/PerformanceHints/Admin/Controller.php index 73328c56bc..98abbc6d66 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Controller.php @@ -105,7 +105,7 @@ public function delete_term( $term_id ) { /** * Deletes rows when triggering clean from admin * - * @return array + * @return array|void */ public function truncate_from_admin() { if ( empty( $this->factories ) ) { From 4856c2c5875589ca4c9ddf57e1708f84714d21dd Mon Sep 17 00:00:00 2001 From: WordPress Fan <146129302+wordpressfan@users.noreply.github.com> Date: Thu, 1 Aug 2024 12:35:30 +0300 Subject: [PATCH 037/192] Save lcp images properly in the database - follow up after DB refactoring task (#6830) --- assets/js/wpr-beacon.js | 3 +- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 6 +- .../Frontend/ControllerInterface.php | 4 +- .../PerformanceHints/Frontend/Processor.php | 3 +- .../Media/AboveTheFold/AJAX/Controller.php | 3 +- .../AboveTheFold/Frontend/Controller.php | 8 +- package-lock.json | 303 +++++++++--------- package.json | 2 +- 9 files changed, 173 insertions(+), 161 deletions(-) diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index 7ea86c6642..2c055eff98 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -238,7 +238,8 @@ this.logger.logMessage("Bailing out because screen size is not acceptable"); return false; } - if (Utils_default.isPageCached() && await this._isGeneratedBefore()) { + const generated_before = await this._isGeneratedBefore(); + if (Utils_default.isPageCached() && (this.config.status.atf && generated_before.lcp)) { this.logger.logMessage("Bailing out because data is already available"); return false; } diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index da9bb37938..5fed58578a 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4),(await this._isGeneratedBefore()).lcp||(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()),this._saveFinalResultIntoDB()}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return a.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):a.isPageCached()&&await this._isGeneratedBefore()?(this.logger.logMessage("Bailing out because data is already available"),!1):!0}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); +(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4),(await this._isGeneratedBefore()).lcp||(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()),this._saveFinalResultIntoDB()}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};if(a.isNotValidScreensize(this.config.is_mobile,e))return this.logger.logMessage("Bailing out because screen size is not acceptable"),!1;const i=await this._isGeneratedBefore();return a.isPageCached()&&this.config.status.atf&&i.lcp?(this.logger.logMessage("Bailing out because data is already available"),!1):!0}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 722f40a702..40ba68f23c 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._isGeneratedBefore();\n if (!isGeneratedBefore.lcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n if (Utils_default.isPageCached() && await this._isGeneratedBefore()) {\n this.logger.logMessage(\"Bailing out because data is already available\");\n return false;\n }\n return true;\n }\n async _isGeneratedBefore() {\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], - "mappings": "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", - "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._isGeneratedBefore();\n if (!isGeneratedBefore.lcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n const generated_before = await this._isGeneratedBefore();\n if (Utils_default.isPageCached() && (this.config.status.atf && generated_before.lcp)) {\n this.logger.logMessage(\"Bailing out because data is already available\");\n return false;\n }\n return true;\n }\n async _isGeneratedBefore() {\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], + "mappings": "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", + "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "generated_before", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] } diff --git a/inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php b/inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php index 882f35192a..13c9546ce1 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/ControllerInterface.php @@ -15,11 +15,11 @@ interface ControllerInterface { public function optimize( string $html, $row ): string; /** - * List of elements to be considered for optimization. + * Add custom data like the List of elements to be considered for optimization. * * @param array $data Array of data passed in beacon. * * @return array */ - public function target_elements( array $data ): array; + public function add_custom_data( array $data ): array; } diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index 7debada1f4..bdbfe0ebd8 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -157,12 +157,13 @@ private function inject_beacon( $html, $url, $is_mobile ): string { 'height_threshold' => $height_threshold, 'delay' => $delay, 'debug' => rocket_get_constant( 'WP_ROCKET_DEBUG' ), + 'status' => [], ]; $data_modified = null; foreach ( $this->factories as $factory ) { $data = $data_modified ?? $data; - $data_modified = $factory->get_frontend_controller()->target_elements( $data ); + $data_modified = $factory->get_frontend_controller()->add_custom_data( $data ); } $inline_script = ''; diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php index 24167c4d1b..a78bc73790 100644 --- a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php +++ b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php @@ -60,7 +60,8 @@ public function add_data(): void { $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; - $images = isset( $_POST['lcp_images'] ) ? json_decode( wp_unslash( $_POST['lcp_images'] ) ) : []; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $results = isset( $_POST['results'] ) ? json_decode( wp_unslash( $_POST['results'] ) ) : (object) [ 'lcp' => [] ]; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $images = $results->lcp ?? []; $lcp = 'not found'; $viewport = []; diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php index a580f76ee1..70630615ad 100644 --- a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php +++ b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php @@ -410,13 +410,14 @@ private function generate_source_tags( $lcp, $start_tag, $end_tag ) { } /** - * Returns a comma-separated list of elements to be considered for the lcp/above-the-fold optimization. + * Add custom data like the comma-separated list of elements + * to be considered for the lcp/above-the-fold optimization. * * @param array $data Array of data passed in beacon. * * @return array */ - public function target_elements( array $data ): array { + public function add_custom_data( array $data ): array { $elements = [ 'img', 'video', @@ -447,7 +448,8 @@ public function target_elements( array $data ): array { $elements = array_filter( $elements, 'is_string' ); - $data['elements'] = implode( ', ', $elements ); + $data['elements'] = implode( ', ', $elements ); + $data['status']['atf'] = $this->context->is_allowed(); return $data; } diff --git a/package-lock.json b/package-lock.json index b3754f9d8c..7d020e95ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "watchify": "^4.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.9.1", - "wp-rocket-scripts": "github:wp-media/rocket-scripts#enhancement/beacon-script-refactoring-phase-2", + "wp-rocket-scripts": "^1.0.2-alpha2", "yargs": "^17.3.0" } }, @@ -74,30 +74,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.0.tgz", - "integrity": "sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -171,12 +171,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", "browserslist": "^4.23.1", "lru-cache": "^5.1.1", @@ -208,9 +208,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.0.tgz", - "integrity": "sha512-q0T+dknZS+L5LDazIP+02gEZITG5unzvb6yIjcmj5i0eFrs5ToBV2m2JGH4EsE/gtP8ygEGLGApBgRIZkTm7zg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -267,15 +267,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.0.tgz", - "integrity": "sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -435,10 +435,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", "dev": true, + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -447,13 +450,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", - "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.3" }, "engines": { "node": ">=6.9.0" @@ -1113,12 +1116,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1435,16 +1438,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", - "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -1655,16 +1658,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.0.tgz", - "integrity": "sha512-vYAA8PrCOeZfG4D87hmw1KJ1BPubghXP1e2MacRFwECGNKL76dkA38JEwYllbvQCpf/kLxsTtir0b8MtxKoVCw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.0", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", @@ -1705,9 +1708,9 @@ "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.0", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", @@ -1824,16 +1827,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.1.tgz", - "integrity": "sha512-LrHHoWq08ZpmmFqBAzN+hUdWwy5zt7FGa/hVwMcOqW6OVtwqaoD5utfuGYU87JYxdZgLUvktAsn37j/sYR9siA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.0", + "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1842,9 +1845,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", - "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.24.8", @@ -4017,9 +4020,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001643", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", - "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", + "version": "1.0.30001645", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz", + "integrity": "sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==", "dev": true, "funding": [ { @@ -4714,9 +4717,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.2.tgz", - "integrity": "sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", "dev": true }, "node_modules/elliptic": { @@ -10621,13 +10624,13 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -10636,8 +10639,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -10706,9 +10709,9 @@ }, "node_modules/wp-rocket-scripts": { "version": "1.0.2-alpha2", - "resolved": "git+ssh://git@github.com/wp-media/rocket-scripts.git#13950ab2c353c7974ddc7de916cee7b680b217e0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.2-alpha2.tgz", + "integrity": "sha512-W9vz1b/u7ln/l5TJnROG9wKSR5BnnrYKcJ39oWrgw0ztUCmak7Rwsp9aCFWP5qncFEHDJhh9/Pj28QLn66dU8A==", + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -10852,27 +10855,27 @@ } }, "@babel/compat-data": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.0.tgz", - "integrity": "sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true }, "@babel/core": { - "version": "7.24.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.9.tgz", - "integrity": "sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.9", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-module-transforms": "^7.24.9", - "@babel/helpers": "^7.24.8", - "@babel/parser": "^7.24.8", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.9", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -10923,12 +10926,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "requires": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", "browserslist": "^4.23.1", "lru-cache": "^5.1.1", @@ -10951,9 +10954,9 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.0.tgz", - "integrity": "sha512-q0T+dknZS+L5LDazIP+02gEZITG5unzvb6yIjcmj5i0eFrs5ToBV2m2JGH4EsE/gtP8ygEGLGApBgRIZkTm7zg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -10995,15 +10998,15 @@ } }, "@babel/helper-module-transforms": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.0.tgz", - "integrity": "sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.2" } }, "@babel/helper-optimise-call-expression": { @@ -11115,19 +11118,22 @@ } }, "@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", - "dev": true + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dev": true, + "requires": { + "@babel/types": "^7.25.2" + } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", - "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.3" } }, "@babel/plugin-bugfix-safari-class-field-initializer-scope": { @@ -11553,12 +11559,12 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-logical-assignment-operators": { @@ -11755,16 +11761,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", - "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.2" } }, "@babel/plugin-transform-react-jsx-development": { @@ -11891,16 +11897,16 @@ } }, "@babel/preset-env": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.0.tgz", - "integrity": "sha512-vYAA8PrCOeZfG4D87hmw1KJ1BPubghXP1e2MacRFwECGNKL76dkA38JEwYllbvQCpf/kLxsTtir0b8MtxKoVCw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", "dev": true, "requires": { - "@babel/compat-data": "^7.25.0", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", @@ -11941,9 +11947,9 @@ "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.0", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", @@ -12041,24 +12047,24 @@ } }, "@babel/traverse": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.1.tgz", - "integrity": "sha512-LrHHoWq08ZpmmFqBAzN+hUdWwy5zt7FGa/hVwMcOqW6OVtwqaoD5utfuGYU87JYxdZgLUvktAsn37j/sYR9siA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dev": true, "requires": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.0", + "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", - "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.24.8", @@ -13909,9 +13915,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001643", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", - "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", + "version": "1.0.30001645", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz", + "integrity": "sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==", "dev": true }, "chalk": { @@ -14480,9 +14486,9 @@ } }, "electron-to-chromium": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.2.tgz", - "integrity": "sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", "dev": true }, "elliptic": { @@ -18974,13 +18980,13 @@ } }, "which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "requires": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -18989,8 +18995,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "dependencies": { "isarray": { @@ -19039,9 +19045,10 @@ "dev": true }, "wp-rocket-scripts": { - "version": "git+ssh://git@github.com/wp-media/rocket-scripts.git#13950ab2c353c7974ddc7de916cee7b680b217e0", - "dev": true, - "from": "wp-rocket-scripts@github:wp-media/rocket-scripts#enhancement/beacon-script-refactoring-phase-2" + "version": "1.0.2-alpha2", + "resolved": "https://registry.npmjs.org/wp-rocket-scripts/-/wp-rocket-scripts-1.0.2-alpha2.tgz", + "integrity": "sha512-W9vz1b/u7ln/l5TJnROG9wKSR5BnnrYKcJ39oWrgw0ztUCmak7Rwsp9aCFWP5qncFEHDJhh9/Pj28QLn66dU8A==", + "dev": true }, "wrap-ansi": { "version": "7.0.0", diff --git a/package.json b/package.json index 8f6c0f60b8..33e0f94a06 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "watchify": "^4.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.9.1", - "wp-rocket-scripts": "github:wp-media/rocket-scripts#enhancement/beacon-script-refactoring-phase-2", + "wp-rocket-scripts": "^1.0.2-alpha2", "yargs": "^17.3.0" } } From 239621ec4ea75ba0d9c0122ee5b42571984dff89 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 1 Aug 2024 11:37:12 +0100 Subject: [PATCH 038/192] Fixed fatal error during uninstall --- uninstall.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/uninstall.php b/uninstall.php index 83b9f06ffe..185ce6a5e6 100755 --- a/uninstall.php +++ b/uninstall.php @@ -26,6 +26,8 @@ require_once __DIR__ . '/inc/Engine/Common/Database/Tables/AbstractTable.php'; require_once __DIR__ . '/inc/Engine/Optimization/RUCSS/Database/Tables/UsedCSS.php'; require_once __DIR__ . '/inc/Engine/Preload/Database/Tables/Cache.php'; +require_once __DIR__ . '/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php'; +require_once __DIR__ . '/inc/Engine/Common/PerformanceHints/Database/Table/AbstractTable.php'; require_once __DIR__ . '/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php'; $rocket_rucss_usedcss_table = new WP_Rocket\Engine\Optimization\RUCSS\Database\Tables\UsedCSS(); From 03eeb745d37ea81edcbff70fce4a1824d65149ca Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 1 Aug 2024 17:18:51 +0100 Subject: [PATCH 039/192] Updated tests --- .../Subscriber/HTML/output_w_beacon.html | 2 +- .../AboveTheFold/AJAX/Controller/addData.php | 227 ++++++++++++++++++ .../AboveTheFold/AJAX/Controller/addData.php | 2 +- 3 files changed, 229 insertions(+), 2 deletions(-) diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html index fa81bea27b..2f6dc7cf89 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html @@ -3,5 +3,5 @@ Test - + diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php index b23debf7e8..860fc5fdb2 100644 --- a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php @@ -32,6 +32,11 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'lcp_images' => json_encode( [] ), + 'results' => json_encode( + [ + 'lcp' => [] + ], + ), ], 'expected' => [ 'images_valid_sources' => [], @@ -66,6 +71,22 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'type' => 'img', + 'label' => 'lcp', + 'src' => 'http://example.org/lcp.jpg', + ], + (object) [ + 'type' => 'img', + 'label' => 'above-the-fold', + 'src' => 'http://example.org/above-the-fold.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'jpg', 'type' => 'image/jpeg', @@ -126,6 +147,22 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'http://example.org/lcp.jpg', + ], + (object) [ + 'label' => 'above-the-fold', + 'type' => 'img', + 'src' => 'http://example.org/above-the-fold.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'jpg', 'type' => 'image/jpeg', @@ -204,6 +241,22 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'http://example.org/lcp.jpg', + ], + (object) [ + 'label' => 'above-the-fold', + 'type' => 'img', + 'src' => 'http://example.org/above-the-fold.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'jpg', 'type' => 'image/jpeg', @@ -284,6 +337,22 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'http://example.org/lcp.jpg', + ], + (object) [ + 'label' => 'above-the-fold', + 'type' => 'img', + 'src' => 'http://example.org/above-the-fold.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'jpg', 'type' => 'image/jpeg', @@ -373,6 +442,30 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'bg-img', + 'src' => '', + 'bg_set' => [ + [ + 'src' => 'http://example.org/anotherlcp.jpg' + ], + [ + 'src' => 'http://example.org/anotherlcp2.jpg' + ] + ] + ], + (object) [ + 'label' => 'above-the-fold', + 'type' => 'img', + 'src' => 'http://example.org/above-the-fold.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'jpg', 'type' => 'image/jpeg', @@ -483,6 +576,37 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'bg-img-set', + 'src' => [ + [ + 'src' => 'http://example.org/lcp.jpg' + ], + [ + 'src' => 'http://example.org/random.jpg' + ] + ], + 'bg_set' => [ + [ + 'src' => 'http://example.org/anotherlcp.jpg' + ], + [ + 'src' => 'http://example.org/anotherlcp2.jpg' + ] + ] + ], + (object) [ + 'label' => 'above-the-fold', + 'type' => 'img', + 'src' => 'http://example.org/above-the-fold.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'jpg', 'type' => 'image/jpeg', @@ -566,6 +690,11 @@ 'lcp_images' => json_encode( $long_array ), + 'results' => json_encode( + [ + 'lcp' => $long_array, + ], + ), 'filetype' => [ 'ext' => 'jpg', 'type' => 'image/jpeg', @@ -611,6 +740,11 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'lcp_images' => '', + 'results' => json_encode( + [ + 'lcp' => [] + ], + ), ], 'expected' => [ 'images_valid_sources' => [], @@ -655,6 +789,23 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'src' => "", + 'bg_set' => [], + 'type' => '' + ], + (object) [ + 'label' => 'above-the-fold', + 'type' => '', + 'src' => '', + ], + ] + ], + ), ], 'expected' => [ 'images_valid_sources' => [], @@ -686,6 +837,11 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'lcp_images' => '', + 'results' => json_encode( + [ + 'lcp' => [] + ], + ), 'status' => 'script_error', ], 'expected' => [ @@ -717,6 +873,11 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'lcp_images' => '', + 'results' => json_encode( + [ + 'lcp' => [] + ], + ), 'status' => 'timeout', ], 'expected' => [ @@ -757,6 +918,17 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'http://example.org/file.php?url=img.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'php', 'type' => false, @@ -809,6 +981,17 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'http://example.org/file.js?url=img.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'js', 'type' => 'application/javascript', @@ -861,6 +1044,17 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'http://example.org/file.php#url=img.jpg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'php', 'type' => 'application/php', @@ -913,6 +1107,17 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'chrome-extension://extension-hash/path/to/image/x.svg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'svg', 'type' => 'image/svg+xml', @@ -965,6 +1170,17 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'bg-img', + 'src' => 'linear-gradient(160deg, rgb(255, 255, 255) 0%, rgb(248, 246, 243) 100%)', + ], + ] + ], + ), 'filetype' => [ 'ext' => false, 'type' => false, @@ -1017,6 +1233,17 @@ ], ] ), + 'results' => json_encode( + [ + 'lcp' => [ + (object) [ + 'label' => 'lcp', + 'type' => 'img', + 'src' => 'http://example.org/path/to/images/image.svg', + ], + ] + ], + ), 'filetype' => [ 'ext' => 'svg', 'type' => 'image/svg+xml', diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php index b539e6a8e9..b70b2c13d5 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php @@ -50,7 +50,7 @@ public function testShouldReturnExpected( $config, $expected ) { $_POST = [ 'url' => addslashes( $config['url'] ), 'is_mobile' => addslashes( $config['is_mobile'] ), - 'lcp_images' => addslashes( $config['lcp_images'] ), + 'results' => addslashes( $config['results'] ), 'status' => addslashes( $config['status'] ?? 'success' ), ]; From 8325874de89a0b1ce3cce3fc27258d0f6d089ad9 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Sat, 3 Aug 2024 12:12:42 +0200 Subject: [PATCH 040/192] Update wpr-beacon to latest 3.17 refacto fix --- assets/js/wpr-beacon.js | 19 ++++++++++--------- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 6 +++--- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index 2c055eff98..6912eea95e 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -222,10 +222,13 @@ this.infiniteLoopId = setTimeout(() => { this._handleInfiniteLoop(); }, 1e4); - const isGeneratedBefore = await this._isGeneratedBefore(); - if (!isGeneratedBefore.lcp) { + const isGeneratedBefore = await this._getGeneratedBefore(); + const shouldGenerateLcp = this.config.status.atf && isGeneratedBefore === false; + if (shouldGenerateLcp) { this.lcpBeacon = new BeaconLcp_default(this.config, this.logger); await this.lcpBeacon.run(); + } else { + this.logger.logMessage("Not running BeaconLcp because data is already available"); } this._saveFinalResultIntoDB(); } @@ -238,14 +241,12 @@ this.logger.logMessage("Bailing out because screen size is not acceptable"); return false; } - const generated_before = await this._isGeneratedBefore(); - if (Utils_default.isPageCached() && (this.config.status.atf && generated_before.lcp)) { - this.logger.logMessage("Bailing out because data is already available"); - return false; - } return true; } - async _isGeneratedBefore() { + async _getGeneratedBefore() { + if (!Utils_default.isPageCached()) { + return false; + } let data_check = new FormData(); data_check.append("action", "rocket_check_beacon"); data_check.append("rocket_beacon_nonce", this.config.nonce); @@ -256,7 +257,7 @@ credentials: "same-origin", body: data_check }).then((data) => data.json()); - return beacon_data_response.data; + return beacon_data_response.success; } _saveFinalResultIntoDB() { const results = { diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index 5fed58578a..f6a96f0ec7 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4),(await this._isGeneratedBefore()).lcp||(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()),this._saveFinalResultIntoDB()}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};if(a.isNotValidScreensize(this.config.is_mobile,e))return this.logger.logMessage("Bailing out because screen size is not acceptable"),!1;const i=await this._isGeneratedBefore();return a.isPageCached()&&this.config.status.atf&&i.lcp?(this.logger.logMessage("Bailing out because data is already available"),!1):!0}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); +(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore();this.config.status.atf&&e===!1?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available"),this._saveFinalResultIntoDB()}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return a.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!a.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).success}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 40ba68f23c..a11e905311 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._isGeneratedBefore();\n if (!isGeneratedBefore.lcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n const generated_before = await this._isGeneratedBefore();\n if (Utils_default.isPageCached() && (this.config.status.atf && generated_before.lcp)) {\n this.logger.logMessage(\"Bailing out because data is already available\");\n return false;\n }\n return true;\n }\n async _isGeneratedBefore() {\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], - "mappings": "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", - "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "generated_before", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.scriptTimer = /* @__PURE__ */ new Date();\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && isGeneratedBefore === false;\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available\");\n }\n this._saveFinalResultIntoDB();\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.success;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], + "mappings": "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", + "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] } From 80248fb546d65695b7a0763af05cc903c23b5e02 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Mon, 5 Aug 2024 10:03:40 +0100 Subject: [PATCH 041/192] Updated hooks docblock --- inc/Engine/Common/PerformanceHints/Frontend/Processor.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index bdbfe0ebd8..b2f3dea883 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -91,7 +91,7 @@ private function inject_beacon( $html, $url, $is_mobile ): string { $default_width_threshold = $is_mobile ? 393 : 1600; $default_height_threshold = $is_mobile ? 830 : 700; /** - * Filters the width threshold for the LCP beacon. + * Filters the width threshold for the beacon. * * @param int $width_threshold The width threshold. Default is 393 for mobile and 1920 for others. * @param bool $is_mobile True if the current device is mobile, false otherwise. @@ -107,7 +107,7 @@ private function inject_beacon( $html, $url, $is_mobile ): string { ); /** - * Filters the height threshold for the LCP beacon. + * Filters the height threshold for the beacon. * * @param int $height_threshold The height threshold. Default is 830 for mobile and 1080 for others. * @param bool $is_mobile True if the current device is mobile, false otherwise. @@ -133,7 +133,7 @@ private function inject_beacon( $html, $url, $is_mobile ): string { $default_delay = 500; /** - * Filters the delay before the LCP beacon is triggered. + * Filters the delay before the beacon is triggered. * * @param int $delay The delay in milliseconds. Default is 500. */ From cb76df62eca5682ef1703642aa740061e601a5c7 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Mon, 5 Aug 2024 11:33:34 +0100 Subject: [PATCH 042/192] Updated deprecated version --- inc/Engine/Common/PerformanceHints/Frontend/Processor.php | 6 +++--- inc/Engine/Common/PerformanceHints/WarmUp/Controller.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index b2f3dea883..9139159d22 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -102,7 +102,7 @@ private function inject_beacon( $html, $url, $is_mobile ): string { $width_threshold = rocket_apply_filter_and_deprecated( 'rocket_performance_hints_optimization_width_threshold', [ $default_width_threshold, $is_mobile, $url ], - '3.17', + '3.16.4', 'rocket_lcp_width_threshold' ); @@ -118,7 +118,7 @@ private function inject_beacon( $html, $url, $is_mobile ): string { $height_threshold = rocket_apply_filter_and_deprecated( 'rocket_performance_hints_optimization_height_threshold', [ $default_height_threshold, $is_mobile, $url ], - '3.17', + '3.16.4', 'rocket_lcp_height_threshold' ); @@ -140,7 +140,7 @@ private function inject_beacon( $html, $url, $is_mobile ): string { $delay = rocket_apply_filter_and_deprecated( 'rocket_performance_hints_optimization_delay', [ $default_delay ], - '3.17', + '3.16.4', 'rocket_lcp_delay' ); diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php index 775bfa202f..5bffd9b05d 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php @@ -190,7 +190,7 @@ function ( $link ) use ( $home_url, $reject_uri_pattern ) { $links_limit = rocket_apply_filter_and_deprecated( 'rocket_performance_hints_warmup_links_number', [ $default_limit ], - '3.16', + '3.16.4', 'rocket_atf_warmup_links_number' ); From a3f15405f4485595731817c3fb528c5b99197653 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Tue, 6 Aug 2024 17:46:12 +0100 Subject: [PATCH 043/192] :chore: Remove atf check for sass menu item and rename title -- #6845 --- inc/Engine/Saas/Admin/AdminBar.php | 36 +++++------------------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index 72805b42a4..3e7103e2a1 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -71,22 +71,12 @@ public function add_clean_saas_menu_item( $wp_admin_bar ) { } if ( - ! $this->atf_context->is_allowed() - && ! (bool) $this->options->get( 'remove_unused_css', 0 ) ) { return; } - $title = __( 'Clear Critical Images', 'rocket' ); - - if ( - (bool) $this->options->get( 'remove_unused_css', 0 ) - && - current_user_can( 'rocket_remove_unused_css' ) - ) { - $title = __( 'Clear Used CSS', 'rocket' ); - } + $title = __( 'Clear RUCSS optimizations', 'rocket' ); $referer = ''; $action = 'rocket_clean_saas'; @@ -136,10 +126,7 @@ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { return; } - if ( ! $this->atf_context->is_allowed() - && - ! $this->rucss_url_context->is_allowed() - ) { + if ( ! $this->rucss_url_context->is_allowed() ) { return; } @@ -169,11 +156,8 @@ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { $referer = (string) apply_filters( 'rocket_admin_bar_referer', esc_url( $referer_url ) ); $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer ) ); } - $title = __( 'Clear Critical Images of this URL', 'rocket' ); - if ( $this->rucss_url_context->is_allowed() ) { - $title = __( 'Clear Used CSS of this URL', 'rocket' ); - } + $title = __( 'Clear RUCSS optimizations of this URL', 'rocket' ); $wp_admin_bar->add_menu( [ @@ -199,20 +183,12 @@ public function display_dashboard_button() { return; } - if ( ! $this->atf_context->is_allowed() - && - ! $this->rucss_url_context->is_allowed() - ) { + if ( ! $this->rucss_url_context->is_allowed() ) { return; } - $title = __( 'Critical Images Cache', 'rocket' ); - $label = esc_html__( 'Clear Critical Images', 'rocket' ); - - if ( $this->rucss_url_context->is_allowed() ) { - $title = __( 'Remove Used CSS Cache', 'rocket' ); - $label = esc_html__( 'Clear Used CSS', 'rocket' ); - } + $title = __( 'Remove Unused CSS', 'rocket' ); + $label = esc_html__( 'Clear RUCSS optimizations', 'rocket' ); $data = [ 'action' => 'rocket_clean_saas', From bab9f8151fb68ea18045945a6aafa269dc6c486a Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 7 Aug 2024 14:12:44 +0100 Subject: [PATCH 044/192] Add admin menu trait, context, admin bar class for performance hints :closes: #6845 --- inc/Engine/Admin/Menu/AdminBarMenuTrait.php | 46 ++++++++++++ .../PerformanceHints/Admin/AdminBar.php | 71 +++++++++++++++++++ .../PerformanceHints/Admin/Subscriber.php | 20 +++++- .../PerformanceHints/Context/Context.php | 22 ++++++ .../PerformanceHints/ServiceProvider.php | 17 ++++- inc/Engine/Saas/Admin/AdminBar.php | 11 +-- inc/Engine/Saas/ServiceProvider.php | 1 - .../Admin/AdminBar/addCleanSaasMenuItem.php | 2 +- .../Admin/AdminBar/addCleanUrlMenuItem.php | 2 +- 9 files changed, 177 insertions(+), 15 deletions(-) create mode 100644 inc/Engine/Admin/Menu/AdminBarMenuTrait.php create mode 100644 inc/Engine/Common/PerformanceHints/Admin/AdminBar.php create mode 100644 inc/Engine/Common/PerformanceHints/Context/Context.php diff --git a/inc/Engine/Admin/Menu/AdminBarMenuTrait.php b/inc/Engine/Admin/Menu/AdminBarMenuTrait.php new file mode 100644 index 0000000000..ae94d0a55b --- /dev/null +++ b/inc/Engine/Admin/Menu/AdminBarMenuTrait.php @@ -0,0 +1,46 @@ +add_menu( + [ + 'parent' => 'wp-rocket', + 'id' => $id, + 'title' => $title, + 'href' => wp_nonce_url( admin_url( "admin-post.php?action={$action}{$referer}" ), $action ), + ] + ); + } +} diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php new file mode 100644 index 0000000000..eda6a551ff --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -0,0 +1,71 @@ +options = $options; + $this->performance_hints_context = $performance_hints_context; + } + + /** + * Add performance hints data to WP Rocket admin bar menu + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_menu_item( $wp_admin_bar ): void { + if ( ! rocket_valid_key() ) { + return; + } + + if ( + 'local' === wp_get_environment_type() + ) { + return; + } + + $title = __( 'Clear Performance Hints data', 'rocket' ); + $action = 'rocket_clean_performance_hints'; + + $this->add_menu_to_admin_bar( + $wp_admin_bar, + 'clean-performance-hints', + $title, + $action + ); + } +} diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php index d6bbe6f6bc..45e8866328 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -3,6 +3,7 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\Admin; +use WP_Admin_Bar; use WP_Rocket\Event_Management\Subscriber_Interface; class Subscriber implements Subscriber_Interface { @@ -13,13 +14,21 @@ class Subscriber implements Subscriber_Interface { */ private $controller; + /** + * AdminBar instance. + * + * @var AdminBar + */ + private $admin_bar; + /** * Instantiate the class * * @param Controller $controller Controller instance. */ - public function __construct( Controller $controller ) { + public function __construct( Controller $controller, AdminBar $admin_bar ) { $this->controller = $controller; + $this->admin_bar = $admin_bar; } /** @@ -41,6 +50,9 @@ public static function get_subscribed_events(): array { 'rocket_saas_clean_all' => 'truncate_from_admin', 'rocket_saas_clean_url' => 'clean_url', 'wp_rocket_upgrade' => [ 'truncate_on_update', 10, 2 ], + 'rocket_admin_bar_items' => [ + [ 'add_clean_performance_hints_item' ], + ], ]; } @@ -104,4 +116,10 @@ public function clean_url() { public function truncate_on_update( $new_version, $old_version ) { $this->controller->truncate_on_update( $new_version, $old_version ); } + + /** + */ + public function add_clean_performance_hints_item( WP_Admin_Bar $wp_admin_bar ) { + $this->admin_bar->add_menu_item( $wp_admin_bar ); + } } diff --git a/inc/Engine/Common/PerformanceHints/Context/Context.php b/inc/Engine/Common/PerformanceHints/Context/Context.php new file mode 100644 index 0000000000..300ebb716c --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Context/Context.php @@ -0,0 +1,22 @@ +getContainer()->add( 'performance_hints_context', Context::class ); + + $this->getContainer()->add( 'performance_hints_admin_bar', Adminbar::class ) + ->addArgument( $this->getContainer()->get( 'options' ) ) + ->addArgument( $this->getContainer()->get( 'performance_hints_context' ) ) + ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); + $this->getContainer()->addShared( 'performance_hints_admin_subscriber', AdminSubscriber::class ) ->addArguments( [ $this->getContainer()->get( 'performance_hints_admin_controller' ), + $this->getContainer()->get( 'performance_hints_admin_bar' ), ] ); $this->getContainer()->add( 'cron_controller', CronController::class ) diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index 3e7103e2a1..909ac50492 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -16,13 +16,6 @@ class AdminBar extends Abstract_Render { */ private $options; - /** - * ATF context. - * - * @var ContextInterface - */ - private $atf_context; - /** * RUCSS optimize url context. * @@ -34,15 +27,13 @@ class AdminBar extends Abstract_Render { * Constructor * * @param Options_Data $options Options data instance. - * @param ContextInterface $atf_context ATF context. * @param ContextInterface $rucss_url_context RUCSS optimize url context. * @param string $template_path Template path. */ - public function __construct( Options_Data $options, ContextInterface $atf_context, ContextInterface $rucss_url_context, $template_path ) { + public function __construct( Options_Data $options, ContextInterface $rucss_url_context, $template_path ) { parent::__construct( $template_path ); $this->options = $options; - $this->atf_context = $atf_context; $this->rucss_url_context = $rucss_url_context; } diff --git a/inc/Engine/Saas/ServiceProvider.php b/inc/Engine/Saas/ServiceProvider.php index 9b59335b51..37220bf81f 100644 --- a/inc/Engine/Saas/ServiceProvider.php +++ b/inc/Engine/Saas/ServiceProvider.php @@ -42,7 +42,6 @@ public function provides( string $id ): bool { public function register(): void { $this->getContainer()->add( 'sass_admin_bar', Adminbar::class ) ->addArgument( $this->getContainer()->get( 'options' ) ) - ->addArgument( $this->getContainer()->get( 'atf_context' ) ) ->addArgument( $this->getContainer()->get( 'rucss_optimize_context' ) ) ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); $this->getContainer()->add( 'sass_clean', Clean::class ); diff --git a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php index 27ec89106e..1f3f0b6116 100644 --- a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php +++ b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php @@ -33,7 +33,7 @@ protected function setUp(): void { $this->options = Mockery::mock( Options_Data::class ); $this->atf_context = Mockery::mock( ContextInterface::class ); $this->rucss_url_context = Mockery::mock( ContextInterface::class ); - $this->admin_bar = new AdminBar( $this->options, $this->atf_context, $this->rucss_url_context, '' ); + $this->admin_bar = new AdminBar( $this->options, $this->rucss_url_context, '' ); $this->wp_admin_bar = new WP_Admin_Bar(); $this->stubTranslationFunctions(); diff --git a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php index 557e1f39dc..ed6155ec62 100644 --- a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php +++ b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php @@ -33,7 +33,7 @@ protected function setUp(): void { $this->options = Mockery::mock( Options_Data::class ); $this->atf_context = Mockery::mock( ContextInterface::class ); $this->rucss_url_context = Mockery::mock( ContextInterface::class ); - $this->admin_bar = new AdminBar( $this->options, $this->atf_context, $this->rucss_url_context, '' ); + $this->admin_bar = new AdminBar( $this->options, $this->rucss_url_context, '' ); $this->wp_admin_bar = new WP_Admin_Bar(); $this->stubTranslationFunctions(); From 43e6c6c05f542fa1fcf1f556e9c54197e02b33a0 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 8 Aug 2024 09:43:48 +0100 Subject: [PATCH 045/192] Add display dashboard button --- inc/Engine/Admin/Menu/AdminBarMenuTrait.php | 79 +++++++++++++++ .../PerformanceHints/Admin/AdminBar.php | 97 ++++++++++++++++--- .../PerformanceHints/Admin/Subscriber.php | 32 +++++- .../PerformanceHints/ServiceProvider.php | 6 +- inc/Engine/Saas/Admin/AdminBar.php | 38 +++----- 5 files changed, 205 insertions(+), 47 deletions(-) diff --git a/inc/Engine/Admin/Menu/AdminBarMenuTrait.php b/inc/Engine/Admin/Menu/AdminBarMenuTrait.php index ae94d0a55b..f72b702945 100644 --- a/inc/Engine/Admin/Menu/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Menu/AdminBarMenuTrait.php @@ -28,6 +28,10 @@ protected function add_menu_to_admin_bar( return; } + if ( ! is_admin() ) { + return; + } + $referer = ''; if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); @@ -43,4 +47,79 @@ protected function add_menu_to_admin_bar( ] ); } + + /** + * + */ + protected function add_url_menu_item_to_admin_bar( + WP_Admin_Bar $wp_admin_bar, + string $id, + string $title, + string $action, + bool $context + ) { + global $post; + if ( 'local' === wp_get_environment_type() && $context ) { + return; + } + + if ( is_admin() ) { + return; + } + + if ( + $post + && + ! rocket_can_display_options() + ) { + return; + } + + if ( ! $context ) { + return; + } + + $referer = ''; + + if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { + $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); + + /** + * Filters to act on the referer url for the admin bar. + * + * @param string $uri Current uri. + */ + $referer = (string) apply_filters( 'rocket_admin_bar_referer', esc_url( $referer_url ) ); + $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer ) ); + } + + $wp_admin_bar->add_menu( + [ + 'parent' => 'wp-rocket', + 'id' => $id, + 'title' => $title, + 'href' => wp_nonce_url( admin_url( 'admin-post.php?action=' . $action . $referer ), $action ), + ] + ); + } + + public function dashboard_button( bool $context, string $title, string $label, string $action ){ + if ( + 'local' === wp_get_environment_type() + && + $context + ) { + return; + } + + if ( ! $context ) { + return; + } + + echo $this->generate( 'sections/clean-section', [ + 'action' => $action, + 'title' => $title, + 'label' => $label, + ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + } } diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index eda6a551ff..ebd221b474 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -9,6 +9,7 @@ use WP_Rocket\Engine\Admin\Menu\AdminBarMenuTrait; use WP_Rocket\Engine\Common\Context\ContextInterface; + class AdminBar extends Abstract_Render { use AdminBarMenuTrait; @@ -20,24 +21,25 @@ class AdminBar extends Abstract_Render { private $options; /** - * Performance hints context. + * ATF context. * * @var ContextInterface */ - private $performance_hints_context; + private $atf_context; + /** * Constructor * * @param Options_Data $options Options data instance. - * @param ContextInterface $performance_hints_context Performance hints context. + * @param ContextInterface $atf_context ATF context. * @param string $template_path Template path. */ - public function __construct( Options_Data $options, ContextInterface $performance_hints_context, $template_path ) { + public function __construct( Options_Data $options, ContextInterface $atf_context, $template_path ) { parent::__construct( $template_path ); - $this->options = $options; - $this->performance_hints_context = $performance_hints_context; + $this->options = $options; + $this->atf_context = $atf_context; } /** @@ -47,25 +49,94 @@ public function __construct( Options_Data $options, ContextInterface $performanc * * @return void */ - public function add_menu_item( $wp_admin_bar ): void { - if ( ! rocket_valid_key() ) { + public function add_clear_performance_menu_item( WP_Admin_Bar $wp_admin_bar ): void { + //TODO:Add lrc context check here + if ( ! $this->atf_context->is_allowed() ) { return; } + $title = __( 'Clear Performance Hints data', 'rocket' ); + $action = 'rocket_clear_performance_hints'; + + $this->add_menu_to_admin_bar( + $wp_admin_bar, + 'clear-performance-hints', + $title, + $action + ); + } + + /** + * Add clear performance hints URL data to WP Rocket admin bar menu + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ) { + global $post; + if ( 'local' === wp_get_environment_type() + && + $this->atf_context->is_allowed() ) { return; } - $title = __( 'Clear Performance Hints data', 'rocket' ); - $action = 'rocket_clean_performance_hints'; + if ( is_admin() ) { + return; + } - $this->add_menu_to_admin_bar( + if ( + $post + && + ! rocket_can_display_options() + ) { + return; + } + + if ( ! $this->atf_context->is_allowed() ) { + return; + } + + /** + * Filters the rocket `clear used css of this url` option on admin bar menu. + * + * @since 3.12.1 + * + * @param bool $should_skip Should skip adding `clear performance hints of this url` option in admin bar. + * @param type $post Post object. + */ + if ( apply_filters( 'rocket_skip_admin_bar_clear_performance_hints_option', false, $post ) ) { + return; + } + + + $action = 'rocket_clean_performance_hints_url'; + + $title = __( 'Clear performance hints data of this URL', 'rocket' ); + + $this->add_url_menu_item_to_admin_bar( $wp_admin_bar, - 'clean-performance-hints', + 'clear-performance-hints-data-url', $title, - $action + $action, + $this->atf_context->is_allowed() + ); + } + + /** + * Display the dashboard button to clear performance hints data + * + * @return void + */ + public function display_dashboard_button() { + $this->dashboard_button( + $this->atf_context->is_allowed(), + __( 'Performance Hints', 'rocket' ), + esc_html__( 'Clear', 'rocket' ), + 'rocket_clear_performance_hints' ); } } diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php index 45e8866328..d0303c7d5e 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -51,8 +51,10 @@ public static function get_subscribed_events(): array { 'rocket_saas_clean_url' => 'clean_url', 'wp_rocket_upgrade' => [ 'truncate_on_update', 10, 2 ], 'rocket_admin_bar_items' => [ - [ 'add_clean_performance_hints_item' ], + [ 'add_clear_performance_hints_menu_item' ], + [ 'add_clear_url_performance_hints_menu_item' ] ], + 'rocket_dashboard_actions' => 'display_dashboard_button', ]; } @@ -118,8 +120,32 @@ public function truncate_on_update( $new_version, $old_version ) { } /** + * Add clear performance hints data to WP Rocket admin bar menu + * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_clear_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ): void { + $this->admin_bar->add_clear_performance_menu_item( $wp_admin_bar ); + } + + /** + * Add clear performance data hints for current url to WP Rocket admin bar menu + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. + * + * @return void + */ + public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ): void{ + $this->admin_bar->add_clear_url_performance_hints_menu_item( $wp_admin_bar ); + } + + /** + * Display the dashboard button to clear performance data hints features + * + * @return void */ - public function add_clean_performance_hints_item( WP_Admin_Bar $wp_admin_bar ) { - $this->admin_bar->add_menu_item( $wp_admin_bar ); + public function display_dashboard_button(){ + $this->admin_bar->display_dashboard_button(); } } diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index aa45d48874..792ab9bf18 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -44,7 +44,7 @@ class ServiceProvider extends AbstractServiceProvider { 'performance_hints_warmup_controller', 'performance_hints_warmup_subscriber', 'performance_hints_admin_bar', - 'performance_hints_context', + 'atf_context', ]; /** @@ -102,11 +102,9 @@ public function register(): void { ] ); - $this->getContainer()->add( 'performance_hints_context', Context::class ); - $this->getContainer()->add( 'performance_hints_admin_bar', Adminbar::class ) ->addArgument( $this->getContainer()->get( 'options' ) ) - ->addArgument( $this->getContainer()->get( 'performance_hints_context' ) ) + ->addArgument( $this->getContainer()->get( 'atf_context' ) ) ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); $this->getContainer()->addShared( 'performance_hints_admin_subscriber', AdminSubscriber::class ) diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index 909ac50492..66319cb5cd 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -6,9 +6,12 @@ use WP_Admin_Bar; use WP_Rocket\Abstract_Render; use WP_Rocket\Admin\Options_Data; +use WP_Rocket\Engine\Admin\Menu\AdminBarMenuTrait; use WP_Rocket\Engine\Common\Context\ContextInterface; class AdminBar extends Abstract_Render { + use AdminBarMenuTrait; + /** * Options data instance. * @@ -45,9 +48,8 @@ public function __construct( Options_Data $options, ContextInterface $rucss_url_ * @return void */ public function add_clean_saas_menu_item( $wp_admin_bar ) { - if ( ! rocket_valid_key() ) { - return; - } + $title = __( 'Clear RUCSS optimizations', 'rocket' ); + $action = 'rocket_clean_saas'; if ( 'local' === wp_get_environment_type() @@ -57,33 +59,15 @@ public function add_clean_saas_menu_item( $wp_admin_bar ) { return; } - if ( ! is_admin() ) { - return; - } - - if ( - ! (bool) $this->options->get( 'remove_unused_css', 0 ) - ) { + if ( ! (bool) $this->options->get( 'remove_unused_css', 0 ) ) { return; } - $title = __( 'Clear RUCSS optimizations', 'rocket' ); - - $referer = ''; - $action = 'rocket_clean_saas'; - - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { - $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); - $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer_url ) ); - } - - $wp_admin_bar->add_menu( - [ - 'parent' => 'wp-rocket', - 'id' => 'clean-saas', - 'title' => $title, - 'href' => wp_nonce_url( admin_url( "admin-post.php?action={$action}{$referer}" ), $action ), - ] + $this->add_menu_to_admin_bar( + $wp_admin_bar, + 'clean-saas', + $title, + $action ); } From c5a2f105c8e6e26a0cd3217369021e31a642c861 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 8 Aug 2024 11:25:36 +0100 Subject: [PATCH 046/192] Added notices and clearing class for performance hints --6845 --- inc/Engine/Admin/Beacon/Beacon.php | 10 +++ .../{Menu => Settings}/AdminBarMenuTrait.php | 19 +++--- .../Admin/Settings/DataClearingTrait.php | 42 +++++++++++++ inc/Engine/Admin/Settings/Page.php | 12 ++-- .../PerformanceHints/Admin/AdminBar.php | 18 +++--- .../Common/PerformanceHints/Admin/Clean.php | 46 ++++++++++++++ .../PerformanceHints/Admin/Controller.php | 2 +- .../PerformanceHints/Admin/Subscriber.php | 62 +++++++++++++------ inc/Engine/Saas/Admin/AdminBar.php | 2 +- 9 files changed, 167 insertions(+), 46 deletions(-) rename inc/Engine/Admin/{Menu => Settings}/AdminBarMenuTrait.php (89%) create mode 100644 inc/Engine/Admin/Settings/DataClearingTrait.php create mode 100644 inc/Engine/Common/PerformanceHints/Admin/Clean.php diff --git a/inc/Engine/Admin/Beacon/Beacon.php b/inc/Engine/Admin/Beacon/Beacon.php index 858c03620f..2bcae53de5 100644 --- a/inc/Engine/Admin/Beacon/Beacon.php +++ b/inc/Engine/Admin/Beacon/Beacon.php @@ -821,6 +821,16 @@ public function get_suggest( $doc_id ) { 'url' => 'https://fr.docs.wp-rocket.me/article/1833-impossible-creer-table-rucssusedcss/?utm_source=wp_plugin&utm_medium=wp_rocket', ], ], + 'lazy_render_content' => [ + 'en' => [ + 'id' => '', + 'url' => '', + ], + 'fr' => [ + 'id' => '', + 'url' => '', + ], + ], ]; return isset( $suggest[ $doc_id ][ $this->get_user_locale() ] ) diff --git a/inc/Engine/Admin/Menu/AdminBarMenuTrait.php b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php similarity index 89% rename from inc/Engine/Admin/Menu/AdminBarMenuTrait.php rename to inc/Engine/Admin/Settings/AdminBarMenuTrait.php index f72b702945..fb531418de 100644 --- a/inc/Engine/Admin/Menu/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php @@ -1,7 +1,7 @@ generate( 'sections/clean-section', [ - 'action' => $action, - 'title' => $title, - 'label' => $label, - ] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo $this->generate( + 'sections/clean-section', + [ + 'action' => $action, + 'title' => $title, + 'label' => $label, + ] + ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } diff --git a/inc/Engine/Admin/Settings/DataClearingTrait.php b/inc/Engine/Admin/Settings/DataClearingTrait.php new file mode 100644 index 0000000000..fb8d3111de --- /dev/null +++ b/inc/Engine/Admin/Settings/DataClearingTrait.php @@ -0,0 +1,42 @@ + '3.16' ) { + // Bail-out if previous version is greater than 3.17. + if ( $previous_version > '3.17' ) { return; } - $critical_images_beacon = $this->beacon->get_suggest( 'optimize_critical_images' ); - $remove_cache_tab = $this->beacon->get_suggest( 'remove_cache_tab' ); + $lazy_render_content = $this->beacon->get_suggest( 'lazy_render_content' ); rocket_notice_html( [ @@ -2249,11 +2248,10 @@ public function display_update_notice() { 'dismissible' => '', 'message' => sprintf( // translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: option a tag, %5$s: opening a tag. - __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our brand new feature %3$sOptimize critical images%5$s is automatically activated now! Also, the Cache tab was removed but the existing features will remain working, %4$ssee more here%5$s.', 'rocket' ), + __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. Our brand new feature %3$sLazy Render Content.%4$s Check out our sdocumentation to learn more about it.', 'rocket' ), '', '', - '', - '', + '', '' ), 'dismiss_button' => 'rocket_update_notice', diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index ebd221b474..cad57eec75 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -6,10 +6,9 @@ use WP_Admin_Bar; use WP_Rocket\Abstract_Render; use WP_Rocket\Admin\Options_Data; -use WP_Rocket\Engine\Admin\Menu\AdminBarMenuTrait; +use WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait; use WP_Rocket\Engine\Common\Context\ContextInterface; - class AdminBar extends Abstract_Render { use AdminBarMenuTrait; @@ -50,13 +49,13 @@ public function __construct( Options_Data $options, ContextInterface $atf_contex * @return void */ public function add_clear_performance_menu_item( WP_Admin_Bar $wp_admin_bar ): void { - //TODO:Add lrc context check here + // TODO:Add lrc context check here if ( ! $this->atf_context->is_allowed() ) { return; } $title = __( 'Clear Performance Hints data', 'rocket' ); - $action = 'rocket_clear_performance_hints'; + $action = 'rocket_clean_performance_hints'; $this->add_menu_to_admin_bar( $wp_admin_bar, @@ -101,19 +100,18 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi } /** - * Filters the rocket `clear used css of this url` option on admin bar menu. + * Filters the rocket `clear performance hints data of this url` option on admin bar menu. * - * @since 3.12.1 + * @since 3.17 * * @param bool $should_skip Should skip adding `clear performance hints of this url` option in admin bar. * @param type $post Post object. */ - if ( apply_filters( 'rocket_skip_admin_bar_clear_performance_hints_option', false, $post ) ) { + if ( apply_filters( 'rocket_skip_admin_bar_clean_performance_hints_option', false, $post ) ) { return; } - - $action = 'rocket_clean_performance_hints_url'; + $action = 'rocket_clean_performance_hints_url'; $title = __( 'Clear performance hints data of this URL', 'rocket' ); @@ -136,7 +134,7 @@ public function display_dashboard_button() { $this->atf_context->is_allowed(), __( 'Performance Hints', 'rocket' ), esc_html__( 'Clear', 'rocket' ), - 'rocket_clear_performance_hints' + 'rocket_clean_performance_hints' ); } } diff --git a/inc/Engine/Common/PerformanceHints/Admin/Clean.php b/inc/Engine/Common/PerformanceHints/Admin/Clean.php new file mode 100644 index 0000000000..4c13c60319 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Admin/Clean.php @@ -0,0 +1,46 @@ +clean_data( $clean, 'rocket_performance_hints_clear_message' ); + } + + public function clean_url_performance_hints() { + check_admin_referer( 'rocket_clean_performance_hints_url' ); + + /** + * Fires when cleaning a single URL for the Saas + * + * @since 3.16 + */ + do_action( 'rocket_performance_hints_clean_url' ); + + wp_safe_redirect( esc_url_raw( wp_get_referer() ) ); + rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; + } +} diff --git a/inc/Engine/Common/PerformanceHints/Admin/Controller.php b/inc/Engine/Common/PerformanceHints/Admin/Controller.php index 98abbc6d66..4213f774df 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Controller.php @@ -124,7 +124,7 @@ public function truncate_from_admin() { 'status' => 'success', 'message' => sprintf( // translators: %1$s = plugin name. - __( '%1$s: Critical images cleared!', 'rocket' ), + __( '%1$s: WP Rocket: Critical images and Lazy Render data was cleared!', 'rocket' ), 'WP Rocket' ), ]; diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php index d0303c7d5e..a2deebdea9 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -21,14 +21,22 @@ class Subscriber implements Subscriber_Interface { */ private $admin_bar; + /** + * Clean Instance. + * + * @var Clean + */ + private $clean; + /** * Instantiate the class * * @param Controller $controller Controller instance. */ - public function __construct( Controller $controller, AdminBar $admin_bar ) { + public function __construct( Controller $controller, AdminBar $admin_bar, Clean $clean ) { $this->controller = $controller; $this->admin_bar = $admin_bar; + $this->clean = $clean; } /** @@ -38,23 +46,25 @@ public function __construct( Controller $controller, AdminBar $admin_bar ) { */ public static function get_subscribed_events(): array { return [ - 'switch_theme' => 'truncate_tables', - 'permalink_structure_changed' => 'truncate_tables', - 'rocket_domain_options_changed' => 'truncate_tables', - 'wp_trash_post' => 'delete_post', - 'delete_post' => 'delete_post', - 'clean_post_cache' => 'delete_post', - 'wp_update_comment_count' => 'delete_post', - 'edit_term' => 'delete_term', - 'pre_delete_term' => 'delete_term', - 'rocket_saas_clean_all' => 'truncate_from_admin', - 'rocket_saas_clean_url' => 'clean_url', - 'wp_rocket_upgrade' => [ 'truncate_on_update', 10, 2 ], - 'rocket_admin_bar_items' => [ + 'switch_theme' => 'truncate_tables', + 'permalink_structure_changed' => 'truncate_tables', + 'rocket_domain_options_changed' => 'truncate_tables', + 'wp_trash_post' => 'delete_post', + 'delete_post' => 'delete_post', + 'clean_post_cache' => 'delete_post', + 'wp_update_comment_count' => 'delete_post', + 'edit_term' => 'delete_term', + 'pre_delete_term' => 'delete_term', + 'rocket_performance_hints_clean_all' => 'truncate_from_admin', + 'rocket_performance_hints_clean_url' => 'clean_url', + 'wp_rocket_upgrade' => [ 'truncate_on_update', 10, 2 ], + 'rocket_admin_bar_items' => [ [ 'add_clear_performance_hints_menu_item' ], - [ 'add_clear_url_performance_hints_menu_item' ] + [ 'add_clear_url_performance_hints_menu_item' ], ], - 'rocket_dashboard_actions' => 'display_dashboard_button', + 'rocket_dashboard_actions' => 'display_dashboard_button', + 'admin_post_rocket_clean_performance_hints' => 'clean_performance_hints', + 'admin_post_rocket_clean_performance_hints_url' => 'clean_url_performance_hints', ]; } @@ -132,11 +142,12 @@ public function add_clear_performance_hints_menu_item( WP_Admin_Bar $wp_admin_ba /** * Add clear performance data hints for current url to WP Rocket admin bar menu + * * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference. * * @return void - */ - public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ): void{ + */ + public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ): void { $this->admin_bar->add_clear_url_performance_hints_menu_item( $wp_admin_bar ); } @@ -145,7 +156,20 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi * * @return void */ - public function display_dashboard_button(){ + public function display_dashboard_button() { $this->admin_bar->display_dashboard_button(); } + + /** + * Truncate Performance Hints tables when clicking on the dashboard button/menu + * + * @return void + */ + public function clean_performance_hints(): void { + $this->clean->clean_performance_hints(); + } + + public function clean_url_performance_hints(): void { + $this->clean->clean_url_performance_hints(); + } } diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index 66319cb5cd..b3ebef8380 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -6,7 +6,7 @@ use WP_Admin_Bar; use WP_Rocket\Abstract_Render; use WP_Rocket\Admin\Options_Data; -use WP_Rocket\Engine\Admin\Menu\AdminBarMenuTrait; +use WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait; use WP_Rocket\Engine\Common\Context\ContextInterface; class AdminBar extends Abstract_Render { From 5e713b0e79f8be2fd967e6cf041cc9d6eec49917 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 8 Aug 2024 14:28:50 +0100 Subject: [PATCH 047/192] Fix lint error --- .../Admin/Settings/AdminBarMenuTrait.php | 35 ++++++++++++++----- inc/Engine/Admin/Settings/Page.php | 2 +- .../PerformanceHints/Admin/AdminBar.php | 2 +- .../Common/PerformanceHints/Admin/Clean.php | 13 ++++--- .../PerformanceHints/Admin/Subscriber.php | 7 ++++ inc/Engine/Saas/Admin/Clean.php | 29 +++------------ 6 files changed, 48 insertions(+), 40 deletions(-) diff --git a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php index fb531418de..9727072185 100644 --- a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php @@ -49,7 +49,15 @@ protected function add_menu_to_admin_bar( } /** + * Admin menu to WP Rocket admin bar menu * + * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. + * @param string $id The menu id. + * @param string $title The menu title. + * @param string $action Menu action. + * @param bool $context Context. + * + * @return void */ protected function add_url_menu_item_to_admin_bar( WP_Admin_Bar $wp_admin_bar, @@ -103,7 +111,17 @@ protected function add_url_menu_item_to_admin_bar( ); } - public function dashboard_button( bool $context, string $title, string $label, string $action ) { + /** + * Add button to dashboard + * + * @param bool $context The feature context. + * @param string $title The button title. + * @param string $label Button label. + * @param string $action Button action. + * + * @return void + */ + public function dashboard_button( bool $context, string $title, string $label, string $action ): void { if ( 'local' === wp_get_environment_type() && @@ -116,13 +134,12 @@ public function dashboard_button( bool $context, string $title, string $label, s return; } - echo $this->generate( - 'sections/clean-section', - [ - 'action' => $action, - 'title' => $title, - 'label' => $label, - ] - ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $data = [ + 'action' => $action, + 'title' => $title, + 'label' => $label, + ]; + + echo $this->generate( 'sections/clean-section', $data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } diff --git a/inc/Engine/Admin/Settings/Page.php b/inc/Engine/Admin/Settings/Page.php index c6d4224316..1f091a3940 100644 --- a/inc/Engine/Admin/Settings/Page.php +++ b/inc/Engine/Admin/Settings/Page.php @@ -2248,7 +2248,7 @@ public function display_update_notice() { 'dismissible' => '', 'message' => sprintf( // translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: option a tag, %5$s: opening a tag. - __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. Our brand new feature %3$sLazy Render Content.%4$s Check out our sdocumentation to learn more about it.', 'rocket' ), + __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. Our brand new feature %3$sLazy Render Content.%4$s Check out our documentation to learn more about it.', 'rocket' ), '', '', '', diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index cad57eec75..e78fb98dcd 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -49,7 +49,7 @@ public function __construct( Options_Data $options, ContextInterface $atf_contex * @return void */ public function add_clear_performance_menu_item( WP_Admin_Bar $wp_admin_bar ): void { - // TODO:Add lrc context check here + // TODO:Add lrc context check here. if ( ! $this->atf_context->is_allowed() ) { return; } diff --git a/inc/Engine/Common/PerformanceHints/Admin/Clean.php b/inc/Engine/Common/PerformanceHints/Admin/Clean.php index 4c13c60319..2da28f70bc 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Clean.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Clean.php @@ -13,7 +13,7 @@ class Clean { * * @return void */ - public function clean_performance_hints() { + public function clean_performance_hints(): void { if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'rocket_clean_performance_hints' ) ) { wp_nonce_ays( '' ); } @@ -30,13 +30,18 @@ public function clean_performance_hints() { $this->clean_data( $clean, 'rocket_performance_hints_clear_message' ); } - public function clean_url_performance_hints() { + /** + * Clean performance hints data for current url. + * + * @return void + */ + public function clean_url_performance_hints(): void { check_admin_referer( 'rocket_clean_performance_hints_url' ); /** - * Fires when cleaning a single URL for the Saas + * Fires when cleaning a single URL for the performance hints data * - * @since 3.16 + * @since 3.17 */ do_action( 'rocket_performance_hints_clean_url' ); diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php index a2deebdea9..28bb495f30 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -32,6 +32,8 @@ class Subscriber implements Subscriber_Interface { * Instantiate the class * * @param Controller $controller Controller instance. + * @param AdminBar $admin_bar Admin bar instance. + * @param Clean $clean Clean instance. */ public function __construct( Controller $controller, AdminBar $admin_bar, Clean $clean ) { $this->controller = $controller; @@ -169,6 +171,11 @@ public function clean_performance_hints(): void { $this->clean->clean_performance_hints(); } + /** + * Truncate performance hints the current URL. + * + * @return void; + */ public function clean_url_performance_hints(): void { $this->clean->clean_url_performance_hints(); } diff --git a/inc/Engine/Saas/Admin/Clean.php b/inc/Engine/Saas/Admin/Clean.php index 413e1c764c..03bdacfdec 100644 --- a/inc/Engine/Saas/Admin/Clean.php +++ b/inc/Engine/Saas/Admin/Clean.php @@ -4,8 +4,11 @@ namespace WP_Rocket\Engine\Saas\Admin; use WP_Rocket\Admin\Options_Data; +use WP_Rocket\Engine\Admin\Settings\DataClearingTrait; class Clean { + use DataClearingTrait; + /** * Truncate SaaS tables when clicking on the dashboard button * @@ -25,31 +28,7 @@ public function clean_saas() { */ $clean = apply_filters( 'rocket_saas_clean_all', [] ); - if ( - empty( $clean ) - || - 'die' === $clean['status'] - ) { - wp_safe_redirect( esc_url_raw( wp_get_referer() ) ); - rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; - } - - if ( 'error' === $clean['status'] ) { - wp_safe_redirect( esc_url_raw( wp_get_referer() ) ); - rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; - } - - rocket_clean_domain(); - - rocket_dismiss_box( 'rocket_warning_plugin_modification' ); - - set_transient( - 'rocket_saas_clean_message', - $clean - ); - - wp_safe_redirect( esc_url_raw( wp_get_referer() ) ); - rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ? wp_die() : exit; + $this->clean_data( $clean, 'rocket_saas_clean_message' ); } /** From d967d9c6b2f05359e2ad8f784e96254d9f486c44 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 8 Aug 2024 16:27:58 +0100 Subject: [PATCH 048/192] Fixed test error --- inc/Engine/Admin/Settings/Page.php | 4 +-- .../PerformanceHints/ServiceProvider.php | 7 ++++- inc/Engine/Saas/Admin/AdminBar.php | 28 ++++--------------- .../Settings/Page/displayUpdateNotice.php | 6 ++-- .../Admin/AdminBar/addCleanSaasMenuItem.php | 16 +---------- .../Admin/AdminBar/addCleanUrlMenuItem.php | 19 +------------ .../Admin/AdminBar/addCleanSaasMenuItem.php | 4 --- 7 files changed, 19 insertions(+), 65 deletions(-) diff --git a/inc/Engine/Admin/Settings/Page.php b/inc/Engine/Admin/Settings/Page.php index 1f091a3940..69d131b72d 100644 --- a/inc/Engine/Admin/Settings/Page.php +++ b/inc/Engine/Admin/Settings/Page.php @@ -2247,8 +2247,8 @@ public function display_update_notice() { 'status' => 'info', 'dismissible' => '', 'message' => sprintf( - // translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: option a tag, %5$s: opening a tag. - __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. Our brand new feature %3$sLazy Render Content.%4$s Check out our documentation to learn more about it.', 'rocket' ), + // translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: opening a tag. + __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. Our brand new feature %3$sLazy Render Content%4$s. Check out our documentation to learn more about it.', 'rocket' ), '', '', '', diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 792ab9bf18..67ca08d61d 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -11,7 +11,8 @@ use WP_Rocket\Engine\Common\PerformanceHints\Admin\{ Controller as AdminController, Subscriber as AdminSubscriber, - AdminBar + AdminBar, + Clean }; use WP_Rocket\Engine\Common\PerformanceHints\Cron\{Controller as CronController, Subscriber as CronSubscriber}; use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{ @@ -44,6 +45,7 @@ class ServiceProvider extends AbstractServiceProvider { 'performance_hints_warmup_controller', 'performance_hints_warmup_subscriber', 'performance_hints_admin_bar', + 'performance_hints_clean', 'atf_context', ]; @@ -107,11 +109,14 @@ public function register(): void { ->addArgument( $this->getContainer()->get( 'atf_context' ) ) ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); + $this->getContainer()->add( 'performance_hints_clean', Clean::class ); + $this->getContainer()->addShared( 'performance_hints_admin_subscriber', AdminSubscriber::class ) ->addArguments( [ $this->getContainer()->get( 'performance_hints_admin_controller' ), $this->getContainer()->get( 'performance_hints_admin_bar' ), + $this->getContainer()->get( 'performance_hints_clean' ), ] ); $this->getContainer()->add( 'cron_controller', CronController::class ) diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index b3ebef8380..fa983c3e4e 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -150,27 +150,11 @@ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { * @return void */ public function display_dashboard_button() { - if ( - 'local' === wp_get_environment_type() - && - $this->rucss_url_context->is_allowed() - ) { - return; - } - - if ( ! $this->rucss_url_context->is_allowed() ) { - return; - } - - $title = __( 'Remove Unused CSS', 'rocket' ); - $label = esc_html__( 'Clear RUCSS optimizations', 'rocket' ); - - $data = [ - 'action' => 'rocket_clean_saas', - 'title' => $title, - 'label' => $label, - ]; - - echo $this->generate( 'sections/clean-section', $data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + $this->dashboard_button( + $this->rucss_url_context->is_allowed(), + __( 'Remove Unused CSS', 'rocket' ), + esc_html__( 'Clear RUCSS optimizations', 'rocket' ), + 'rocket_clean_saas' + ); } } diff --git a/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php b/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php index af3297b659..ecbb71cfee 100644 --- a/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php +++ b/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php @@ -63,14 +63,14 @@ ], 'expected' => null, ], - 'testShouldDoNothingWhenVersionGT316' => [ + 'testShouldDoNothingWhenVersionGT317' => [ 'config' => [ 'capability' => true, 'screen' => (object) [ 'id' => 'settings_page_wprocket', ], 'boxes' => [], - 'previous_version' => '3.16.1', + 'previous_version' => '3.17.1', 'beacon' => null, ], 'expected' => null, @@ -91,7 +91,7 @@ 'expected' => [ 'status' => 'info', 'dismissible' => '', - 'message' => 'WP Rocket: the plugin has been updated to the 3.16 version. Our brand new feature Optimize critical images is automatically activated now! Also, the Cache tab was removed but the existing features will remain working, see more here.', + 'message' => 'WP Rocket: the plugin has been updated to the 3.17 version. Our brand new feature Lazy Render Content. Check out our documentation to learn more about it.', 'dismiss_button' => 'rocket_update_notice', ], ], diff --git a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php index 616b488f43..11346541d1 100644 --- a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php +++ b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php @@ -34,20 +34,6 @@ ], 'expected' => null, ], - 'testShouldAddItemWithDefaultTitle' => [ - 'config' => [ - 'rocket_valid_key' => true, - 'environment' => 'production', - 'is_admin' => true, - 'atf_context' => true, - 'remove_unused_css' => 0, - 'current_user_can' => true, - ], - 'expected' => [ - 'id' => 'clean-saas', - 'title' => 'Clear Critical Images', - ], - ], 'testShouldAddItemWithRUCSSTitle' => [ 'config' => [ 'rocket_valid_key' => true, @@ -59,7 +45,7 @@ ], 'expected' => [ 'id' => 'clean-saas', - 'title' => 'Clear Used CSS', + 'title' => 'Clear RUCSS optimizations', ], ], ]; diff --git a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php index 985a06b1a3..873b6ac0ee 100644 --- a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php +++ b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php @@ -57,23 +57,6 @@ ], 'expected' => null, ], - 'testShouldAddItemWithDefaultTitle' => [ - 'config' => [ - 'environment' => 'production', - 'is_admin' => false, - 'post' => (object) [ - 'post_type' => 'post', - 'post_status' => 'publish', - ], - 'can_display_options' => true, - 'atf_context' => true, - 'rucss_context' => false, - ], - 'expected' => [ - 'id' => 'clear-saas-url', - 'title' => 'Clear Critical Images of this URL', - ], - ], 'testShouldAddItemWithRUCSSTitle' => [ 'config' => [ 'environment' => 'production', @@ -88,7 +71,7 @@ ], 'expected' => [ 'id' => 'clear-saas-url', - 'title' => 'Clear Used CSS of this URL', + 'title' => 'Clear RUCSS optimizations of this URL', ], ], ]; diff --git a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php index 1f3f0b6116..3ff5650444 100644 --- a/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php +++ b/tests/Unit/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php @@ -31,7 +31,6 @@ protected function setUp(): void { parent::setUp(); $this->options = Mockery::mock( Options_Data::class ); - $this->atf_context = Mockery::mock( ContextInterface::class ); $this->rucss_url_context = Mockery::mock( ContextInterface::class ); $this->admin_bar = new AdminBar( $this->options, $this->rucss_url_context, '' ); $this->wp_admin_bar = new WP_Admin_Bar(); @@ -50,9 +49,6 @@ public function testShouldDoExpected( $config, $expected ) { Functions\when( 'is_admin' ) ->justReturn( $config['is_admin'] ); - $this->atf_context->shouldReceive( 'is_allowed' ) - ->andReturn( $config['atf_context'] ); - $this->options->shouldReceive( 'get' ) ->with( 'remove_unused_css', 0 ) ->andReturn( $config['remove_unused_css'] ); From 1e22c9b0d2cc5353f2c5bf87803d1b3f598fa55c Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 9 Aug 2024 12:37:08 +0100 Subject: [PATCH 049/192] Add unit test --- .../PerformanceHints/Admin/AdminBar.php | 11 +-- .../PerformanceHints/ServiceProvider.php | 1 - .../AdminBar/addCleanPerformanceHintsItem.php | 47 ++++++++++ .../addPerformanceHintsClearUrlMenuItem.php | 72 +++++++++++++++ .../AdminBar/addCleanPerformanceHintsItem.php | 86 +++++++++++++++++ .../addPerformanceHintsClearUrlMenuItem.php | 92 +++++++++++++++++++ 6 files changed, 298 insertions(+), 11 deletions(-) create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index e78fb98dcd..ae418fba1f 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -12,13 +12,6 @@ class AdminBar extends Abstract_Render { use AdminBarMenuTrait; - /** - * Options data instance. - * - * @var Options_data - */ - private $options; - /** * ATF context. * @@ -30,14 +23,12 @@ class AdminBar extends Abstract_Render { /** * Constructor * - * @param Options_Data $options Options data instance. * @param ContextInterface $atf_context ATF context. * @param string $template_path Template path. */ - public function __construct( Options_Data $options, ContextInterface $atf_context, $template_path ) { + public function __construct( ContextInterface $atf_context, $template_path ) { parent::__construct( $template_path ); - $this->options = $options; $this->atf_context = $atf_context; } diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 67ca08d61d..f236faa626 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -105,7 +105,6 @@ public function register(): void { ); $this->getContainer()->add( 'performance_hints_admin_bar', Adminbar::class ) - ->addArgument( $this->getContainer()->get( 'options' ) ) ->addArgument( $this->getContainer()->get( 'atf_context' ) ) ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php new file mode 100644 index 0000000000..006cd3a099 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -0,0 +1,47 @@ + [ + 'config' => [ + 'rocket_valid_key' => false, + 'environment' => 'production', + 'is_admin' => true, + 'atf_context' => true, + 'current_user_can' => true, + ], + 'expected' => null, + ], + 'testShouldAddItemWithPerformanceHintTitle' => [ + 'config' => [ + 'rocket_valid_key' => true, + 'environment' => 'production', + 'is_admin' => true, + 'atf_context' => true, + 'current_user_can' => true, + ], + 'expected' => [ + 'id' => 'clear-performance-hints', + 'title' => 'Clear Performance Hints data', + ], + ], + 'testShouldReturnNullWhenLocalEnvironment' => [ + 'config' => [ + 'rocket_valid_key' => true, + 'environment' => 'local', + 'is_admin' => false, + 'atf_context' => false, + 'current_user_can' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenNotAdmin' => [ + 'config' => [ + 'rocket_valid_key' => true, + 'environment' => 'production', + 'is_admin' => false, + 'atf_context' => false, + 'current_user_can' => true, + ], + 'expected' => null, + ], +]; diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php new file mode 100644 index 0000000000..2aff26a9a2 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -0,0 +1,72 @@ + [ + 'config' => [ + 'environment' => 'local', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenAdmin' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => true, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenOptionsNotDisplayed' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'draft', + ], + 'can_display_options' => false, + 'atf_context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenNotAllowed' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => false, + ], + 'expected' => null, + ], + 'testShouldAddItemWithPerformanceHintsTitle' => [ + 'config' => [ + 'environment' => 'production', + 'is_admin' => false, + 'post' => (object) [ + 'post_type' => 'post', + 'post_status' => 'publish', + ], + 'can_display_options' => true, + 'atf_context' => true, + ], + 'expected' => [ + 'id' => 'clear-performance-hints-data-url', + 'title' => 'Clear performance hints data of this URL', + ], + ], +]; diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php new file mode 100644 index 0000000000..872695ecbd --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -0,0 +1,86 @@ +atf_context = Mockery::mock( ContextInterface::class ); + $this->admin_bar = new AdminBar( $this->atf_context, '' ); + $this->wp_admin_bar = new WP_Admin_Bar(); + + $this->stubTranslationFunctions(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + Functions\when( 'rocket_valid_key' ) + ->justReturn( $config['rocket_valid_key'] ); + Functions\when( 'wp_get_environment_type' ) + ->justReturn( $config['environment'] ); + Functions\when( 'is_admin' ) + ->justReturn( $config['is_admin'] ); + + Functions\when( 'current_user_can' ) + ->justReturn( $config['current_user_can'] ); + + Functions\when( 'wp_nonce_url' )->alias( + function ( $url ) { + return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); + } + ); + + $this->atf_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['atf_context'] ); + + Functions\when( 'admin_url' )->alias( + function ( $path ) { + return "http://example.org/wp-admin/{$path}"; + } + ); + + $this->admin_bar->add_clear_performance_menu_item( $this->wp_admin_bar ); + + $node = $this->wp_admin_bar->get_node( 'clear-performance-hints' ); + + if ( null === $expected ) { + $this->assertNull( $node ); + return; + } + + $this->assertSame( + $expected['id'], + $node->id + ); + + $this->assertSame( + $expected['title'], + $node->title + ); + } +} diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php new file mode 100644 index 0000000000..204baa5518 --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -0,0 +1,92 @@ +atf_context = Mockery::mock( ContextInterface::class ); + $this->admin_bar = new AdminBar( $this->atf_context, '' ); + $this->wp_admin_bar = new WP_Admin_Bar(); + + $this->stubTranslationFunctions(); + } + + protected function tearDown(): void { + unset( $GLOBALS['post'] ); + + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + Functions\when( 'wp_get_environment_type' ) + ->justReturn( $config['environment'] ); + Functions\when( 'is_admin' ) + ->justReturn( $config['is_admin'] ); + + $GLOBALS['post'] = $config['post']; + + Functions\when( 'rocket_can_display_options' ) + ->justReturn( $config['can_display_options'] ); + + $this->atf_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['atf_context'] ); + + Functions\when( 'wp_nonce_url' )->alias( + function ( $url ) { + return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); + } + ); + + Functions\when( 'admin_url' )->alias( + function ( $path ) { + return "http://example.org/wp-admin/{$path}"; + } + ); + + $this->admin_bar->add_clear_url_performance_hints_menu_item( $this->wp_admin_bar ); + + $node = $this->wp_admin_bar->get_node( 'clear-performance-hints-data-url' ); + + if ( null === $expected ) { + $this->assertNull( $node ); + return; + } + + $this->assertSame( + $expected['id'], + $node->id + ); + + $this->assertSame( + $expected['title'], + $node->title + ); + } +} From 3b448a865e8c1a321e90682a891a3e9b778ed1ae Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 9 Aug 2024 12:57:48 +0100 Subject: [PATCH 050/192] Add hover text to button component --- inc/Engine/Admin/Settings/AdminBarMenuTrait.php | 10 ++++++---- inc/Engine/Common/PerformanceHints/Admin/AdminBar.php | 3 ++- views/settings/sections/clean-section.php | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php index 9727072185..0b1301443b 100644 --- a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php @@ -118,10 +118,11 @@ protected function add_url_menu_item_to_admin_bar( * @param string $title The button title. * @param string $label Button label. * @param string $action Button action. + * @param string $hover_text Button Hover text. * * @return void */ - public function dashboard_button( bool $context, string $title, string $label, string $action ): void { + public function dashboard_button( bool $context, string $title, string $label, string $action, string $hover_text = '' ): void { if ( 'local' === wp_get_environment_type() && @@ -135,9 +136,10 @@ public function dashboard_button( bool $context, string $title, string $label, s } $data = [ - 'action' => $action, - 'title' => $title, - 'label' => $label, + 'action' => $action, + 'title' => $title, + 'label' => $label, + 'hover_text' => $hover_text ]; echo $this->generate( 'sections/clean-section', $data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index ae418fba1f..b6451981f2 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -125,7 +125,8 @@ public function display_dashboard_button() { $this->atf_context->is_allowed(), __( 'Performance Hints', 'rocket' ), esc_html__( 'Clear', 'rocket' ), - 'rocket_clean_performance_hints' + 'rocket_clean_performance_hints', + __( 'This action will clear data for Optimize Critical Images and Lazy Render Content.', 'rocket' ) ); } } diff --git a/views/settings/sections/clean-section.php b/views/settings/sections/clean-section.php index 4912174f00..f9e9c8c402 100644 --- a/views/settings/sections/clean-section.php +++ b/views/settings/sections/clean-section.php @@ -23,6 +23,7 @@ 'label' => $data['label'], 'attributes' => [ 'class' => 'wpr-button wpr-button--icon wpr-button--small wpr-icon-trash', + 'title' => $data['hover_text'] ], ] ); From bf2cc9404a3f8be32f31cbfdbdbc6110704116bf Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 9 Aug 2024 13:20:15 +0100 Subject: [PATCH 051/192] Fixed lint --- inc/Engine/Admin/Settings/AdminBarMenuTrait.php | 2 +- views/settings/sections/clean-section.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php index 0b1301443b..38215a40ab 100644 --- a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php @@ -139,7 +139,7 @@ public function dashboard_button( bool $context, string $title, string $label, s 'action' => $action, 'title' => $title, 'label' => $label, - 'hover_text' => $hover_text + 'hover_text' => $hover_text, ]; echo $this->generate( 'sections/clean-section', $data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped diff --git a/views/settings/sections/clean-section.php b/views/settings/sections/clean-section.php index f9e9c8c402..db71e96ddb 100644 --- a/views/settings/sections/clean-section.php +++ b/views/settings/sections/clean-section.php @@ -23,7 +23,7 @@ 'label' => $data['label'], 'attributes' => [ 'class' => 'wpr-button wpr-button--icon wpr-button--small wpr-icon-trash', - 'title' => $data['hover_text'] + 'title' => $data['hover_text'], ], ] ); From e3c0ae8710144d42e4386e160ba92df7e259bea1 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 9 Aug 2024 14:29:53 +0100 Subject: [PATCH 052/192] Add notices, fix display notice message error --- .../Common/PerformanceHints/Admin/Notices.php | 51 +++++++++++++++++++ .../PerformanceHints/Admin/Subscriber.php | 23 ++++++++- .../PerformanceHints/ServiceProvider.php | 8 ++- inc/classes/class-abstract-render.php | 1 + 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/Admin/Notices.php diff --git a/inc/Engine/Common/PerformanceHints/Admin/Notices.php b/inc/Engine/Common/PerformanceHints/Admin/Notices.php new file mode 100644 index 0000000000..ae4cc3cc60 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/Admin/Notices.php @@ -0,0 +1,51 @@ +atf_context = $atf_context; + } + + /** + * Show admin notice after clearing performance hints tables. + * + * @return void + */ + public function clean_saas_result() { + if ( ! current_user_can( 'rocket_manage_options' ) ) { + return; + } + + if ( ! $this->atf_context->is_allowed() ) { + return; + } + + $response = get_transient( 'rocket_performance_hints_clear_message' ); + + if ( ! $response ) { + return; + } + + delete_transient( 'rocket_performance_hints_clear_message' ); + + rocket_notice_html( $response ); + } +} diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php index 28bb495f30..4220765511 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -28,17 +28,26 @@ class Subscriber implements Subscriber_Interface { */ private $clean; + /** + * Notices Instance. + * + * @var Notices + */ + private $notices; + /** * Instantiate the class * * @param Controller $controller Controller instance. * @param AdminBar $admin_bar Admin bar instance. * @param Clean $clean Clean instance. + * @param Notices $notices Notices instance. */ - public function __construct( Controller $controller, AdminBar $admin_bar, Clean $clean ) { + public function __construct( Controller $controller, AdminBar $admin_bar, Clean $clean, Notices $notices ) { $this->controller = $controller; $this->admin_bar = $admin_bar; $this->clean = $clean; + $this->notices = $notices; } /** @@ -64,6 +73,9 @@ public static function get_subscribed_events(): array { [ 'add_clear_performance_hints_menu_item' ], [ 'add_clear_url_performance_hints_menu_item' ], ], + 'admin_notices' => [ + [ 'clea_performance_hint_result' ], + ], 'rocket_dashboard_actions' => 'display_dashboard_button', 'admin_post_rocket_clean_performance_hints' => 'clean_performance_hints', 'admin_post_rocket_clean_performance_hints_url' => 'clean_url_performance_hints', @@ -179,4 +191,13 @@ public function clean_performance_hints(): void { public function clean_url_performance_hints(): void { $this->clean->clean_url_performance_hints(); } + + /** + * Show admin notice after clearing Performance Hints tables. + * + * @return void + */ + public function clea_performance_hint_result(): void { + $this->notices->clean_saas_result(); + } } diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index f236faa626..b08728932e 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -12,7 +12,8 @@ Controller as AdminController, Subscriber as AdminSubscriber, AdminBar, - Clean + Clean, + Notices }; use WP_Rocket\Engine\Common\PerformanceHints\Cron\{Controller as CronController, Subscriber as CronSubscriber}; use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{ @@ -46,6 +47,7 @@ class ServiceProvider extends AbstractServiceProvider { 'performance_hints_warmup_subscriber', 'performance_hints_admin_bar', 'performance_hints_clean', + 'performance_hints_notices', 'atf_context', ]; @@ -104,6 +106,9 @@ public function register(): void { ] ); + $this->getContainer()->add( 'performance_hints_notices', Notices::class ) + ->addArgument( $this->getContainer()->get( 'atf_context' ) ); + $this->getContainer()->add( 'performance_hints_admin_bar', Adminbar::class ) ->addArgument( $this->getContainer()->get( 'atf_context' ) ) ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); @@ -116,6 +121,7 @@ public function register(): void { $this->getContainer()->get( 'performance_hints_admin_controller' ), $this->getContainer()->get( 'performance_hints_admin_bar' ), $this->getContainer()->get( 'performance_hints_clean' ), + $this->getContainer()->get( 'performance_hints_notices' ), ] ); $this->getContainer()->add( 'cron_controller', CronController::class ) diff --git a/inc/classes/class-abstract-render.php b/inc/classes/class-abstract-render.php index c804996549..07320360c8 100644 --- a/inc/classes/class-abstract-render.php +++ b/inc/classes/class-abstract-render.php @@ -125,6 +125,7 @@ public function render_action_button( $type, $action, $args = [] ) { case 'rocket_generate_critical_css': case 'rocket_purge_rocketcdn': case 'rocket_clean_saas': + case 'rocket_clean_performance_hints': $referer = ''; if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { From d520bbc54831a317597c0570d33bc28d4fb794b0 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 9 Aug 2024 18:29:56 +0100 Subject: [PATCH 053/192] Update test --- .../Admin/Controller/truncateFromAdmin.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php index a436239615..e95e05bc82 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php @@ -2,6 +2,8 @@ namespace WP_Rocket\Tests\Integration\inc\Engine\Common\PerformanceHints\Admin\Controller; +use WP_Rocket\Engine\Common\PerformanceHints\Admin\Controller; +use WP_Rocket\Engine\Media\AboveTheFold\Database\Queries\AboveTheFold; use WP_Rocket\Tests\Integration\TestCase; use Brain\Monkey\Functions; use Mockery; @@ -14,6 +16,9 @@ class Test_TruncateFromAdmin extends TestCase { protected $config; + private $factories; + private $queries; + public static function set_up_before_class() { parent::set_up_before_class(); @@ -33,11 +38,15 @@ public static function tear_down_after_class() { public function testShouldDoAsExpected( $config, $expected ) { $this->config = $config; $container = apply_filters( 'rocket_container', null ); + $atf_factory = $container->get( 'atf_factory' ); + + $controller = Mockery::mock( Controller::class, [ [ $atf_factory ] ] )->makePartial(); foreach ( $this->config['rows'] as $row ) { self::addLcp( $row ); } Functions\expect( 'current_user_can' )->once()->with('rocket_manage_options')->andReturn($config['rocket_manage_options']); - do_action( 'rocket_saas_clean_all', [] ); + add_action('rocket_performance_hints_clean_all', [$controller, 'truncate_from_admin']); + do_action( 'rocket_performance_hints_clean_all', [] ); $atf_query = $container->get( 'atf_query' ); $result_atf_after_clean = $atf_query->query(); @@ -46,5 +55,6 @@ public function testShouldDoAsExpected( $config, $expected ) { if ( ! $expected ) { $this->assertSame( 1, did_action( 'rocket_after_clear_performance_hints_data' ) ); } + remove_action('rocket_performance_hints_clean_all', [$controller, 'truncate_from_admin']); } } From 19e6ebd258c3b354903c454adf594779af20d5f6 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Sat, 10 Aug 2024 00:39:18 +0100 Subject: [PATCH 054/192] Add tests and delete unsed class --- .../Common/PerformanceHints/Admin/Notices.php | 2 +- .../PerformanceHints/Admin/Subscriber.php | 6 +-- .../PerformanceHints/Context/Context.php | 22 -------- .../PerformanceHints/ServiceProvider.php | 1 - ...splayCleanPerformanceHintsResultNotice.php | 51 +++++++++++++++++++ .../Admin/Controller/truncateFromAdmin.php | 4 -- ...splayCleanPerformanceHintsResultNotice.php | 50 ++++++++++++++++++ 7 files changed, 105 insertions(+), 31 deletions(-) delete mode 100644 inc/Engine/Common/PerformanceHints/Context/Context.php create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php create mode 100644 tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php diff --git a/inc/Engine/Common/PerformanceHints/Admin/Notices.php b/inc/Engine/Common/PerformanceHints/Admin/Notices.php index ae4cc3cc60..34c29fa7e9 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Notices.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Notices.php @@ -29,7 +29,7 @@ public function __construct( ContextInterface $atf_context ) { * * @return void */ - public function clean_saas_result() { + public function clean_performance_hint_result() { if ( ! current_user_can( 'rocket_manage_options' ) ) { return; } diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php index 41bb096c5f..31688bdf72 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -74,7 +74,7 @@ public static function get_subscribed_events(): array { [ 'add_clear_url_performance_hints_menu_item' ], ], 'admin_notices' => [ - [ 'clea_performance_hint_result' ], + [ 'clean_performance_hint_result' ], ], 'rocket_dashboard_actions' => 'display_dashboard_button', 'admin_post_rocket_clean_performance_hints' => 'clean_performance_hints', @@ -199,7 +199,7 @@ public function clean_url_performance_hints(): void { * * @return void */ - public function clea_performance_hint_result(): void { - $this->notices->clean_saas_result(); + public function clean_performance_hint_result(): void { + $this->notices->clean_performance_hint_result(); } } diff --git a/inc/Engine/Common/PerformanceHints/Context/Context.php b/inc/Engine/Common/PerformanceHints/Context/Context.php deleted file mode 100644 index 300ebb716c..0000000000 --- a/inc/Engine/Common/PerformanceHints/Context/Context.php +++ /dev/null @@ -1,22 +0,0 @@ - [ + 'shouldDoNothingWhenNoCapability' => [ + 'config' => [ + 'capability' => false, + 'atf_context' => 1, + 'transient' => false, + 'performance_hints_transient' => false, + ], + 'expected' => false, + ], + 'shouldDoNothingWhenATFDisabled' => [ + 'config' => [ + 'capability' => true, + 'atf_context' => 0, + 'transient' => false, + 'performance_hints_transient' => false, + ], + 'expected' => false, + ], + 'shouldDoNothingWhenTransientTimeLessThanCurrentTime' => [ + 'config' => [ + 'capability' => true, + 'atf_context' => 0, + 'transient' => time() - 30, + 'performance_hints_transient' => false, + ], + 'expected' => false, + ], + 'shouldDoNothingWhenNoTransient' => [ + 'config' => [ + 'capability' => true, + 'atf_context' => 1, + 'transient' => false, + 'performance_hints_transient' => false, + ], + 'expected' => false, + ], + 'shouldShowNoticeWhenTransient' => [ + 'config' => [ + 'capability' => true, + 'atf_context' => 1, + 'transient' => time() + 3600, + 'performance_hints_transient' => false, + ], + 'expected' => true, + ], + ], +]; diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php index e95e05bc82..aa8cfe6d71 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php @@ -38,14 +38,11 @@ public static function tear_down_after_class() { public function testShouldDoAsExpected( $config, $expected ) { $this->config = $config; $container = apply_filters( 'rocket_container', null ); - $atf_factory = $container->get( 'atf_factory' ); - $controller = Mockery::mock( Controller::class, [ [ $atf_factory ] ] )->makePartial(); foreach ( $this->config['rows'] as $row ) { self::addLcp( $row ); } Functions\expect( 'current_user_can' )->once()->with('rocket_manage_options')->andReturn($config['rocket_manage_options']); - add_action('rocket_performance_hints_clean_all', [$controller, 'truncate_from_admin']); do_action( 'rocket_performance_hints_clean_all', [] ); $atf_query = $container->get( 'atf_query' ); @@ -55,6 +52,5 @@ public function testShouldDoAsExpected( $config, $expected ) { if ( ! $expected ) { $this->assertSame( 1, did_action( 'rocket_after_clear_performance_hints_data' ) ); } - remove_action('rocket_performance_hints_clean_all', [$controller, 'truncate_from_admin']); } } diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php new file mode 100644 index 0000000000..b0dfaa8e25 --- /dev/null +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php @@ -0,0 +1,50 @@ +atf_context = Mockery::mock( ContextInterface::class ); + $this->notices = new Notices( $this->atf_context ); + + $this->stubTranslationFunctions(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldDoExpected( $config, $expected ) { + Functions\expect( 'current_user_can' ) + ->once() + ->with( 'rocket_manage_options' ) + ->andReturn( $config['capability'] ); + + Functions\when('get_transient')->alias(function ($name) use ($config) { + return $config['transient']; + }); + + $this->atf_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['atf_context'] ); + + if ( $expected ) { + Functions\expect( 'rocket_notice_html' ) + ->once(); + Functions\expect('delete_transient')->with('rocket_performance_hints_clear_message'); + } else { + Functions\expect( 'rocket_notice_html' )->never(); + } + + $this->notices->clean_performance_hint_result(); + } +} From bc1414e38c7e4c4b69289fd0aee291274a5d5792 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Sat, 10 Aug 2024 00:48:38 +0100 Subject: [PATCH 055/192] Fix linter --- inc/Engine/Common/PerformanceHints/Admin/Subscriber.php | 2 +- .../Admin/Notices/displayCleanPerformanceHintsResultNotice.php | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php index 31688bdf72..2c6449c9a3 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Subscriber.php @@ -188,7 +188,7 @@ public function clean_performance_hints(): void { /** * Truncate performance hints the current URL. * - * @return void; + * @return void */ public function clean_url_performance_hints(): void { $this->clean->clean_url_performance_hints(); diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php index b0dfaa8e25..22089b2105 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php @@ -8,6 +8,9 @@ use WP_Rocket\Engine\Common\Context\ContextInterface; use WP_Rocket\Engine\Common\PerformanceHints\Admin\Notices; +/** + * Test class covering \WP_Rocket\Engine\Common\PerformanceHints\Admin\Notices::clean_performance_hint_result + */ class Test_DisplayCleanPerformanceHintsResultNotice extends TestCase { protected $atf_context; private $notices; From 00a3bda343e6ae67230f9e674473cdb07dae8a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Mon, 12 Aug 2024 15:13:22 -0400 Subject: [PATCH 056/192] Closes #6829 Add LRC activation and context (#6848) --- assets/js/wpr-beacon.min.js | 2 +- .../Activation/ServiceProvider.php | 14 ++++++++ .../Activation/ActivationFactory.php | 35 +++++++++++++++++++ .../LazyRenderContent/Context/Context.php | 27 ++++++++++++++ .../Context/Context/isAllowed.php | 25 +++++++++++++ .../ActivationFactory/getContext.php | 24 +++++++++++++ .../Context/Context/isAllowed.php | 35 +++++++++++++++++++ 7 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Context/Context.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory/getContext.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index 458ab3c850..f6a96f0ec7 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore();this.config.status.atf&&e===!1?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available"),this._saveFinalResultIntoDB()}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return a.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!a.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).success}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); +(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.scriptTimer=new Date,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore();this.config.status.atf&&e===!1?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available"),this._saveFinalResultIntoDB()}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return a.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!a.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).success}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php index 50483bd380..8954bebd6f 100644 --- a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php @@ -7,6 +7,7 @@ use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{APIClient, Controller as WarmUpController, Subscriber as WarmUpSubscriber, Queue}; use WP_Rocket\Engine\Media\AboveTheFold\Context\Context as ATFContext; use WP_Rocket\Engine\Media\AboveTheFold\Activation\ActivationFactory as ATFActivationFactory; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Activation\ActivationFactory as LCRActivationFactory; class ServiceProvider extends AbstractServiceProvider { /** @@ -26,6 +27,7 @@ class ServiceProvider extends AbstractServiceProvider { 'performance_hints_warmup_subscriber', 'atf_context', 'atf_activation_factory', + 'lcr_activation_factory', ]; /** @@ -54,6 +56,12 @@ public function register(): void { $this->getContainer()->get( 'atf_context' ), ] ); + $this->getContainer()->addShared( 'lcr_activation_factory', LCRActivationFactory::class ) + ->addArguments( + [ + $this->getContainer()->get( 'lcr_context' ), + ] + ); $factories = []; @@ -63,6 +71,12 @@ public function register(): void { $factories[] = $atf_activation_factory; } + $lcr_activation_factory = $this->getContainer()->get( 'lcr_activation_factory' ); + + if ( $lcr_activation_factory->get_context()->is_allowed() ) { + $factories[] = $lcr_activation_factory; + } + $this->getContainer()->add( 'performance_hints_warmup_apiclient', APIClient::class ) ->addArgument( $this->getContainer()->get( 'options' ) ); diff --git a/inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory.php b/inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory.php new file mode 100644 index 0000000000..4ae349d4e4 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory.php @@ -0,0 +1,35 @@ +context = $context; + } + + /** + * Provides a Context object. + * + * @return ContextInterface + */ + public function get_context(): ContextInterface { + return $this->context; + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Context/Context.php b/inc/Engine/Optimization/LazyRenderContent/Context/Context.php new file mode 100644 index 0000000000..0f5a03cb25 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Context/Context.php @@ -0,0 +1,27 @@ + [ + 'config' => [ + 'licence' => true, + 'filter' => true, + ], + 'expected' => false, + ], + 'testShouldReturnFalseWhenFilterFalse' => [ + 'config' => [ + 'licence' => false, + 'filter' => false, + ], + 'expected' => false, + ], + 'testShouldReturnTrueWhenLicenseAndFilterTrue' => [ + 'config' => [ + 'licence' => false, + 'filter' => true, + ], + 'expected' => true, + ], +]; diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory/getContext.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory/getContext.php new file mode 100644 index 0000000000..1870a95b22 --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Activation/ActivationFactory/getContext.php @@ -0,0 +1,24 @@ +assertInstanceOf( + ContextInterface::class, + $activation_factory->get_context() + ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php new file mode 100644 index 0000000000..0bb6b9aced --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php @@ -0,0 +1,35 @@ +context = new Context(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + Functions\when( 'get_option' )->justReturn( $config['licence'] ); + Filters\expectApplied( 'rocket_lazy_render_content_optimization' ) + ->andReturn( $config['filter'] ); + + $this->assertSame( + $expected, + $this->context->is_allowed() + ); + } +} From ef859a7c089ed7856940598055b37db4a514863e Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Tue, 13 Aug 2024 12:21:24 +0100 Subject: [PATCH 057/192] Fixes fatal error on activation using feature/lrc branch (#6864) --- .../Activation/ServiceProvider.php | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php index 8954bebd6f..6640dbe77a 100644 --- a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php @@ -7,7 +7,8 @@ use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{APIClient, Controller as WarmUpController, Subscriber as WarmUpSubscriber, Queue}; use WP_Rocket\Engine\Media\AboveTheFold\Context\Context as ATFContext; use WP_Rocket\Engine\Media\AboveTheFold\Activation\ActivationFactory as ATFActivationFactory; -use WP_Rocket\Engine\Optimization\LazyRenderContent\Activation\ActivationFactory as LCRActivationFactory; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Activation\ActivationFactory as LRCActivationFactory; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context as LRCContext; class ServiceProvider extends AbstractServiceProvider { /** @@ -27,7 +28,8 @@ class ServiceProvider extends AbstractServiceProvider { 'performance_hints_warmup_subscriber', 'atf_context', 'atf_activation_factory', - 'lcr_activation_factory', + 'lrc_context', + 'lrc_activation_factory', ]; /** @@ -56,10 +58,13 @@ public function register(): void { $this->getContainer()->get( 'atf_context' ), ] ); - $this->getContainer()->addShared( 'lcr_activation_factory', LCRActivationFactory::class ) + + $this->getContainer()->add( 'lrc_context', LRCContext::class ); + + $this->getContainer()->addShared( 'lrc_activation_factory', LRCActivationFactory::class ) ->addArguments( [ - $this->getContainer()->get( 'lcr_context' ), + $this->getContainer()->get( 'lrc_context' ), ] ); @@ -71,10 +76,10 @@ public function register(): void { $factories[] = $atf_activation_factory; } - $lcr_activation_factory = $this->getContainer()->get( 'lcr_activation_factory' ); + $lrc_activation_factory = $this->getContainer()->get( 'lrc_activation_factory' ); - if ( $lcr_activation_factory->get_context()->is_allowed() ) { - $factories[] = $lcr_activation_factory; + if ( $lrc_activation_factory->get_context()->is_allowed() ) { + $factories[] = $lrc_activation_factory; } $this->getContainer()->add( 'performance_hints_warmup_apiclient', APIClient::class ) From c158030dd32aed7ad2f076a7ca3d16c4a4f96d03 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 09:50:41 +0100 Subject: [PATCH 058/192] Fix test error --- .../Admin/AdminBar/addCleanPerformanceHintsItem.php | 4 +++- .../Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php index 872695ecbd..a2cddca496 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -16,6 +16,7 @@ class Test_AddCleanPerformanceHintsItem extends TestCase { private $admin_bar; private $atf_context; + private $lrc_context; private $wp_admin_bar; @@ -29,7 +30,8 @@ protected function setUp(): void { parent::setUp(); $this->atf_context = Mockery::mock( ContextInterface::class ); - $this->admin_bar = new AdminBar( $this->atf_context, '' ); + $this->lrc_context = Mockery::mock( ContextInterface::class ); + $this->admin_bar = new AdminBar( $this->atf_context, $this->lrc_context,'' ); $this->wp_admin_bar = new WP_Admin_Bar(); $this->stubTranslationFunctions(); diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php index 204baa5518..72d8636e5a 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -17,6 +17,7 @@ class Test_AddPerformanceHintsClearUrlMenuItem extends TestCase { private $admin_bar; private $atf_context; + private $lrc_context; private $wp_admin_bar; public static function setUpBeforeClass(): void { @@ -29,7 +30,8 @@ protected function setUp(): void { parent::setUp(); $this->atf_context = Mockery::mock( ContextInterface::class ); - $this->admin_bar = new AdminBar( $this->atf_context, '' ); + $this->lrc_context = Mockery::mock( ContextInterface::class ); + $this->admin_bar = new AdminBar( $this->atf_context, $this->lrc_context, '' ); $this->wp_admin_bar = new WP_Admin_Bar(); $this->stubTranslationFunctions(); From 87539b7fc4601d096c0cac8e56622c8c23b8f138 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 10:13:01 +0100 Subject: [PATCH 059/192] Modify unit tests --- .../AdminBar/addCleanPerformanceHintsItem.php | 32 +++++++++++++++++++ .../addPerformanceHintsClearUrlMenuItem.php | 5 +++ ...splayCleanPerformanceHintsResultNotice.php | 13 +++++--- .../AdminBar/addCleanPerformanceHintsItem.php | 3 ++ .../addPerformanceHintsClearUrlMenuItem.php | 3 ++ ...splayCleanPerformanceHintsResultNotice.php | 3 ++ 6 files changed, 55 insertions(+), 4 deletions(-) diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php index 006cd3a099..9af0871f87 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -7,6 +7,7 @@ 'environment' => 'production', 'is_admin' => true, 'atf_context' => true, + 'lrc_context' => true, 'current_user_can' => true, ], 'expected' => null, @@ -17,6 +18,35 @@ 'environment' => 'production', 'is_admin' => true, 'atf_context' => true, + 'lrc_context' => true, + 'current_user_can' => true, + ], + 'expected' => [ + 'id' => 'clear-performance-hints', + 'title' => 'Clear Performance Hints data', + ], + ], + 'testShouldAddItemWithPerformanceHintTitleWhenOnlyATFIsAllowed' => [ + 'config' => [ + 'rocket_valid_key' => true, + 'environment' => 'production', + 'is_admin' => true, + 'atf_context' => true, + 'lrc_context' => false, + 'current_user_can' => true, + ], + 'expected' => [ + 'id' => 'clear-performance-hints', + 'title' => 'Clear Performance Hints data', + ], + ], + 'testShouldAddItemWithPerformanceHintTitleWhenOnlyLRCIsAllowed' => [ + 'config' => [ + 'rocket_valid_key' => true, + 'environment' => 'production', + 'is_admin' => true, + 'atf_context' => false, + 'lrc_context' => true, 'current_user_can' => true, ], 'expected' => [ @@ -30,6 +60,7 @@ 'environment' => 'local', 'is_admin' => false, 'atf_context' => false, + 'lrc_context' => false, 'current_user_can' => true, ], 'expected' => null, @@ -40,6 +71,7 @@ 'environment' => 'production', 'is_admin' => false, 'atf_context' => false, + 'lrc_context' => false, 'current_user_can' => true, ], 'expected' => null, diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php index 2aff26a9a2..ebda876e66 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -11,6 +11,7 @@ ], 'can_display_options' => true, 'atf_context' => true, + 'lrc_context' => true, ], 'expected' => null, ], @@ -24,6 +25,7 @@ ], 'can_display_options' => true, 'atf_context' => true, + 'lrc_context' => true, ], 'expected' => null, ], @@ -37,6 +39,7 @@ ], 'can_display_options' => false, 'atf_context' => true, + 'lrc_context' => true, ], 'expected' => null, ], @@ -50,6 +53,7 @@ ], 'can_display_options' => true, 'atf_context' => false, + 'lrc_context' => false, ], 'expected' => null, ], @@ -63,6 +67,7 @@ ], 'can_display_options' => true, 'atf_context' => true, + 'lrc_context' => true, ], 'expected' => [ 'id' => 'clear-performance-hints-data-url', diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php index 46c38e29e9..9c0d8debbb 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php @@ -6,6 +6,7 @@ 'config' => [ 'capability' => false, 'atf_context' => 1, + 'lrc_context' => 1, 'transient' => false, 'performance_hints_transient' => false, ], @@ -14,7 +15,8 @@ 'shouldDoNothingWhenATFDisabled' => [ 'config' => [ 'capability' => true, - 'atf_context' => 0, + 'atf_context' => false, + 'lrc_context' => false, 'transient' => false, 'performance_hints_transient' => false, ], @@ -23,7 +25,8 @@ 'shouldDoNothingWhenTransientTimeLessThanCurrentTime' => [ 'config' => [ 'capability' => true, - 'atf_context' => 0, + 'atf_context' => false, + 'lrc_context' => false, 'transient' => time() - 30, 'performance_hints_transient' => false, ], @@ -32,7 +35,8 @@ 'shouldDoNothingWhenNoTransient' => [ 'config' => [ 'capability' => true, - 'atf_context' => 1, + 'atf_context' => true, + 'lrc_context' => true, 'transient' => false, 'performance_hints_transient' => false, ], @@ -41,7 +45,8 @@ 'shouldShowNoticeWhenTransient' => [ 'config' => [ 'capability' => true, - 'atf_context' => 1, + 'atf_context' => true, + 'lrc_context' => true, 'transient' => time() + 3600, 'performance_hints_transient' => false, ], diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php index a2cddca496..4869c70290 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -60,6 +60,9 @@ function ( $url ) { $this->atf_context->shouldReceive( 'is_allowed' ) ->andReturn( $config['atf_context'] ); + $this->lrc_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['lrc_context'] ); + Functions\when( 'admin_url' )->alias( function ( $path ) { return "http://example.org/wp-admin/{$path}"; diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php index 72d8636e5a..7a3f10d90d 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -60,6 +60,9 @@ public function testShouldDoExpected( $config, $expected ) { $this->atf_context->shouldReceive( 'is_allowed' ) ->andReturn( $config['atf_context'] ); + $this->lrc_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['lrc_context'] ); + Functions\when( 'wp_nonce_url' )->alias( function ( $url ) { return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php index 9a483c8d33..2f16f1cf2a 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php @@ -42,6 +42,9 @@ public function testShouldDoExpected( $config, $expected ) { $this->atf_context->shouldReceive( 'is_allowed' ) ->andReturn( $config['atf_context'] ); + $this->lrc_context->shouldReceive( 'is_allowed' ) + ->andReturn( $config['lrc_context'] ); + if ( $expected ) { Functions\expect( 'rocket_notice_html' ) ->once(); From ee4c0ec0140ce90cd00b6514bd3266e1d54aef1f Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 11:19:25 +0100 Subject: [PATCH 060/192] remove repetition from common subscriber --- inc/Plugin.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/inc/Plugin.php b/inc/Plugin.php index c88b323be6..5cdfc28b31 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -392,11 +392,6 @@ private function init_common_subscribers() { 'rucss_cron_subscriber', 'saas_admin_subscriber', 'atf_subscriber', - 'performance_hints_ajax_subscriber', - 'performance_hints_frontend_subscriber', - 'performance_hints_cron_subscriber', - 'performance_hints_warmup_subscriber', - 'performance_hints_admin_subscriber', ]; $host_type = HostResolver::get_host_service(); From b2d782010aabc69402f5104c423763785bd51f68 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 11:21:58 +0100 Subject: [PATCH 061/192] fix linter --- inc/Engine/Saas/Admin/Notices.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Saas/Admin/Notices.php b/inc/Engine/Saas/Admin/Notices.php index c7d0e0148b..bb2dd9f925 100644 --- a/inc/Engine/Saas/Admin/Notices.php +++ b/inc/Engine/Saas/Admin/Notices.php @@ -25,12 +25,12 @@ class Notices { /** * Constructor * - * @param Options_Data $options Options_Data instance. - * @param Beacon $beacon Beacon instance. + * @param Options_Data $options Options_Data instance. + * @param Beacon $beacon Beacon instance. */ public function __construct( Options_Data $options, Beacon $beacon ) { - $this->options = $options; - $this->beacon = $beacon; + $this->options = $options; + $this->beacon = $beacon; } /** From 373759efd230c84cd68f97a09afee40bd348b2a5 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 11:52:40 +0100 Subject: [PATCH 062/192] revert changes --- inc/Engine/Common/PerformanceHints/ServiceProvider.php | 2 ++ inc/Plugin.php | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 61fbede7fb..5936c022b1 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -21,6 +21,7 @@ Subscriber as WarmUpSubscriber, Queue }; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context as LRCContext; class ServiceProvider extends AbstractServiceProvider { /** @@ -69,6 +70,7 @@ public function register(): void { $factories = []; $atf_factory = $this->getContainer()->get( 'atf_factory' ); + $this->getContainer()->add( 'lrc_context', LRCContext::class ); if ( $atf_factory->get_context()->is_allowed() ) { $factories[] = $atf_factory; diff --git a/inc/Plugin.php b/inc/Plugin.php index 5cdfc28b31..c88b323be6 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -392,6 +392,11 @@ private function init_common_subscribers() { 'rucss_cron_subscriber', 'saas_admin_subscriber', 'atf_subscriber', + 'performance_hints_ajax_subscriber', + 'performance_hints_frontend_subscriber', + 'performance_hints_cron_subscriber', + 'performance_hints_warmup_subscriber', + 'performance_hints_admin_subscriber', ]; $host_type = HostResolver::get_host_service(); From d8807557acdb98a8950ee32952680d353afca400 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:19:51 +0100 Subject: [PATCH 063/192] Closes #6860: 3.17 - LRC Concrete Factory Creation (#6870) --- .../LazyRenderContent/Factory.php | 104 ++++++++++++++++++ .../LazyRenderContent/ServiceProvider.php | 50 +++++++++ inc/Plugin.php | 2 + 3 files changed, 156 insertions(+) create mode 100644 inc/Engine/Optimization/LazyRenderContent/Factory.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php diff --git a/inc/Engine/Optimization/LazyRenderContent/Factory.php b/inc/Engine/Optimization/LazyRenderContent/Factory.php new file mode 100644 index 0000000000..6bdd58a2a5 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Factory.php @@ -0,0 +1,104 @@ +context = $context; + } + + /** + * Provides an Ajax controller object. + * + * @return AjaxControllerInterface + */ + public function get_ajax_controller(): AjaxControllerInterface { + return $this->ajax_controller; + } + + /** + * Provides a Frontend object. + * + * @return FrontendControllerInterface + */ + public function get_frontend_controller(): FrontendControllerInterface { + return $this->frontend_controller; + } + + /** + * Provides a Table object. + * + * @return TableInterface + */ + public function table(): TableInterface { + return $this->table; + } + + /** + * Provides a Queries object. + * + * @return QueriesInterface + */ + public function queries(): QueriesInterface { + return $this->queries; + } + + /** + * Provides a Context object. + * + * @return ContextInterface + */ + public function get_context(): ContextInterface { + return $this->context; + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php new file mode 100644 index 0000000000..d2fdc8bda5 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php @@ -0,0 +1,50 @@ +provides, true ); + } + + /** + * Registers the classes in the container + * + * @return void + */ + public function register(): void { + $this->getContainer()->add( 'lrc_context', Context::class ); + + $this->getContainer()->addShared( 'lrc_factory', Factory::class ) + ->addArguments( + [ + $this->getContainer()->get( 'lrc_context' ), + ] + ); + } +} diff --git a/inc/Plugin.php b/inc/Plugin.php index c88b323be6..dd5895d647 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -52,6 +52,7 @@ use WP_Rocket\Engine\Debug\Resolver as DebugResolver; use WP_Rocket\Engine\Debug\ServiceProvider as DebugServiceProvider; use WP_Rocket\Engine\Common\PerformanceHints\ServiceProvider as PerformanceHintsServiceProvider; +use WP_Rocket\Engine\Optimization\LazyRenderContent\ServiceProvider as LRCServiceProvider; /** * Plugin Manager. @@ -306,6 +307,7 @@ private function init_common_subscribers() { $this->container->addServiceProvider( new JobManagerServiceProvider() ); $this->container->addServiceProvider( new SaasAdminServiceProvider() ); $this->container->addServiceProvider( new PerformanceHintsServiceProvider() ); + $this->container->addServiceProvider( new LRCServiceProvider() ); $common_subscribers = [ 'license_subscriber', From 8c7d87c6cb6b7500b7f05a42b3e18c06e7239ffb Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 15:53:52 +0100 Subject: [PATCH 064/192] Add unit test for trait method --- .../Settings/Settings/addMenuToAdminBar.php | 40 +++++++++++ .../Settings/Settings/addMenuToAdminBar.php | 69 +++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 tests/Fixtures/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php create mode 100644 tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php diff --git a/tests/Fixtures/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php new file mode 100644 index 0000000000..16324869f5 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php @@ -0,0 +1,40 @@ + [ + 'config' => [ + 'rocket_valid_key' => true, + 'environment' => 'production', + 'admin' => true, + 'menu_id' => 'random-menu-id', + 'action' => 'menu-action', + 'title' => 'Menu title' + ], + 'expected' => [ + 'id' => 'random-menu-id', + 'title' => 'Menu title', + ], + ], + 'testShouldReturnNullWhenAdminIsFalse' => [ + 'config' => [ + 'rocket_valid_key' => true, + 'environment' => 'production', + 'admin' => false, + 'menu_id' => 'random-menu-id', + 'action' => 'menu-action', + 'title' => 'Menu title' + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenInvalidKey' => [ + 'config' => [ + 'rocket_valid_key' => false, + 'environment' => 'production', + 'admin' => true, + 'menu_id' => 'random-menu-id', + 'action' => 'menu-action', + 'title' => 'Menu title' + ], + 'expected' => null, + ], +]; diff --git a/tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php b/tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php new file mode 100644 index 0000000000..f44f6b5533 --- /dev/null +++ b/tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php @@ -0,0 +1,69 @@ +admin_bar = $this->getObjectForTrait(AdminBarMenuTrait::class); + $this->wp_admin_bar = new WP_Admin_Bar(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnAsExpected($config, $expected) { + Functions\expect('rocket_valid_key')->with()->andReturn($config['rocket_valid_key']); + Functions\expect('is_admin')->with()->andReturn($config['admin']); + Functions\when( 'wp_get_environment_type' ) + ->justReturn( $config['environment'] ); + + Functions\when( 'admin_url' )->alias( + function ( $path ) { + return "http://example.org/wp-admin/{$path}"; + } + ); + + Functions\when( 'wp_nonce_url' )->alias( + function ( $url ) { + return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); + } + ); + + $method = self::get_reflective_method( 'add_menu_to_admin_bar', get_class( $this->admin_bar ) ); + $method->invoke( $this->admin_bar, $this->wp_admin_bar, $config['menu_id'], $config['title'], $config['action'] ); + + $node = $this->wp_admin_bar->get_node( $config['menu_id'] ); + + if ( null === $expected ) { + $this->assertNull( $node ); + return; + } + + $this->assertSame( + $expected['id'], + $node->id + ); + + $this->assertSame( + $expected['title'], + $node->title + ); + } +} From 1a547033f29f9f137d8bd606ec29142b9c82063d Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 16:26:01 +0100 Subject: [PATCH 065/192] Change filter to type filter --- .../Admin/Settings/AdminBarMenuTrait.php | 2 +- .../PerformanceHints/Admin/AdminBar.php | 26 +------------------ .../Common/PerformanceHints/Admin/Clean.php | 2 +- 3 files changed, 3 insertions(+), 27 deletions(-) diff --git a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php index 38215a40ab..38454038d3 100644 --- a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php @@ -97,7 +97,7 @@ protected function add_url_menu_item_to_admin_bar( * * @param string $uri Current uri. */ - $referer = (string) apply_filters( 'rocket_admin_bar_referer', esc_url( $referer_url ) ); + $referer = wpm_apply_filters_typed( 'string', 'rocket_admin_bar_referer', esc_url( $referer_url ) ); $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer ) ); } diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index a1baf04945..ad7d9b0bec 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -77,30 +77,6 @@ public function add_clear_performance_menu_item( WP_Admin_Bar $wp_admin_bar ): v public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admin_bar ) { global $post; - if ( - 'local' === wp_get_environment_type() - && - ( $this->atf_context->is_allowed() || $this->lrc_context->is_allowed() ) - ) { - return; - } - - if ( is_admin() ) { - return; - } - - if ( - $post - && - ! rocket_can_display_options() - ) { - return; - } - - if ( ! $this->atf_context->is_allowed() && ! $this->lrc_context->is_allowed() ) { - return; - } - /** * Filters the rocket `clear performance hints data of this url` option on admin bar menu. * @@ -109,7 +85,7 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi * @param bool $should_skip Should skip adding `clear performance hints of this url` option in admin bar. * @param type $post Post object. */ - if ( apply_filters( 'rocket_skip_admin_bar_clean_performance_hints_option', false, $post ) ) { + if ( wpm_apply_filters_typed( 'boolean', 'rocket_skip_admin_bar_clean_performance_hints_option', true, $post ) ) { return; } diff --git a/inc/Engine/Common/PerformanceHints/Admin/Clean.php b/inc/Engine/Common/PerformanceHints/Admin/Clean.php index 30fc6d85c5..20c1139325 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Clean.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Clean.php @@ -25,7 +25,7 @@ public function clean_performance_hints(): void { * * @param array $clean An array containing the status and message. */ - $clean = apply_filters( 'rocket_performance_hints_clean_all', [] ); + $clean = wpm_apply_filters_typed( 'array', 'rocket_performance_hints_clean_all', [] ); $this->clean_data( $clean, 'rocket_performance_hints_clear_message' ); } From c7a9f7b9f205e1b797d12d931f1c8229f02c18ba Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 16:34:56 +0100 Subject: [PATCH 066/192] Changed filter value --- inc/Engine/Common/PerformanceHints/Admin/AdminBar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index ad7d9b0bec..72c946187f 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -85,7 +85,7 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi * @param bool $should_skip Should skip adding `clear performance hints of this url` option in admin bar. * @param type $post Post object. */ - if ( wpm_apply_filters_typed( 'boolean', 'rocket_skip_admin_bar_clean_performance_hints_option', true, $post ) ) { + if ( wpm_apply_filters_typed( 'boolean', 'rocket_skip_admin_bar_clean_performance_hints_option', false, $post ) ) { return; } From b11c01b06201faba282b0d468a50c3dce34ca6a8 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 17:27:13 +0100 Subject: [PATCH 067/192] Refactor sass menu, add unit test for trait method --- inc/Engine/Saas/Admin/AdminBar.php | 51 ++----------- .../Settings/addURLMenuItemToAdminBar.php | 55 ++++++++++++++ .../Settings/addURLMenuItemToAdminBar.php | 76 +++++++++++++++++++ 3 files changed, 138 insertions(+), 44 deletions(-) create mode 100644 tests/Fixtures/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php create mode 100644 tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index fa983c3e4e..f7f635fe92 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -81,30 +81,6 @@ public function add_clean_saas_menu_item( $wp_admin_bar ) { public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { global $post; - if ( - 'local' === wp_get_environment_type() - && - $this->rucss_url_context->is_allowed() - ) { - return; - } - - if ( is_admin() ) { - return; - } - - if ( - $post - && - ! rocket_can_display_options() - ) { - return; - } - - if ( ! $this->rucss_url_context->is_allowed() ) { - return; - } - /** * Filters the rocket `clear used css of this url` option on admin bar menu. * @@ -113,34 +89,21 @@ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { * @param bool $should_skip Should skip adding `clear used css of this url` option in admin bar. * @param type $post Post object. */ - if ( apply_filters( 'rocket_skip_admin_bar_clear_used_css_option', false, $post ) ) { + if ( wpm_apply_filters_typed( 'boolean', 'rocket_skip_admin_bar_clear_used_css_option', false, $post ) ) { return; } - $referer = ''; $action = 'rocket_clean_saas_url'; - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { - $referer_url = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_URL ); - - /** - * Filters to act on the referer url for the admin bar. - * - * @param string $uri Current uri. - */ - $referer = (string) apply_filters( 'rocket_admin_bar_referer', esc_url( $referer_url ) ); - $referer = '&_wp_http_referer=' . rawurlencode( remove_query_arg( 'fl_builder', $referer ) ); - } $title = __( 'Clear RUCSS optimizations of this URL', 'rocket' ); - $wp_admin_bar->add_menu( - [ - 'parent' => 'wp-rocket', - 'id' => 'clear-saas-url', - 'title' => $title, - 'href' => wp_nonce_url( admin_url( 'admin-post.php?action=' . $action . $referer ), $action ), - ] + $this->add_url_menu_item_to_admin_bar( + $wp_admin_bar, + 'clear-saas-url', + $title, + $action, + $this->rucss_url_context->is_allowed() ); } diff --git a/tests/Fixtures/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php new file mode 100644 index 0000000000..326df629c9 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php @@ -0,0 +1,55 @@ + [ + 'config' => [ + 'display_option' => true, + 'environment' => 'production', + 'admin' => false, + 'menu_id' => 'random-menu-id', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => true, + ], + 'expected' => [ + 'id' => 'random-menu-id', + 'title' => 'Menu title', + ], + ], + 'testShouldReturnNullWhenAdminIsTrue' => [ + 'config' => [ + 'display_option' => true, + 'environment' => 'production', + 'admin' => true, + 'menu_id' => 'random-menu-id', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenDisplayIsFalse' => [ + 'config' => [ + 'display_option' => false, + 'environment' => 'production', + 'admin' => true, + 'menu_id' => 'random-menu-id', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => true, + ], + 'expected' => null, + ], + 'testShouldReturnNullWhenContextIsFalse' => [ + 'config' => [ + 'display_option' => true, + 'environment' => 'production', + 'admin' => true, + 'menu_id' => 'random-menu-id', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => false, + ], + 'expected' => null, + ], +]; diff --git a/tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php b/tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php new file mode 100644 index 0000000000..47ff3ff1f2 --- /dev/null +++ b/tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php @@ -0,0 +1,76 @@ +admin_bar = $this->getObjectForTrait(AdminBarMenuTrait::class); + $this->wp_admin_bar = new WP_Admin_Bar(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnAsExpected($config, $expected) { + Functions\expect('rocket_can_display_options')->with()->andReturn($config['display_option']); + Functions\expect('is_admin')->with()->andReturn($config['admin']); + Functions\when( 'wp_get_environment_type' ) + ->justReturn( $config['environment'] ); + + Functions\when( 'admin_url' )->alias( + function ( $path ) { + return "http://example.org/wp-admin/{$path}"; + } + ); + + Functions\when( 'wp_nonce_url' )->alias( + function ( $url ) { + return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); + } + ); + + $method = self::get_reflective_method( 'add_url_menu_item_to_admin_bar', get_class( $this->admin_bar ) ); + $method->invoke( + $this->admin_bar, + $this->wp_admin_bar, + $config['menu_id'], + $config['title'], + $config['action'], + $config['context'] + ); + + $node = $this->wp_admin_bar->get_node( $config['menu_id'] ); + + if ( null === $expected ) { + $this->assertNull( $node ); + return; + } + + $this->assertSame( + $expected['id'], + $node->id + ); + + $this->assertSame( + $expected['title'], + $node->title + ); + } +} From 46a4f8f91b1929c94312927597809ad42ccc4166 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 14 Aug 2024 17:39:31 +0100 Subject: [PATCH 068/192] :feat: fix linter --- inc/Engine/Saas/Admin/AdminBar.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index f7f635fe92..b078bb684f 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -93,8 +93,7 @@ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { return; } - $action = 'rocket_clean_saas_url'; - + $action = 'rocket_clean_saas_url'; $title = __( 'Clear RUCSS optimizations of this URL', 'rocket' ); From 60028ea9e14185a5383c83b8577a6dbebe4a81ec Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 15 Aug 2024 02:33:16 +0100 Subject: [PATCH 069/192] Improve codacy test coverage --- .../Settings/displayDashboardButton.php | 58 +++++++++++++++ .../Settings/displayDashboardButton.php | 73 +++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php create mode 100644 tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php diff --git a/tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php new file mode 100644 index 0000000000..20f487b44b --- /dev/null +++ b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php @@ -0,0 +1,58 @@ + [ + 'config' => [ + 'title_attr_text' => 'Title text', + 'environment' => 'production', + 'label' => 'Button label', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => true, + ], + 'expected' => << +

Button label

+ Menu title + +HTML + ], + 'shouldOutputEmptyWhenContextIsFalse' => [ + 'config' => [ + 'title_attr_text' => 'Title text', + 'environment' => 'production', + 'label' => 'Button label', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => false, + ], + 'expected' => null + ], + 'shouldOutputEmptyWhenEnvironmentIsLocal' => [ + 'config' => [ + 'title_attr_text' => 'Title text', + 'environment' => 'local', + 'label' => 'Button label', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => false, + ], + 'expected' => null + ], + 'shouldOutputLinkButtonWithoutLinkTitleAttribute' => [ + 'config' => [ + 'title_attr_text' => '', + 'environment' => 'production', + 'label' => 'label', + 'action' => 'menu-action', + 'title' => 'Title', + 'context' => true, + ], + 'expected' => << +

label

+ Title + +HTML + ], +]; diff --git a/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php b/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php new file mode 100644 index 0000000000..be0c6a5cdf --- /dev/null +++ b/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php @@ -0,0 +1,73 @@ +mocked_class = $this->getMockForTrait( + AdminBarMenuTrait::class, + [], + '', + true, + true, + true, + ['generate'] + ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnAsExpected($config, $expected) { + Functions\when( 'wp_get_environment_type' ) + ->justReturn( $config['environment'] ); + + $data = [ + 'title' => $config['title'], + 'action' => $config['action'], + 'label' => $config['label'], + 'hover_text' => $config['title_attr_text'] + ]; + + if ( null !== $expected ) { + $this->mocked_class->expects($this->once()) + ->method('generate') + ->with('sections/clean-section', $data) + ->willReturn($expected); + } + + ob_start(); + $this->mocked_class->dashboard_button( + $config['context'], + $config['title'], + $config['label'], + $config['action'], + $config['title_attr_text'] + ); + $output = ob_get_clean(); + + if ( null === $expected ) { + $this->assertEmpty( $output ); + return; + } + $title_output = '

'. $config['label'] . '

'; + $this->assertStringContainsString($title_output, $output); + } +} From e88d8df136d023a94b05ad22e352b85c0a6572df Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 15 Aug 2024 02:44:32 +0100 Subject: [PATCH 070/192] :broom: Cleanup --- .../Admin/Settings/Settings/addMenuToAdminBar.php | 5 +++++ .../Settings/Settings/addURLMenuItemToAdminBar.php | 5 +++++ .../Admin/Settings/Settings/displayDashboardButton.php | 10 ++++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php b/tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php index f44f6b5533..172942ca89 100644 --- a/tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php +++ b/tests/Unit/inc/Engine/Admin/Settings/Settings/addMenuToAdminBar.php @@ -7,6 +7,11 @@ use WP_Rocket\Tests\Unit\TestCase; use Brain\Monkey\Functions; +/** + * Test class covering \WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait::add_menu_to_admin_bar + * @group Admin + * @group Settings + */ class Test_AddMenuToAdminBar extends TestCase { protected $admin_bar; diff --git a/tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php b/tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php index 47ff3ff1f2..b3aa260700 100644 --- a/tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php +++ b/tests/Unit/inc/Engine/Admin/Settings/Settings/addURLMenuItemToAdminBar.php @@ -7,6 +7,11 @@ use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait; +/** + * Test class covering \WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait::add_url_menu_item_to_admin_bar + * @group Admin + * @group Settings + */ class Test_AddURLMenuItemToAdminBar extends TestCase { protected $admin_bar; diff --git a/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php b/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php index be0c6a5cdf..160a7dcb4e 100644 --- a/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php +++ b/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php @@ -2,16 +2,18 @@ namespace WP_Rocket\tests\Unit\inc\Engine\Admin\Settings\Settings; -use WP_Admin_Bar; use Brain\Monkey\Functions; -use WP_Rocket\Abstract_Render; use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait; +/** + * Test class covering \WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait::dashboard_button + * @group Admin + * @group Settings + */ class Test_DisplayDashboardButton extends TestCase { - private $admin_bar; - private $wp_admin_bar; + private $mocked_class; public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); From 9f06e64c762a56b90f6f0c84828b178440c8a69f Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 16 Aug 2024 12:06:32 +0100 Subject: [PATCH 071/192] PR modifications --- .../PerformanceHints/Admin/AdminBar.php | 35 ++++++------------- .../PerformanceHints/Admin/Controller.php | 2 +- .../Common/PerformanceHints/Admin/Notices.php | 23 ++++-------- .../PerformanceHints/ServiceProvider.php | 14 +++++--- inc/Engine/Saas/Admin/Clean.php | 2 +- .../addPerformanceHintsClearUrlMenuItem.php | 17 ++++----- ...splayCleanPerformanceHintsResultNotice.php | 24 +++---------- .../AdminBar/addCleanPerformanceHintsItem.php | 20 ++++++----- .../addPerformanceHintsClearUrlMenuItem.php | 28 +++++++-------- ...splayCleanPerformanceHintsResultNotice.php | 25 +++++++------ 10 files changed, 77 insertions(+), 113 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index 72c946187f..a6f6d6efcf 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -5,40 +5,28 @@ use WP_Admin_Bar; use WP_Rocket\Abstract_Render; -use WP_Rocket\Admin\Options_Data; use WP_Rocket\Engine\Admin\Settings\AdminBarMenuTrait; -use WP_Rocket\Engine\Common\Context\ContextInterface; class AdminBar extends Abstract_Render { use AdminBarMenuTrait; /** - * ATF context. + * Array of factories * - * @var ContextInterface + * @var array */ - private $atf_context; - - /** - * LRC context. - * - * @var ContextInterface - */ - private $lrc_context; - + private $factories; /** * Constructor * - * @param ContextInterface $atf_context ATF context. - * @param ContextInterface $lrc_context LRC context. - * @param string $template_path Template path. + * @param array $factories Array of factories. + * @param string $template_path Template path. */ - public function __construct( ContextInterface $atf_context, ContextInterface $lrc_context, $template_path ) { + public function __construct( array $factories, $template_path ) { parent::__construct( $template_path ); - $this->atf_context = $atf_context; - $this->lrc_context = $lrc_context; + $this->factories = $factories; } /** @@ -49,10 +37,7 @@ public function __construct( ContextInterface $atf_context, ContextInterface $lr * @return void */ public function add_clear_performance_menu_item( WP_Admin_Bar $wp_admin_bar ): void { - if ( - ! $this->atf_context->is_allowed() - && ! $this->lrc_context->is_allowed() - ) { + if ( empty( $this->factories ) ) { return; } @@ -98,7 +83,7 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi 'clear-performance-hints-data-url', $title, $action, - $this->atf_context->is_allowed() || $this->lrc_context->is_allowed() + ! empty( $this->factories ) ); } @@ -108,7 +93,7 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi * @return void */ public function display_dashboard_button() { - $context = $this->lrc_context->is_allowed() || $this->atf_context->is_allowed(); + $context = ! empty( $this->factories ); $this->dashboard_button( $context, diff --git a/inc/Engine/Common/PerformanceHints/Admin/Controller.php b/inc/Engine/Common/PerformanceHints/Admin/Controller.php index 8389efd965..2e76308cde 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Controller.php @@ -126,7 +126,7 @@ public function truncate_from_admin( $clean ) { 'status' => 'success', 'message' => sprintf( // translators: %1$s = plugin name. - __( '%1$s: WP Rocket: Critical images and Lazy Render data was cleared!', 'rocket' ), + __( '%1$s: Critical images and Lazy Render data was cleared!', 'rocket' ), 'WP Rocket' ), ]; diff --git a/inc/Engine/Common/PerformanceHints/Admin/Notices.php b/inc/Engine/Common/PerformanceHints/Admin/Notices.php index 184e6d7d9b..260423d81c 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Notices.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Notices.php @@ -9,28 +9,19 @@ class Notices { /** - * Context instance + * Array of factories * - * @var ContextInterface + * @var array */ - private $atf_context; - - /** - * Context instance - * - * @var ContextInterface - */ - private $lrc_context; + private $factories; /** * Constructor * - * @param ContextInterface $atf_context ATF context instance. - * @param ContextInterface $lrc_context LRC context instance. + * @param array $factories Array of factories. */ - public function __construct( ContextInterface $atf_context, ContextInterface $lrc_context ) { - $this->atf_context = $atf_context; - $this->lrc_context = $lrc_context; + public function __construct( array $factories ) { + $this->factories = $factories; } /** @@ -43,7 +34,7 @@ public function clean_performance_hint_result() { return; } - if ( ! $this->atf_context->is_allowed() && ! $this->lrc_context->is_allowed() ) { + if ( empty( $this->factories ) ) { return; } diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 5936c022b1..2d2e0792ac 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -106,12 +106,18 @@ public function register(): void { ); $this->getContainer()->add( 'performance_hints_notices', Notices::class ) - ->addArgument( $this->getContainer()->get( 'atf_context' ) ) - ->addArgument( $this->getContainer()->get( 'lrc_context' ) ); + ->addArgument( + [ + $factories, + ] + ); $this->getContainer()->add( 'performance_hints_admin_bar', Adminbar::class ) - ->addArgument( $this->getContainer()->get( 'atf_context' ) ) - ->addArgument( $this->getContainer()->get( 'lrc_context' ) ) + ->addArgument( + [ + $factories, + ] + ) ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); $this->getContainer()->add( 'performance_hints_clean', Clean::class ); diff --git a/inc/Engine/Saas/Admin/Clean.php b/inc/Engine/Saas/Admin/Clean.php index 03bdacfdec..25dbf42f5e 100644 --- a/inc/Engine/Saas/Admin/Clean.php +++ b/inc/Engine/Saas/Admin/Clean.php @@ -26,7 +26,7 @@ public function clean_saas() { * * @param array $clean An array containing the status and message. */ - $clean = apply_filters( 'rocket_saas_clean_all', [] ); + $clean = wpm_apply_filters_typed( 'array', 'rocket_saas_clean_all', [] ); $this->clean_data( $clean, 'rocket_saas_clean_message' ); } diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php index ebda876e66..3118b1d828 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -10,8 +10,7 @@ 'post_status' => 'publish', ], 'can_display_options' => true, - 'atf_context' => true, - 'lrc_context' => true, + 'factories' => true, ], 'expected' => null, ], @@ -24,8 +23,7 @@ 'post_status' => 'publish', ], 'can_display_options' => true, - 'atf_context' => true, - 'lrc_context' => true, + 'factories' => true, ], 'expected' => null, ], @@ -38,12 +36,11 @@ 'post_status' => 'draft', ], 'can_display_options' => false, - 'atf_context' => true, - 'lrc_context' => true, + 'factories' => true, ], 'expected' => null, ], - 'testShouldReturnNullWhenNotAllowed' => [ + 'testShouldReturnNullWhenFactoriesIsEmpty' => [ 'config' => [ 'environment' => 'production', 'is_admin' => false, @@ -52,8 +49,7 @@ 'post_status' => 'publish', ], 'can_display_options' => true, - 'atf_context' => false, - 'lrc_context' => false, + 'factories' => false, ], 'expected' => null, ], @@ -66,8 +62,7 @@ 'post_status' => 'publish', ], 'can_display_options' => true, - 'atf_context' => true, - 'lrc_context' => true, + 'factories' => true, ], 'expected' => [ 'id' => 'clear-performance-hints-data-url', diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php index 9c0d8debbb..8ea38648e2 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php @@ -5,38 +5,25 @@ 'shouldDoNothingWhenNoCapability' => [ 'config' => [ 'capability' => false, - 'atf_context' => 1, - 'lrc_context' => 1, + 'factories' => true, 'transient' => false, 'performance_hints_transient' => false, ], 'expected' => false, ], - 'shouldDoNothingWhenATFDisabled' => [ + 'shouldDoNothingWhenFactoriesIsEmpty' => [ 'config' => [ 'capability' => true, - 'atf_context' => false, - 'lrc_context' => false, + 'factories' => false, 'transient' => false, 'performance_hints_transient' => false, ], 'expected' => false, ], - 'shouldDoNothingWhenTransientTimeLessThanCurrentTime' => [ - 'config' => [ - 'capability' => true, - 'atf_context' => false, - 'lrc_context' => false, - 'transient' => time() - 30, - 'performance_hints_transient' => false, - ], - 'expected' => false, - ], 'shouldDoNothingWhenNoTransient' => [ 'config' => [ 'capability' => true, - 'atf_context' => true, - 'lrc_context' => true, + 'factories' => true, 'transient' => false, 'performance_hints_transient' => false, ], @@ -45,8 +32,7 @@ 'shouldShowNoticeWhenTransient' => [ 'config' => [ 'capability' => true, - 'atf_context' => true, - 'lrc_context' => true, + 'factories' => true, 'transient' => time() + 3600, 'performance_hints_transient' => false, ], diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php index 4869c70290..7e0eeccb54 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -5,6 +5,8 @@ use Mockery; use WP_Admin_Bar; use Brain\Monkey\Functions; +use WP_Rocket\Engine\Media\AboveTheFold\Factory as ATFFactory; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Factory; use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Common\Context\ContextInterface; use WP_Rocket\Engine\Common\PerformanceHints\Admin\AdminBar; @@ -19,6 +21,7 @@ class Test_AddCleanPerformanceHintsItem extends TestCase { private $lrc_context; private $wp_admin_bar; + private $factories; public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); @@ -29,11 +32,16 @@ public static function setUpBeforeClass(): void { protected function setUp(): void { parent::setUp(); - $this->atf_context = Mockery::mock( ContextInterface::class ); - $this->lrc_context = Mockery::mock( ContextInterface::class ); - $this->admin_bar = new AdminBar( $this->atf_context, $this->lrc_context,'' ); + $atf_factory = $this->createMock(ATFFactory::class); + $lrc_factory = $this->createMock(Factory::class); $this->wp_admin_bar = new WP_Admin_Bar(); + $this->factories = [ + $atf_factory, + $lrc_factory + ]; + $this->admin_bar = new AdminBar( $this->factories,'' ); + $this->stubTranslationFunctions(); } @@ -57,12 +65,6 @@ function ( $url ) { } ); - $this->atf_context->shouldReceive( 'is_allowed' ) - ->andReturn( $config['atf_context'] ); - - $this->lrc_context->shouldReceive( 'is_allowed' ) - ->andReturn( $config['lrc_context'] ); - Functions\when( 'admin_url' )->alias( function ( $path ) { return "http://example.org/wp-admin/{$path}"; diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php index 7a3f10d90d..df9912a579 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -7,6 +7,8 @@ use Brain\Monkey\Functions; use WP_Rocket\Admin\Options_Data; use WP_Rocket\Engine\Common\PerformanceHints\Admin\AdminBar; +use WP_Rocket\Engine\Media\AboveTheFold\Factory as ATFFactory; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Factory; use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Common\Context\ContextInterface; @@ -15,9 +17,7 @@ * @group PerformanceHints */ class Test_AddPerformanceHintsClearUrlMenuItem extends TestCase { - private $admin_bar; - private $atf_context; - private $lrc_context; + private $factories; private $wp_admin_bar; public static function setUpBeforeClass(): void { @@ -29,10 +29,14 @@ public static function setUpBeforeClass(): void { protected function setUp(): void { parent::setUp(); - $this->atf_context = Mockery::mock( ContextInterface::class ); - $this->lrc_context = Mockery::mock( ContextInterface::class ); - $this->admin_bar = new AdminBar( $this->atf_context, $this->lrc_context, '' ); - $this->wp_admin_bar = new WP_Admin_Bar(); + $atf_factory = $this->createMock(ATFFactory::class); + $lrc_factory = $this->createMock(Factory::class); + $this->wp_admin_bar = new WP_Admin_Bar(); + + $this->factories = [ + $atf_factory, + $lrc_factory + ]; $this->stubTranslationFunctions(); } @@ -47,6 +51,8 @@ protected function tearDown(): void { * @dataProvider configTestData */ public function testShouldDoExpected( $config, $expected ) { + $admin_bar = new AdminBar( $config['factories'] ? $this->factories : [], '' ); + Functions\when( 'wp_get_environment_type' ) ->justReturn( $config['environment'] ); Functions\when( 'is_admin' ) @@ -57,12 +63,6 @@ public function testShouldDoExpected( $config, $expected ) { Functions\when( 'rocket_can_display_options' ) ->justReturn( $config['can_display_options'] ); - $this->atf_context->shouldReceive( 'is_allowed' ) - ->andReturn( $config['atf_context'] ); - - $this->lrc_context->shouldReceive( 'is_allowed' ) - ->andReturn( $config['lrc_context'] ); - Functions\when( 'wp_nonce_url' )->alias( function ( $url ) { return str_replace( '&', '&', "{$url}&_wpnonce=123456" ); @@ -75,7 +75,7 @@ function ( $path ) { } ); - $this->admin_bar->add_clear_url_performance_hints_menu_item( $this->wp_admin_bar ); + $admin_bar->add_clear_url_performance_hints_menu_item( $this->wp_admin_bar ); $node = $this->wp_admin_bar->get_node( 'clear-performance-hints-data-url' ); diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php index 2f16f1cf2a..c1f6dc53b6 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Notices/displayCleanPerformanceHintsResultNotice.php @@ -4,6 +4,8 @@ use Mockery; use Brain\Monkey\Functions; +use WP_Rocket\Engine\Media\AboveTheFold\Factory as ATFFactory; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Factory; use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Common\Context\ContextInterface; use WP_Rocket\Engine\Common\PerformanceHints\Admin\Notices; @@ -12,16 +14,17 @@ * Test class covering \WP_Rocket\Engine\Common\PerformanceHints\Admin\Notices::clean_performance_hint_result */ class Test_DisplayCleanPerformanceHintsResultNotice extends TestCase { - protected $atf_context; - protected $lrc_context; - private $notices; + private $factories; public function setUp(): void { parent::setUp(); - $this->atf_context = Mockery::mock( ContextInterface::class ); - $this->lrc_context = Mockery::mock( ContextInterface::class ); - $this->notices = new Notices( $this->atf_context, $this->lrc_context ); + $atf_factory = $this->createMock(ATFFactory::class); + $lrc_factory = $this->createMock(Factory::class); + $this->factories = [ + $atf_factory, + $lrc_factory + ]; $this->stubTranslationFunctions(); } @@ -30,6 +33,8 @@ public function setUp(): void { * @dataProvider configTestData */ public function testShouldDoExpected( $config, $expected ) { + $notices = new Notices( $config['factories'] ? $this->factories : [] ); + Functions\expect( 'current_user_can' ) ->once() ->with( 'rocket_manage_options' ) @@ -39,12 +44,6 @@ public function testShouldDoExpected( $config, $expected ) { return $config['transient']; }); - $this->atf_context->shouldReceive( 'is_allowed' ) - ->andReturn( $config['atf_context'] ); - - $this->lrc_context->shouldReceive( 'is_allowed' ) - ->andReturn( $config['lrc_context'] ); - if ( $expected ) { Functions\expect( 'rocket_notice_html' ) ->once(); @@ -53,6 +52,6 @@ public function testShouldDoExpected( $config, $expected ) { Functions\expect( 'rocket_notice_html' )->never(); } - $this->notices->clean_performance_hint_result(); + $notices->clean_performance_hint_result(); } } From 1f82fa0db92a7166e4a4cb8be7326f65e530606c Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Mon, 19 Aug 2024 13:09:59 +0100 Subject: [PATCH 072/192] Modify dashboard button, change text title case --- assets/css/wpr-admin.css | 5 ++++- inc/Engine/Common/PerformanceHints/Admin/AdminBar.php | 2 +- .../Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php | 2 +- views/settings/sections/clean-section.php | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/assets/css/wpr-admin.css b/assets/css/wpr-admin.css index b0f9dd0be6..fc089bcebc 100755 --- a/assets/css/wpr-admin.css +++ b/assets/css/wpr-admin.css @@ -1630,6 +1630,9 @@ div.wpr-upgrade-websites { padding-right: 40px; text-align: left; } +.wpr-button--no-min-width{ + min-width: auto; +} .wpr-button--icon:before { position: absolute; right: 8px; @@ -3099,4 +3102,4 @@ div.wpr-tutorial-item { .wpr-field--categorizedmultiselect { padding-right: 80px; } -} \ No newline at end of file +} diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index a6f6d6efcf..a4955dce84 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -76,7 +76,7 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi $action = 'rocket_clean_performance_hints_url'; - $title = __( 'Clear performance hints data of this URL', 'rocket' ); + $title = __( 'Clear Performance Hints data of this URL', 'rocket' ); $this->add_url_menu_item_to_admin_bar( $wp_admin_bar, diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php index 3118b1d828..360be8484d 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -66,7 +66,7 @@ ], 'expected' => [ 'id' => 'clear-performance-hints-data-url', - 'title' => 'Clear performance hints data of this URL', + 'title' => 'Clear Performance Hints data of this URL', ], ], ]; diff --git a/views/settings/sections/clean-section.php b/views/settings/sections/clean-section.php index db71e96ddb..cea30efdd4 100644 --- a/views/settings/sections/clean-section.php +++ b/views/settings/sections/clean-section.php @@ -22,7 +22,7 @@ [ 'label' => $data['label'], 'attributes' => [ - 'class' => 'wpr-button wpr-button--icon wpr-button--small wpr-icon-trash', + 'class' => 'wpr-button wpr-button--icon wpr-button--no-min-width wpr-button--small wpr-icon-trash', 'title' => $data['hover_text'], ], ] From f13e2ae581d9d721792e05a6254d4d475983d773 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Mon, 19 Aug 2024 16:49:05 +0100 Subject: [PATCH 073/192] Fixed filter bug --- inc/Engine/Common/PerformanceHints/ServiceProvider.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 2d2e0792ac..79288839f3 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -106,19 +106,19 @@ public function register(): void { ); $this->getContainer()->add( 'performance_hints_notices', Notices::class ) - ->addArgument( + ->addArguments( [ $factories, ] ); $this->getContainer()->add( 'performance_hints_admin_bar', Adminbar::class ) - ->addArgument( + ->addArguments( [ $factories, + $this->getContainer()->get( 'template_path' ) . '/settings' ] - ) - ->addArgument( $this->getContainer()->get( 'template_path' ) . '/settings' ); + ); $this->getContainer()->add( 'performance_hints_clean', Clean::class ); From 814e576218706b8ff609b51ae66288f9a4c0fb70 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Mon, 19 Aug 2024 17:09:35 +0100 Subject: [PATCH 074/192] lint fix --- inc/Engine/Common/PerformanceHints/ServiceProvider.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 79288839f3..471ba55612 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -70,6 +70,7 @@ public function register(): void { $factories = []; $atf_factory = $this->getContainer()->get( 'atf_factory' ); + $this->getContainer()->add( 'lrc_context', LRCContext::class ); if ( $atf_factory->get_context()->is_allowed() ) { @@ -116,7 +117,7 @@ public function register(): void { ->addArguments( [ $factories, - $this->getContainer()->get( 'template_path' ) . '/settings' + $this->getContainer()->get( 'template_path' ) . '/settings', ] ); From 2f976576623a437c48680a108b23919f6a9ec784 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Mon, 19 Aug 2024 19:20:36 +0100 Subject: [PATCH 075/192] Add documentation url --- inc/Engine/Admin/Beacon/Beacon.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Admin/Beacon/Beacon.php b/inc/Engine/Admin/Beacon/Beacon.php index 2bcae53de5..7873a4cfdc 100644 --- a/inc/Engine/Admin/Beacon/Beacon.php +++ b/inc/Engine/Admin/Beacon/Beacon.php @@ -823,12 +823,12 @@ public function get_suggest( $doc_id ) { ], 'lazy_render_content' => [ 'en' => [ - 'id' => '', - 'url' => '', + 'id' => '66b11e26a62a7505fcf339e7', + 'url' => 'https://docs.wp-rocket.me/article/1835-lazy-render-content/?utm_source=wp_plugin&utm_medium=wp_rocket', ], 'fr' => [ - 'id' => '', - 'url' => '', + 'id' => '66ba0e8e082392452a0773ea', + 'url' => 'https://fr.docs.wp-rocket.me/article/1836-rendu-differe-automatique/?utm_source=wp_plugin&utm_medium=wp_rocket', ], ], ]; From 17ad45e57b5fde6b17d25586fb6f0aa2eaa001b1 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Mon, 19 Aug 2024 19:28:55 +0100 Subject: [PATCH 076/192] #6828 Add Database for LRC (#6872) Co-authored-by: Michael Lee --- .../PerformanceHints/ServiceProvider.php | 18 +-- .../Database/Queries/LazyRenderContent.php | 101 ++++++++++++++++ .../Database/Rows/LazyRenderContent.php | 112 ++++++++++++++++++ .../Database/Schema/LazyRenderContent.php | 110 +++++++++++++++++ .../Database/Table/LazyRenderContent.php | 57 +++++++++ .../LazyRenderContent/Factory.php | 6 +- .../LazyRenderContent/ServiceProvider.php | 10 ++ inc/Engine/WPRocketUninstall.php | 22 +++- .../Engine/WPRocketUninstall/uninstall.php | 3 +- uninstall.php | 5 +- 10 files changed, 427 insertions(+), 17 deletions(-) create mode 100644 inc/Engine/Optimization/LazyRenderContent/Database/Queries/LazyRenderContent.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Database/Schema/LazyRenderContent.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Database/Table/LazyRenderContent.php diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index d141da8f82..e68da3ace7 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -60,10 +60,16 @@ public function register(): void { $factories = []; - $atf_factory = $this->getContainer()->get( 'atf_factory' ); + $factory_array = [ + $this->getContainer()->get( 'atf_factory' ), + ]; - if ( $atf_factory->get_context()->is_allowed() ) { - $factories[] = $atf_factory; + foreach ( $factory_array as $factory ) { + if ( ! $factory->get_context()->is_allowed() ) { + continue; + } + + $factories[] = $factory; } $this->getContainer()->addShared( 'performance_hints_ajax_subscriber', AjaxSubscriber::class ) @@ -102,11 +108,7 @@ public function register(): void { ] ); $this->getContainer()->add( 'cron_controller', CronController::class ) - ->addArgument( - [ - $atf_factory, - ] - ); + ->addArgument( $factory_array ); $this->getContainer()->addShared( 'performance_hints_cron_subscriber', CronSubscriber::class ) ->addArgument( $this->getContainer()->get( 'cron_controller' ) ); diff --git a/inc/Engine/Optimization/LazyRenderContent/Database/Queries/LazyRenderContent.php b/inc/Engine/Optimization/LazyRenderContent/Database/Queries/LazyRenderContent.php new file mode 100644 index 0000000000..1f87e413aa --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Database/Queries/LazyRenderContent.php @@ -0,0 +1,101 @@ +get_db(); + + // Bail if no database interface is available. + if ( ! $db ) { + return false; + } + + /** + * Filters the interval (in months) to determine when Below The Fold entry is considered 'old'. + * Old LRC entries are eligible for deletion. By default, LRC entry is considered old if it hasn't been accessed in the last month. + * + * @param int $delete_interval The interval in months after which LRC entry is considered old. Default is 1 month. + */ + $delete_interval = (int) apply_filters( 'rocket_lrc_cleanup_interval', 1 ); + + if ( $delete_interval <= 0 ) { + return false; + } + + $prefixed_table_name = $db->prefix . $this->table_name; + $query = "DELETE FROM `$prefixed_table_name` WHERE status = 'failed' OR `last_accessed` <= date_sub(now(), interval $delete_interval month)"; + + return $db->query( $query ); + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php b/inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php new file mode 100644 index 0000000000..3331179c7d --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php @@ -0,0 +1,112 @@ +id = (int) $this->id; + $this->url = (string) $this->url; + $this->is_mobile = (bool) $this->is_mobile; + $this->below_the_fold = (string) $this->below_the_fold; + $this->error_message = (string) $this->error_message; + $this->status = (string) $this->status; + $this->modified = empty( $this->modified ) ? 0 : strtotime( (string) $this->modified ); + $this->last_accessed = empty( $this->last_accessed ) ? 0 : strtotime( (string) $this->last_accessed ); + $this->created_at = empty( $this->created_at ) ? 0 : strtotime( (string) $this->created_at ); + } + + /** + * Checks if the object has a valid LRC (Lazy Render Content) value. + * + * @return bool Returns true if the object's status is 'completed' and the Below the fold value is not empty or 'not found', false otherwise. + */ + public function has_lrc() { + if ( 'completed' !== $this->status ) { + return false; + } + + if ( empty( $this->below_the_fold ) ) { + return false; + } + + if ( 'not found' === $this->below_the_fold ) { + return false; + } + + return true; + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Database/Schema/LazyRenderContent.php b/inc/Engine/Optimization/LazyRenderContent/Database/Schema/LazyRenderContent.php new file mode 100644 index 0000000000..60d14c861b --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Database/Schema/LazyRenderContent.php @@ -0,0 +1,110 @@ + 'id', + 'type' => 'bigint', + 'length' => '20', + 'unsigned' => true, + 'extra' => 'auto_increment', + 'primary' => true, + 'sortable' => true, + ], + + // URL column. + [ + 'name' => 'url', + 'type' => 'varchar', + 'length' => '2000', + 'default' => '', + 'cache_key' => true, + 'searchable' => true, + 'sortable' => true, + ], + + // Below the fold column. + [ + 'name' => 'below_the_fold', + 'type' => 'longtext', + 'default' => '', + 'cache_key' => false, + 'searchable' => true, + 'sortable' => true, + ], + + // IS_MOBILE column. + [ + 'name' => 'is_mobile', + 'type' => 'tinyint', + 'length' => '1', + 'default' => 0, + 'cache_key' => true, + 'searchable' => true, + 'sortable' => true, + ], + + // error_message column. + [ + 'name' => 'error_message', + 'type' => 'longtext', + 'default' => null, + 'cache_key' => false, + 'searchable' => true, + 'sortable' => true, + ], + + // STATUS column. + [ + 'name' => 'status', + 'type' => 'varchar', + 'length' => '255', + 'default' => null, + 'cache_key' => true, + 'searchable' => true, + 'sortable' => false, + ], + + // MODIFIED column. + [ + 'name' => 'modified', + 'type' => 'timestamp', + 'default' => '0000-00-00 00:00:00', + 'created' => true, + 'date_query' => true, + 'sortable' => true, + ], + + // LAST_ACCESSED column. + [ + 'name' => 'last_accessed', + 'type' => 'timestamp', + 'default' => '0000-00-00 00:00:00', + 'created' => true, + 'date_query' => true, + 'sortable' => true, + ], + + // CREATED_AT column. + [ + 'name' => 'created_at', + 'type' => 'timestamp', + 'default' => null, + 'created' => true, + 'date_query' => true, + 'sortable' => true, + ], + ]; +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Database/Table/LazyRenderContent.php b/inc/Engine/Optimization/LazyRenderContent/Database/Table/LazyRenderContent.php new file mode 100644 index 0000000000..6c97245867 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Database/Table/LazyRenderContent.php @@ -0,0 +1,57 @@ + value array of versions => methods. + * + * @var array + */ + protected $upgrades = []; + + /** + * Table schema data. + * + * @var string + */ + protected $schema_data = " + id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + url varchar(2000) NOT NULL default '', + is_mobile tinyint(1) NOT NULL default 0, + below_the_fold longtext default '', + error_message longtext default '', + status varchar(255) NOT NULL default '', + modified timestamp NOT NULL default '0000-00-00 00:00:00', + last_accessed timestamp NOT NULL default '0000-00-00 00:00:00', + created_at timestamp NULL, + PRIMARY KEY (id), + KEY url (url(150), is_mobile), + KEY modified (modified), + KEY last_accessed (last_accessed), + INDEX `status_index` (`status`(191))"; +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Factory.php b/inc/Engine/Optimization/LazyRenderContent/Factory.php index 6bdd58a2a5..3616883e88 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Factory.php +++ b/inc/Engine/Optimization/LazyRenderContent/Factory.php @@ -52,9 +52,13 @@ class Factory implements FactoryInterface { * Instantiate the class. * * @param ContextInterface $context LRC Context instance. + * @param TableInterface $table LRC Table instance. + * @param QueriesInterface $queries LRC Queries instance. */ - public function __construct( ContextInterface $context ) { + public function __construct( ContextInterface $context, TableInterface $table, QueriesInterface $queries ) { $this->context = $context; + $this->table = $table; + $this->queries = $queries; } /** diff --git a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php index d2fdc8bda5..f05d0fce07 100644 --- a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php +++ b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php @@ -5,6 +5,8 @@ use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Table\LazyRenderContent as LRCTable; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Queries\LazyRenderContent as LRCQuery; class ServiceProvider extends AbstractServiceProvider { /** @@ -19,6 +21,8 @@ class ServiceProvider extends AbstractServiceProvider { protected $provides = [ 'lrc_context', 'lrc_factory', + 'lrc_table', + 'lrc_query', ]; /** @@ -40,10 +44,16 @@ public function provides( string $id ): bool { public function register(): void { $this->getContainer()->add( 'lrc_context', Context::class ); + $this->getContainer()->addShared( 'lrc_table', LRCTable::class ); + + $this->getContainer()->add( 'lrc_query', LRCQuery::class ); + $this->getContainer()->addShared( 'lrc_factory', Factory::class ) ->addArguments( [ $this->getContainer()->get( 'lrc_context' ), + $this->getContainer()->get( 'lrc_table' ), + $this->getContainer()->get( 'lrc_query' ), ] ); } diff --git a/inc/Engine/WPRocketUninstall.php b/inc/Engine/WPRocketUninstall.php index 25598ffabc..d611cc563d 100644 --- a/inc/Engine/WPRocketUninstall.php +++ b/inc/Engine/WPRocketUninstall.php @@ -4,6 +4,7 @@ use WP_Rocket\Engine\Optimization\RUCSS\Database\Tables\UsedCSS; use WP_Rocket\Engine\Preload\Database\Tables\Cache; use WP_Rocket\Engine\Media\AboveTheFold\Database\Tables\AboveTheFold; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Table\LazyRenderContent; /** * Manages the deletion of WP Rocket data and files on uninstall. @@ -141,19 +142,28 @@ class WPRocketUninstall { /** * Constructor. * - * @param string $cache_path Path to the cache folder. - * @param string $config_path Path to the config folder. - * @param UsedCSS $rucss_usedcss_table RUCSS used_css table. - * @param Cache $rocket_cache Preload rocket_cache table. - * @param AboveTheFold $atf_table Above the fold table. + * @param string $cache_path Path to the cache folder. + * @param string $config_path Path to the config folder. + * @param UsedCSS $rucss_usedcss_table RUCSS used_css table. + * @param Cache $rocket_cache Preload rocket_cache table. + * @param AboveTheFold $atf_table Above the fold table. + * @param LazyRenderContent $lrc_table Lazy Render content table. */ - public function __construct( $cache_path, $config_path, $rucss_usedcss_table, $rocket_cache, $atf_table ) { + public function __construct( + $cache_path, + $config_path, + $rucss_usedcss_table, + $rocket_cache, + $atf_table, + $lrc_table + ) { $this->cache_path = trailingslashit( $cache_path ); $this->config_path = $config_path; $this->tables = [ $rucss_usedcss_table, $rocket_cache, $atf_table, + $lrc_table, ]; } diff --git a/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php b/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php index 1e88e42d13..a98a466013 100644 --- a/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php +++ b/tests/Integration/inc/Engine/WPRocketUninstall/uninstall.php @@ -143,8 +143,9 @@ public function testShouldDeleteAll() { $rucss_usedcss_table = $container->get( 'rucss_usedcss_table' ); $preload_table = $container->get( 'preload_caches_table' ); $atf_table = $container->get( 'atf_table' ); + $lrc_table = $container->get( 'lrc_table' ); - $uninstall = new WPRocketUninstall( $cache_path, $config_path, $rucss_usedcss_table, $preload_table, $atf_table ); + $uninstall = new WPRocketUninstall( $cache_path, $config_path, $rucss_usedcss_table, $preload_table, $atf_table, $lrc_table ); $uninstall->uninstall(); diff --git a/uninstall.php b/uninstall.php index 185ce6a5e6..a97dcb432a 100755 --- a/uninstall.php +++ b/uninstall.php @@ -29,16 +29,19 @@ require_once __DIR__ . '/inc/Engine/Common/PerformanceHints/Database/Table/TableInterface.php'; require_once __DIR__ . '/inc/Engine/Common/PerformanceHints/Database/Table/AbstractTable.php'; require_once __DIR__ . '/inc/Engine/Media/AboveTheFold/Database/Tables/AboveTheFold.php'; +require_once __DIR__ . '/inc/Engine/Optimization/LazyRenderContent/Database/Table/LazyRenderContent.php'; $rocket_rucss_usedcss_table = new WP_Rocket\Engine\Optimization\RUCSS\Database\Tables\UsedCSS(); $rocket_cache_table = new WP_Rocket\Engine\Preload\Database\Tables\Cache(); $rocket_atf_table = new WP_Rocket\Engine\Media\AboveTheFold\Database\Tables\AboveTheFold(); +$rocket_lrc_table = new WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Table\LazyRenderContent(); $rocket_uninstall = new WPRocketUninstall( WP_ROCKET_CACHE_ROOT_PATH, WP_ROCKET_CONFIG_PATH, $rocket_rucss_usedcss_table, $rocket_cache_table, - $rocket_atf_table + $rocket_atf_table, + $rocket_lrc_table ); $rocket_uninstall->uninstall(); From 2f41700e8b9c2cc3bcbcd8043f05abf2ed4b7e3d Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Tue, 20 Aug 2024 08:12:11 +0100 Subject: [PATCH 077/192] Closes #6838: 3.17-pre - Support multiple factory answers in PerformanceHints check_data endpoint (#6861) Co-authored-by: Gael Robin Co-authored-by: WordPressFan Co-authored-by: Opeyemi Ibrahim Co-authored-by: WordPress Fan <146129302+wordpressfan@users.noreply.github.com> Co-authored-by: Mathieu Lamiot --- assets/js/wpr-beacon.js | 6 +- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 5 ++ .../AJAX/ControllerInterface.php | 8 +-- .../PerformanceHints/AJAX/Processor.php | 60 +++++++++++++++++++ .../PerformanceHints/AJAX/Subscriber.php | 21 +++---- .../PerformanceHints/ServiceProvider.php | 11 ++-- .../Media/AboveTheFold/AJAX/Controller.php | 44 +++++++++----- .../AJAX/Subscriber/addData.php | 1 + .../AJAX/Subscriber/checkData.php | 2 +- .../AboveTheFold/AJAX/Controller/addData.php | 32 +++++----- .../AJAX/Subscriber/addData.php | 7 ++- .../AJAX/Subscriber/checkData.php | 2 +- .../AboveTheFold/AJAX/Controller/addData.php | 12 +--- 14 files changed, 142 insertions(+), 71 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/AJAX/Processor.php diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index d9342bb258..bc58da5e96 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -224,7 +224,7 @@ }, 1e4); const isGeneratedBefore = await this._getGeneratedBefore(); let shouldSaveResultsIntoDB = false; - const shouldGenerateLcp = this.config.status.atf && isGeneratedBefore === false; + const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false); if (shouldGenerateLcp) { this.lcpBeacon = new BeaconLcp_default(this.config, this.logger); await this.lcpBeacon.run(); @@ -264,7 +264,7 @@ credentials: "same-origin", body: data_check }).then((data) => data.json()); - return beacon_data_response.success; + return beacon_data_response.data; } _saveFinalResultIntoDB() { const results = { @@ -285,7 +285,7 @@ "wpr-saas-no-intercept": true } }).then((response) => response.json()).then((data2) => { - this.logger.logMessage(data2); + this.logger.logMessage(data2.data.lcp); }).catch((error) => { this.logger.logMessage(error); }).finally(() => { diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index 3610da1bd0..5558cce7e4 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,c=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||c>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},a=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&a.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},c=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(c)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",c=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||c)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore();let i=!1;this.config.status.atf&&e===!1?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run(),i=!0):this.logger.logMessage("Not running BeaconLcp because data is already available"),i?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return a.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!a.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).success}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); +(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,a=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||a>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&c.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},a=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(a)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",a=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||a)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore();let i=!1;this.config.status.atf&&(e===!1||e.lcp===!1)?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run(),i=!0):this.logger.logMessage("Not running BeaconLcp because data is already available"),i?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 19ec783186..57e814973c 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,7 +1,12 @@ { "version": 3, "sources": ["wpr-beacon.js"], +<<<<<<< HEAD + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n let shouldSaveResultsIntoDB = false;\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n shouldSaveResultsIntoDB = true;\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available\");\n }\n if (shouldSaveResultsIntoDB) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], + "mappings": "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", +======= "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n let shouldSaveResultsIntoDB = false;\n const shouldGenerateLcp = this.config.status.atf && isGeneratedBefore === false;\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n shouldSaveResultsIntoDB = true;\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available\");\n }\n if (shouldSaveResultsIntoDB) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.success;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], "mappings": "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", +>>>>>>> feature/lrc "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldSaveResultsIntoDB", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] } diff --git a/inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php b/inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php index 98499ec76d..cfb9b87779 100644 --- a/inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php +++ b/inc/Engine/Common/PerformanceHints/AJAX/ControllerInterface.php @@ -7,14 +7,14 @@ interface ControllerInterface { /** * Initiates the addition of data. * - * @return void + * @return array */ - public function add_data(): void; + public function add_data(): array; /** * Initiates the checking of data. * - * @return void + * @return array */ - public function check_data(): void; + public function check_data(): array; } diff --git a/inc/Engine/Common/PerformanceHints/AJAX/Processor.php b/inc/Engine/Common/PerformanceHints/AJAX/Processor.php new file mode 100644 index 0000000000..66d9e5d2c5 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/AJAX/Processor.php @@ -0,0 +1,60 @@ +factories = $factories; + } + + /** + * Checks existing data for various performance hints feature using their factories, + * then encodes the result in a single instance. + * + * @return void + */ + public function check_data(): void { + $payload = $this->get_payload( $this->factories, 'check_data' ); + wp_send_json_success( $payload ); + } + + /** + * Adds performance hints data to DB. + * + * @return void + */ + public function add_data() { + $payload = $this->get_payload( $this->factories, 'add_data' ); + wp_send_json_success( $payload ); + } + + /** + * Gets the response for ajax request. + * + * @param array $factories Array of factories. + * @param string $method Ajax product method name. + * @return array + */ + private function get_payload( array $factories, string $method ): array { + $payload = []; + + foreach ( $factories as $factory ) { + $payload = array_merge( $payload, $factory->get_ajax_controller()->$method() ); + } + + return $payload; + } +} diff --git a/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php b/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php index ef26dc446c..d96650f496 100644 --- a/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/AJAX/Subscriber.php @@ -5,23 +5,22 @@ use WP_Rocket\Event_Management\Subscriber_Interface; - class Subscriber implements Subscriber_Interface { /** - * Array of Factories. + * Processor Instance. * - * @var array + * @var Processor */ - private $factories; + private $processor; /** * Instantiate the class * - * @param array $factories Array of factories. + * @param Processor $processor Processor Instance. */ - public function __construct( array $factories ) { - $this->factories = $factories; + public function __construct( Processor $processor ) { + $this->processor = $processor; } /** @@ -44,9 +43,7 @@ public static function get_subscribed_events(): array { * @return void */ public function add_data() { - foreach ( $this->factories as $factory ) { - $factory->get_ajax_controller()->add_data(); - } + $this->processor->add_data(); } /** @@ -55,8 +52,6 @@ public function add_data() { * @return void */ public function check_data() { - foreach ( $this->factories as $factory ) { - $factory->get_ajax_controller()->check_data(); - } + $this->processor->check_data(); } } diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index e68da3ace7..3da17a3893 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -4,9 +4,8 @@ namespace WP_Rocket\Engine\Common\PerformanceHints; use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; -use WP_Rocket\Engine\Common\PerformanceHints\AJAX\Subscriber as AjaxSubscriber; -use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Processor as FrontendProcessor; -use WP_Rocket\Engine\Common\PerformanceHints\Frontend\Subscriber as FrontendSubscriber; +use WP_Rocket\Engine\Common\PerformanceHints\AJAX\{Processor as AjaxProcessor, Subscriber as AjaxSubscriber}; +use WP_Rocket\Engine\Common\PerformanceHints\Frontend\{Processor as FrontendProcessor, Subscriber as FrontendSubscriber }; use WP_Rocket\Engine\Common\PerformanceHints\Admin\{Controller as AdminController, Subscriber as AdminSubscriber}; use WP_Rocket\Engine\Common\PerformanceHints\Cron\{Controller as CronController, Subscriber as CronSubscriber}; use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{ @@ -27,6 +26,7 @@ class ServiceProvider extends AbstractServiceProvider { * @var array */ protected $provides = [ + 'ajax_processor', 'performance_hints_ajax_subscriber', 'frontend_processor', 'performance_hints_frontend_subscriber', @@ -72,13 +72,16 @@ public function register(): void { $factories[] = $factory; } - $this->getContainer()->addShared( 'performance_hints_ajax_subscriber', AjaxSubscriber::class ) + $this->getContainer()->addShared( 'ajax_processor', AjaxProcessor::class ) ->addArguments( [ $factories, ] ); + $this->getContainer()->addShared( 'performance_hints_ajax_subscriber', AjaxSubscriber::class ) + ->addArgument( $this->getContainer()->get( 'ajax_processor' ) ); + $this->getContainer()->add( 'frontend_processor', FrontendProcessor::class ) ->addArguments( [ diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php index 0f9f5b283f..2bb781d74a 100644 --- a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php +++ b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php @@ -49,14 +49,19 @@ public function __construct( ATFQuery $query, ContextInterface $context ) { /** * Add LCP data to the database * - * @return void + * @return array */ - public function add_data(): void { + public function add_data(): array { + $payload = [ + 'lcp' => '', + ]; + check_ajax_referer( 'rocket_beacon', 'rocket_beacon_nonce' ); if ( ! $this->context->is_allowed() ) { - wp_send_json_error( 'not allowed' ); - return; + $payload['lcp'] = 'not allowed'; + + return $payload; } $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; @@ -106,8 +111,9 @@ public function add_data(): void { $row = $this->query->get_row( $url, $is_mobile ); if ( ! empty( $row ) ) { - wp_send_json_error( 'item already in the database' ); - return; + $payload['lcp'] = 'item already in the database'; + + return $payload; } $status = isset( $_POST['status'] ) ? sanitize_text_field( wp_unslash( $_POST['status'] ) ) : ''; @@ -126,11 +132,13 @@ public function add_data(): void { $result = $this->query->add_item( $item ); if ( ! $result ) { - wp_send_json_error( 'error when adding the entry to the database' ); - return; + $payload['lcp'] = 'error when adding the entry to the database'; + + return $payload; } - wp_send_json_success( $item ); + $payload['lcp'] = $item; + return $payload; } /** @@ -266,14 +274,18 @@ private function sanitize_image_url( string $url ) { * If the data exists, it returns a JSON success response with true. If the data does not exist, it returns a JSON success response with false. * If the context is not allowed, it returns a JSON error response with false. * - * @return void + * @return array */ - public function check_data(): void { + public function check_data(): array { + $payload = [ + 'lcp' => false, + ]; + check_ajax_referer( 'rocket_beacon', 'rocket_beacon_nonce' ); if ( ! $this->context->is_allowed() ) { - wp_send_json_error( false ); - return; + $payload['lcp'] = true; + return $payload; } $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; @@ -282,11 +294,11 @@ public function check_data(): void { $row = $this->query->get_row( $url, $is_mobile ); if ( ! empty( $row ) ) { - wp_send_json_success( 'data already exists' ); - return; + $payload['lcp'] = true; + return $payload; } - wp_send_json_error( 'data does not exist' ); + return $payload; } /** diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php index 2098ce06cc..a433d35cfa 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php @@ -42,6 +42,7 @@ 'last_accessed' => '2024-01-01 00:00:00', ], 'result' => false, + 'message' => 'not allowed', ], ], 'testShouldAddItemToDB' => [ diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php index 3a3caf2c75..c691d28a39 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php @@ -15,7 +15,7 @@ 'row' => [], ], 'expected' => [ - 'result' => false, + 'result' => true, ], ], 'testShouldReturnExists' => [ diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php index 860fc5fdb2..9f5552ea35 100644 --- a/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php @@ -205,6 +205,7 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => json_encode( (object) [ 'type' => 'img', @@ -218,7 +219,6 @@ ], ] ), 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -301,6 +301,7 @@ 'url' => 'http://example.org', 'is_mobile' => true, 'status' => 'completed', + 'error_message' => '', 'lcp' => json_encode( (object) [ 'type' => 'img', @@ -314,7 +315,6 @@ ], ] ), 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -398,6 +398,7 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => json_encode( (object) [ 'type' => 'img', @@ -411,7 +412,6 @@ ], ] ), 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -517,6 +517,7 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => json_encode( (object) [ 'type' => 'bg-img', @@ -538,7 +539,6 @@ ], ] ), 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -657,6 +657,7 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => json_encode( (object) [ 'type' => 'bg-img-set', @@ -678,7 +679,6 @@ ], ] ), 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -727,10 +727,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => json_encode( $long_array_2[0] ), 'viewport' => json_encode( array_slice( $long_array_2, 1, 20 ) ), 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -762,10 +762,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -823,10 +823,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -860,10 +860,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'failed', + 'error_message' => 'Script error', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => 'Script error', ], ], ], @@ -896,10 +896,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'failed', + 'error_message' => 'Script timeout', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => 'Script timeout', ], ], ], @@ -960,10 +960,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -1023,10 +1023,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -1086,10 +1086,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -1149,10 +1149,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -1212,10 +1212,10 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => 'not found', 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], @@ -1281,6 +1281,7 @@ 'url' => 'http://example.org', 'is_mobile' => false, 'status' => 'completed', + 'error_message' => '', 'lcp' => json_encode( (object) [ 'type' => 'img', @@ -1289,7 +1290,6 @@ ), 'viewport' => '[]', 'last_accessed' => '2024-01-01 00:00:00', - 'error_message' => '', ], ], ], diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php index 8656a0bdf2..cfa8280611 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/addData.php @@ -59,7 +59,12 @@ public function testShouldReturnExpected( $config, $expected ) { $result = $this->callAjaxAction(); - $this->assertSame( $expected['result'], $result->success ); + if ( ! $expected['result'] ) { + $this->assertSame( $expected['message'], $result->data->lcp ); + } + else { + $this->assertSame( $expected['result'], $result->success ); + } } public function set_allowed() { diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php index 14f3a987c5..f12b7ec012 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/AJAX/Subscriber/checkData.php @@ -58,7 +58,7 @@ public function testShouldReturnExpected( $config, $expected ) { $result = $this->callAjaxAction(); - $this->assertSame( $expected['result'], $result->success ); + $this->assertSame( $expected['result'], $result->data->lcp ); } public function set_allowed() { return $this->allowed; diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php index b70b2c13d5..905d32e91d 100644 --- a/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/AJAX/Controller/addData.php @@ -99,16 +99,6 @@ function( $url ) use ( $images_valid_sources ) { ->with( $expected['item'] ) ->willReturn( $expected['result'] ); - if ( ! $expected['result'] ) { - Functions\expect( 'wp_send_json_error' ) - ->once() - ->with( $expected['message'] ); - } elseif ( $expected['result'] ) { - Functions\expect( 'wp_send_json_success' ) - ->once() - ->with( $expected['message'] ); - } - $this->stubWpParseUrl(); Filters\expectApplied('rocket_atf_invalid_schemes')->with([ 'chrome-[^:]+://' ])->andReturn([ 'chrome-[^:]+://' ]); @@ -118,6 +108,6 @@ function( $url ) use ( $images_valid_sources ) { Functions\when('wp_check_filetype')->justReturn( $config['filetype'] ); } - $this->controller->add_data(); + $this->assertSame( [ 'lcp' => $expected['message'] ], $this->controller->add_data() ); } } From fedbdd1dea9f786ab272c2245a49995cdad3d486 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Tue, 20 Aug 2024 10:37:05 +0100 Subject: [PATCH 078/192] Change notice text and modify rucss button text --- inc/Engine/Admin/Settings/Page.php | 4 ++-- .../inc/Engine/Admin/Settings/Page/displayUpdateNotice.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Admin/Settings/Page.php b/inc/Engine/Admin/Settings/Page.php index 69d131b72d..a820af18a7 100644 --- a/inc/Engine/Admin/Settings/Page.php +++ b/inc/Engine/Admin/Settings/Page.php @@ -600,7 +600,7 @@ private function assets_section() { 'sanitize_callback' => 'sanitize_checkbox', 'options' => [ 'remove_unused_css' => [ - 'label' => __( 'Remove Unused CSS', 'rocket' ), + 'label' => __( 'Remove Unused CSS (RUCSS)', 'rocket' ), 'disabled' => $invalid_license || $rucss_status['disable'] ? 'disabled' : false, // translators: %1$s = opening tag, %2$s = closing tag. 'description' => sprintf( __( 'Removes unused CSS per page and helps to reduce page size and HTTP requests. Recommended for best performance. Test thoroughly! %1$sMore info%2$s', 'rocket' ), '', '' ), @@ -2248,7 +2248,7 @@ public function display_update_notice() { 'dismissible' => '', 'message' => sprintf( // translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: opening a tag. - __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. Our brand new feature %3$sLazy Render Content%4$s. Check out our documentation to learn more about it.', 'rocket' ), + __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New feature: %3$sLazy Render Content%4$s. Check out our documentation to learn more about it.', 'rocket' ), '', '', '', diff --git a/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php b/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php index ecbb71cfee..ba86daf275 100644 --- a/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php +++ b/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php @@ -91,7 +91,7 @@ 'expected' => [ 'status' => 'info', 'dismissible' => '', - 'message' => 'WP Rocket: the plugin has been updated to the 3.17 version. Our brand new feature Lazy Render Content. Check out our documentation to learn more about it.', + 'message' => 'WP Rocket: the plugin has been updated to the 3.17 version. New feature: Lazy Render Content. Check out our documentation to learn more about it.', 'dismiss_button' => 'rocket_update_notice', ], ], From 4fbffdea3a2c2c294a453c37b9d7faa12aa73596 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:44:40 +0100 Subject: [PATCH 079/192] Fix issue with buffer modification with more than one factory parsed (#6875) --- .../PerformanceHints/Frontend/Processor.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index 9139159d22..19442a6718 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -59,17 +59,29 @@ public function maybe_apply_optimizations( string $html ): string { $is_mobile = $this->is_mobile(); $html_optimized = null; + // Flag to check if any optimization has been applied. + $optimization_applied = false; + foreach ( $this->factories as $factory ) { $row = $factory->queries()->get_row( $url, $is_mobile ); + if ( empty( $row ) ) { - return $this->inject_beacon( $html, $url, $is_mobile ); + continue; } - $html = $html_optimized ?? $html; $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); + // Update html for the next iteration. + $html = $html_optimized; + // Set flag as true since optimization has been applied. + $optimization_applied = true; + } + + // Check if any optimizations were applied, if not, inject beacon. + if ( ! $optimization_applied ) { + $html = $this->inject_beacon( $html, $url, $is_mobile ); } - return $html_optimized; + return $html_optimized ?? $html; } /** From f3100c2eeb12cd46bb8de31adea9b7795fb4e10d Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Tue, 20 Aug 2024 11:11:06 +0100 Subject: [PATCH 080/192] Build admin css --- assets/css/wpr-admin.css | 9 ++++----- assets/css/wpr-admin.min.css | 2 +- src/scss/components/_button.scss | 3 +++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/assets/css/wpr-admin.css b/assets/css/wpr-admin.css index fc089bcebc..2fd876baee 100755 --- a/assets/css/wpr-admin.css +++ b/assets/css/wpr-admin.css @@ -1624,15 +1624,15 @@ div.wpr-upgrade-websites { font-size: 0.6875rem; line-height: 1.8181818182; } +.wpr-button--no-min-width { + min-width: auto !important; +} .wpr-button--icon { min-width: 160px; padding-left: 8px; padding-right: 40px; text-align: left; } -.wpr-button--no-min-width{ - min-width: auto; -} .wpr-button--icon:before { position: absolute; right: 8px; @@ -2018,7 +2018,6 @@ div.wpr-upgrade-websites { .wpr-radio-buttons { padding-left: 24px; } - .wpr-fieldWarning.wpr-radio-warning { margin-left: -24px; padding-left: 30px; @@ -3102,4 +3101,4 @@ div.wpr-tutorial-item { .wpr-field--categorizedmultiselect { padding-right: 80px; } -} +} \ No newline at end of file diff --git a/assets/css/wpr-admin.min.css b/assets/css/wpr-admin.min.css index 174b9bf9ed..fc33a00bde 100755 --- a/assets/css/wpr-admin.min.css +++ b/assets/css/wpr-admin.min.css @@ -1 +1 @@ -h1,h2,h3,h4{color:currentColor;margin:0;font-weight:normal}button{padding:0;border:none;background:none;cursor:pointer}a{color:currentColor;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}a:hover{color:currentColor}input[type=submit]{cursor:pointer;border:none}a:active,button:active{outline:none}a:focus,button:focus{color:currentColor;box-shadow:none}.wpr-wrap{padding:16px;margin:0 0 0 -20px}@media(max-width: 783px){.wpr-wrap{padding:0;margin:0 0 0 -10px}}.wpr-body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-ms-interpolation-mode:nearest-neighbor;image-rendering:optimizeQuality;text-rendering:optimizeLegibility;display:flex;color:#121116;font-size:0.875rem;line-height:1.5}.wpr-body *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media(max-width: 783px){#hs-beacon{display:none !important}}.wpr-u-flex{display:flex;align-items:center;justify-content:center}.wpr-mt-2{margin-top:20px}.wpr-fs-sm{font-size:.9em}.wpr-fs-md{font-size:1em}@font-face{font-family:"wpr-icomoon";src:url("../fonts/icomoon.eot");src:url("../fonts/icomoon.eot?#iefix") format("embedded-opentype"),url("../fonts/icomoon.woff") format("woff"),url("../fonts/icomoon.ttf") format("truetype"),url("../fonts/icomoon.svg#icomoon") format("svg");font-weight:normal;font-style:normal}[class^=wpr-icon-]:before,[class*=" wpr-icon-"]:after,[class^=wpr-icon-]:after,[class*=" wpr-icon-"]:before,[id^=wpr-nav-]:before,[id*=" wpr-nav-"]:after,[id^=wpr-nav-]:after,[id*=" wpr-nav-"]:before{font-family:"wpr-icomoon";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class^=wpr-icon-] span.hidden,[class*=" wpr-icon-"] span.hidden{display:inline-block;height:0;width:0;overflow:hidden}.wpr-icon-chevron-right:before{content:""}.wpr-icon-chevron-left:before{content:"";transform:rotate(180deg)}.wpr-icon-chevron-down:before{content:"";transform:scale(0.6)}.wpr-icon-chevron-up:before{content:"";top:50%;transform:translateY(-50%) scale(0.6)}.wpr-icon-rollback:before{content:""}.wpr-icon-addon:before,.wpr-addonSubMenuItem:before{content:""}.wpr-icon-addons:before,#wpr-nav-addons:before{content:""}.wpr-icon-book:before{content:""}.wpr-icon-cdn:before,#wpr-nav-page_cdn:before{content:""}.wpr-icon-database:before,#wpr-nav-database:before{content:""}.wpr-icon-export:before{content:""}.wpr-icon-files:before,#wpr-nav-cache:before{content:""}.wpr-icon-help:before{content:""}.wpr-icon-home:before,#wpr-nav-dashboard:before{content:""}.wpr-icon-import:before{content:""}.wpr-icon-important:before{content:""}.wpr-icon-information:before{content:""}.wpr-icon-information2:before{content:""}.wpr-icon-interrogation:before{content:""}.wpr-icon-media:before,#wpr-nav-media:before{content:""}.wpr-icon-plus:before{content:""}.wpr-icon-refresh:before,#wpr-nav-preload:before{content:""}.wpr-icon-rules:before,#wpr-nav-advanced_cache:before{content:""}.wpr-icon-stack:before,#wpr-nav-file_optimization:before{content:""}.wpr-icon-tools:before,#wpr-nav-tools:before{content:""}.wpr-icon-trash:before{content:""}.wpr-icon-user:before{content:""}.wpr-icon-check:before{content:""}.wpr-icon-check2:before{content:""}.wpr-icon-close:before{content:""}.wpr-icon-heartbeat:before,#wpr-nav-heartbeat:before{content:url("../img/heartbeat.svg")}.wpr-icon-heartbeat-hover:before,#wpr-nav-heartbeat.isActive:before,#wpr-nav-heartbeat:hover:before{content:url("../img/heartbeat-hover.svg")}.wpr-icon-imagify:before,#wpr-nav-imagify:before{content:url("../img/imagify.svg")}.wpr-icon-imagify-hover:before,#wpr-nav-imagify.isActive:before,#wpr-nav-imagify:hover:before{content:url("../img/imagify-hover.svg")}.wpr-icon-tutorial:before,#wpr-nav-tutorials:before{content:url("../img/play.svg")}.wpr-icon-tutorial-hover:before,#wpr-nav-tutorials.isActive:before,#wpr-nav-tutorials:hover:before{content:url("../img/play-hover.svg")}.wpr-icon-tutorial-alt:before{content:url("../img/play-alt.svg")}.wpr-imagify-info:before{content:url("../img/imagify-info.svg")}.wpr-imagify-install:before{content:url("../img/imagify-install.svg")}.wpr-title1{font-size:1.625rem;line-height:1;font-weight:600;letter-spacing:.01em}.wpr-title2{font-size:1rem;line-height:1.5;font-weight:bold;letter-spacing:-0.02em}.wpr-title3,.wpr-select label,.wpr-select select,.wpr-field--radio label{font-size:0.875rem;line-height:1.7142857143;font-weight:bold;letter-spacing:-0.011em}.wpr-Header{display:flex;flex-direction:column;flex:0 0 225px}@media(max-width: 783px){.wpr-Header{flex:0 0 50px}}.wpr-Header-logo{padding:32px 0 24px;text-align:center}@media(max-width: 783px){.wpr-Header-logo{padding:16px 0 8px}}@media(max-width: 783px){.wpr-Header-logo-desktop{display:none}}.wpr-Header-logo-mobile{display:none}@media(max-width: 783px){.wpr-Header-logo-mobile{display:inline-block}}.wpr-Header-footer{margin-top:auto;padding:48px 20px 0;font-size:0.6875rem;line-height:4.3636363636;color:#666;opacity:.6;font-weight:bold}@media(max-width: 783px){.wpr-Header-footer{display:none}}.wpr-Sidebar{position:relative;display:none;flex:0 0 290px;padding:24px 16px}@media(max-width: 1239px){.wpr-Sidebar{flex:0 0 260px}}@media(max-width: 1083px){.wpr-Sidebar{display:none !important}}.wpr-Sidebar-title{margin-bottom:32px}.wpr-Sidebar-notice{padding:8px 16px;margin-bottom:16px;background:#fff;border:1px solid #e8ebee;border-left:2px solid #1eadbf;border-radius:0 3px 3px 0;color:#666}.wpr-Sidebar-notice p{margin:0}.wpr-Sidebar-notice-link{display:inline-block;margin-top:8px;font-size:0.6875rem;line-height:1.8181818182;color:#02707f;letter-spacing:-0.05em;text-transform:uppercase;text-decoration:none;font-weight:bold}.wpr-Sidebar-notice-link:hover,.wpr-Sidebar-notice-link:focus{color:#40bacb}.wpr-Sidebar-info{padding:16px;background:#ebfaf5;margin-bottom:16px;border-radius:3px}.wpr-Sidebar-info h4{padding-left:48px;font-weight:500}.wpr-Sidebar-info p{margin:8px 0 0;font-size:0.6875rem;line-height:1.4545454545;color:#666}.wpr-Sidebar-info i{position:absolute;display:block;margin-top:-1px;width:40px;height:40px;color:#00a66b;font-size:1.0625rem;line-height:2.3529411765;background:#c6f0de;border-radius:3px;text-align:center}.wpr-Content{position:relative;background:#fff;padding:32px 24px;flex:1 1 auto;max-width:1230px}@media(max-width: 783px){.wpr-Content{padding:24px 16px}}.wpr-Content form>input:last-child{margin-top:24px;color:#fff !important}.wpr-Content.isNotFull{max-width:960px}.wpr-Content-tips{position:absolute;top:48px;right:24px;font-weight:bold;color:#666}@media(max-width: 1083px){.wpr-Content-tips{display:none !important}}.wpr-Page{margin-bottom:32px}.wpr-Page-row{display:flex;flex-direction:row}@media(max-width: 1239px){.wpr-Page-row{flex-direction:column}}.wpr-Page-col{flex:1 1 auto}.wpr-Page-col--fixed{margin-left:24px;flex:0 0 325px}@media(max-width: 1239px){.wpr-Page-col--fixed{margin-left:0}}.wpr-Page#dashboard #wpr-action-refresh_account:before{transition:all 200ms ease-out;opacity:1;transform:translateY(0)}.wpr-Page#dashboard #wpr-action-refresh_account.wpr-isLoading:before{animation:loading 1.2s infinite}.wpr-Page#dashboard #wpr-action-refresh_account.wpr-isHidden:before{opacity:0}.wpr-Page#dashboard #wpr-action-refresh_account.wpr-isShown:before{opacity:1}@keyframes loading{from{transform:rotate(0)}to{transform:rotate(360deg)}}.wpr-Page#dashboard .wpr-documentation{margin-top:98px;padding:43px 16px}@media(max-width: 1239px){.wpr-Page#dashboard .wpr-documentation{margin-top:40px}}.wpr-Page#dashboard .wpr-documentation .wpr-button{margin-top:8px}.wpr-Page#dashboard .wpr-documentation i{font-size:3.375rem;line-height:1}.wpr-Page#dashboard .wpr-radio{padding-left:72px}.wpr-Page#dashboard .wpr-field--radio{padding:16px 8px}.wpr-Page#dashboard .wpr-field--radio:first-child{padding-top:0}.wpr-Page#dashboard .wpr-field--radio:last-child{padding-bottom:0}.wpr-Page#dashboard .wpr-field--radio .wpr-field-description{font-style:normal;color:#666;margin-left:72px}.wpr-Page#dashboard .wpr-field-account{padding-bottom:0}.wpr-Page#dashboard .wpr-infoAccount{font-weight:bold;margin-left:8px;color:#444}.wpr-Page#dashboard .wpr-infoAccount:before{content:"";position:relative;display:inline-block;width:13px;height:13px;background:#e0e4e9;border-radius:50%;color:#fff;margin-right:6px;text-align:center;top:2px;font-size:0.5rem;line-height:1.625}.wpr-Page#dashboard .wpr-infoAccount.wpr-isValid{color:#00a66b}.wpr-Page#dashboard .wpr-infoAccount.wpr-isValid:before{content:"";font-family:"wpr-icomoon";speak:none;background:#3ece9d;top:-1px}.wpr-Page#dashboard .wpr-infoAccount.wpr-isInvalid{color:#d60e5b}.wpr-Page#dashboard .wpr-infoAccount.wpr-isInvalid:before{content:"!";font-weight:bold;font-size:0.625rem;line-height:1.3;speak:none;background:#d33f49;top:-1px}.wpr-Page#dashboard #wpr-account-data:before{content:none}.wpr-Page#tools #wpr-action-rocket_enable_mobile_cpcss:before{transition:all 200ms ease-out;opacity:1;transform:translateY(0)}.wpr-Page#tools #wpr-action-rocket_enable_mobile_cpcss.wpr-isLoading:before{animation:loading 1.2s infinite}.wpr-Popin{display:none;position:fixed;width:772px;height:auto;top:50%;left:50%;background:#fff;border-radius:3px;transform:translateX(-50%) translateY(-50%);z-index:100000}.wpr-Popin-overlay{display:none;position:fixed;opacity:0;width:100%;height:100%;top:0;left:0;background:rgba(0,0,0,.8);z-index:99999}.wpr-Popin-header{display:flex;align-items:center;justify-content:space-between;height:64px;padding:0 32px;background:#2d1656;color:#fff;font-weight:600}.wpr-Popin-close{color:#665090;font-size:1.5rem;line-height:1;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-Popin-close:hover,.wpr-Popin-close:focus{color:#fff;outline:none}.wpr-Popin-content{padding:8px 32px;color:#666}.wpr-Popin-flex{display:flex;flex-direction:row;align-items:center}.wpr-Popin-flex div{margin-left:32px}.wpr-Popin p{margin:16px 0}.wpr-Popin .wp-rocket-data-table{padding:12px 24px;background:#f2f3f6 !important;border:none}.wpr-Popin .wp-rocket-data-table td{width:50%;color:#121116;padding:8px 0;padding-left:4px;border-bottom:1px solid #c2cad4}.wpr-Popin .wp-rocket-data-table td:not(.column-primary){font-family:"Monaco";font-size:0.75rem;line-height:1.6666666667;color:#666;letter-spacing:-0.01em}.wpr-Popin .wp-rocket-data-table tr{background:#f2f3f6;border-bottom:1px solid #e0e4e9}.wpr-Popin .wp-rocket-data-table tr:last-child td{border-bottom:none}.wpr-Popin .wp-rocket-data-table strong{font-weight:500}.wpr-Popin .wp-rocket-data-table em{font-style:normal}.wpr-Popin .wp-rocket-data-table code{padding:0;margin:0;background:transparent}.wpr-rocketcdn-cta-small{border-radius:5px;margin:24px 0;padding:16px}.wpr-rocketcdn-cta-small.wpr-isHidden{display:none}.wpr-rocketcdn-cta-small .notice-title{font-weight:700}.wpr-rocketcdn-cta-small .wpr-flex{display:flex;justify-content:space-between;align-items:center}@media(max-width: 783px){.wpr-rocketcdn-cta-small .wpr-flex{text-align:start;flex-direction:column}}.wpr-rocketcdn-cta{margin:10px 0;position:relative}.wpr-rocketcdn-cta.wpr-isHidden{display:none}.wpr-rocketcdn-cta-close{position:absolute;top:16px;right:16px;background:transparent;border:0;color:rgba(255,255,255,.5)}.wpr-rocketcdn-cta-close--no-promo{position:absolute;top:16px;right:16px;background:transparent;border:0;color:rgba(0,0,0,.5)}.wpr-rocketcdn-cta-close--no-promo:before{content:"✕";font-weight:700;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta-close:before{content:"✕";color:#121116;font-weight:700;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta .wpr-rocketcdn-promo{background:#ffd147;border-top-left-radius:2px;border-top-right-radius:2px;padding:16px 48px 16px 16px}.wpr-rocketcdn-cta .wpr-rocketcdn-promo-title{font-weight:700;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta .wpr-rocketcdn-promo-date{margin:0;font-weight:500;font-size:1rem;line-height:1.5}.wpr-rocketcdn-cta-subtitle{color:#444;margin-top:0;font-size:0.875rem;line-height:1.7142857143}.wpr-rocketcdn-cta-content{background:#f9fafb;border-top:1px solid #e8ebee;border-left:1px solid #e8ebee;border-right:1px solid #e8ebee;padding:16px}.wpr-rocketcdn-cta-content--no-promo{border-top-left-radius:2px;border-top-right-radius:2px;background:#f9fafb;border-top:1px solid #e8ebee;border-left:1px solid #e8ebee;border-right:1px solid #e8ebee;padding:16px}.wpr-rocketcdn-cta .wpr-flex{display:flex;justify-content:space-between;align-items:center}@media(max-width: 783px){.wpr-rocketcdn-cta .wpr-flex{text-align:start;flex-direction:column}}.wpr-rocketcdn-cta .wpr-rocketcdn-features{margin:0;padding-right:16px}@media(max-width: 783px){.wpr-rocketcdn-cta .wpr-rocketcdn-features{border-right:none}}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing{background-color:#fff;align-items:center;display:flex;flex-direction:column;padding:16px;padding-bottom:32px;width:33.3333333333%;max-width:219px}@media(max-width: 783px){.wpr-rocketcdn-cta .wpr-rocketcdn-pricing{width:auto}}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing-regular{color:#72777c;margin-bottom:8px}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing .wpr-rocketcdn-cta-billing-detail{margin-bottom:16px;font-size:1rem;line-height:1.375}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing .wpr-rocketcdn-cta-currency-major{font-weight:700;font-size:3rem;line-height:1.1666666667}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing .wpr-rocketcdn-cta-currency-minor{font-weight:700;vertical-align:top;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta .wpr-rocketcdn-feature{margin:24px 0;min-height:30px;padding-left:62px;position:relative}.wpr-rocketcdn-cta .wpr-rocketcdn-feature:before{position:absolute;top:50%;left:5px;transform:translateY(-50%)}.wpr-rocketcdn-cta .wpr-rocketcdn-bandwidth:before{content:url(../img/bandwidth.svg)}.wpr-rocketcdn-cta .wpr-rocketcdn-configuration:before{content:url(../img/configuration.svg)}.wpr-rocketcdn-cta .wpr-rocketcdn-automatic:before{content:url(../img/automatic.svg)}.wpr-rocketcdn-cta-footer{color:#121116;font-weight:600;padding:16px 8px 8px;font-size:0.875rem;line-height:1.5714285714}.wpr-rocketcdn-cta-footer a{position:relative;padding-left:22px}.wpr-rocketcdn-cta-footer a:before{content:"";position:absolute;width:14px;height:15px;background:url("../img/icon-i-circle.svg") no-repeat center center;top:3px;left:0}.wpr-rocketcdn-cta-promo-footer{color:#121116;padding:16px 8px 8px;font-size:0.875rem;line-height:1.5714285714}.wpr-rocketcdn-subscription{text-align:end}.wpr-rocketcdn-subscription .wpr-rocketcdn-open{color:#666;text-decoration:underline}.wpr-rocket-analytics-cta.wpr-isHidden{display:none}.wpr-license-upgrade-button{font-weight:bold;text-decoration:underline}.wpr-license-upgrade-button:hover{text-decoration:none}.wpr-field.wpr-field-account .wpr-flex{align-items:flex-start}.wpr-infoAccount-License{flex:1 0 60%;margin-right:16px}@media(max-width: 783px){.wpr-field.wpr-field-account .wpr-flex>div{width:100%}}.wpr-field.wpr-field-account .wpr-flex>div:last-child{text-align:right}@media(max-width: 783px){.wpr-field.wpr-field-account .wpr-flex>div:last-child{text-align:left}}.wpr-Popin-Upgrade .wpr-Popin-content{padding-bottom:32px}.wpr-Popin-Upgrade .wpr-Popin-flex{justify-content:space-between}.wpr-Popin-Upgrade .wpr-Popin-flex>div{align-items:center;border:1px solid #dadada;border-radius:24px;display:flex;flex-direction:column;margin:0 16px 0 0;padding:24px;text-align:center;width:50%}.wpr-Popin-Upgrade .wpr-Popin-flex>div:last-child{margin-right:0}@media(max-width: 783px){.wpr-Popin-Upgrade .wpr-Popin-flex>div{margin:0;width:100%}}.wpr-Upgrade-Plus .wpr-upgrade-title::before{content:url(../img/plus.svg);display:block;width:117px;height:31px;top:0;position:absolute;left:50%;transform:translateX(-50%)}.wpr-Upgrade-Infinite .wpr-upgrade-title::before{content:url(../img/infinite.svg);display:block;width:48px;height:31px;top:0;position:absolute;left:50%;transform:translateX(-50%)}div.wpr-upgrade-saving{background:#ffd147;border-radius:44px;color:#121116;font-weight:bold;margin:0 0 24px 0;padding:8px 16px;text-align:center}.wpr-upgrade-title{color:#f56f46;font-size:1.875rem;line-height:1.2;margin-bottom:16px;padding-top:55px;position:relative}div.wpr-upgrade-prices{color:#121116;font-size:3rem;line-height:1;font-weight:bold;margin:0 0 16px 0}.wpr-upgrade-price-symbol{font-size:1.875rem;line-height:1;vertical-align:super}.wpr-upgrade-price-regular{color:#72777c;font-size:1rem;line-height:1;vertical-align:top}div.wpr-upgrade-websites{color:#121116;font-size:0.875rem;line-height:1;font-weight:bold;margin:0 0 24px 0}.wpr-upgrade-link{background:#fff;border:1px solid #f56f46;border-radius:800px;color:#f56f46;display:block;font-size:1rem;line-height:1.125;font-weight:bold;padding:16px 24px;text-decoration:none}.wpr-upgrade-link:hover{background:#f56f46;color:#fff}.wpr-upgrade-link::after{content:"→";font-weight:normal;margin-left:8px}.rocket-promo-banner{background:#ffd147;display:flex;justify-content:space-around;margin-top:16px;padding:24px;position:relative}@media(max-width: 783px){.rocket-promo-banner{flex-flow:column}}.rocket-promo-banner>div{display:flex;flex-flow:column;width:50%}@media(max-width: 783px){.rocket-promo-banner>div{width:100%}}.rocket-promo-title{font-weight:bold;margin-bottom:24px}.rocket-promo-discount{background:#fff;border-radius:44px;display:inline-block;margin-right:8px;padding:8px 16px;text-transform:uppercase}.rocket-promo-message,.rocket-promo-deal{font-size:1rem;line-height:1.5;margin-bottom:0}.rocket-promo-deal{margin-top:8px}.rocket-promo-cta-block{align-items:center;margin-right:24px}.rocket-promo-countdown{display:flex;flex-flow:row wrap;width:66%}.rocket-promo-countdown>.rocket-countdown-item{background:#fff;border-radius:8px;flex:1;margin-right:8px;padding:8px;text-align:center}.rocket-promo-countdown>.rocket-countdown-item>.rocket-countdown-value{display:block;font-size:1.5rem;line-height:1;font-weight:bold}.rocket-promo-cta{background:#172153;border-radius:44px;color:#fff;font-weight:bold;padding:16px 32px}.rocket-renewal-banner{background:#ffd147;display:flex;flex-flow:row wrap;align-items:center;justify-content:space-evenly;margin-top:16px;padding:8px}.rocket-renewal-expired-banner{background:#ffd147;margin-top:16px;padding:24px;position:relative}.rocket-renewal-expired-banner-container{display:flex;justify-content:space-around}@media(max-width: 783px){.rocket-renewal-expired-banner-container{flex-flow:column}}.rocket-renewal-expired-banner-container>div{display:flex;flex-flow:column;width:50%}@media(max-width: 783px){.rocket-renewal-expired-banner-container>div{width:100%}}.rocket-renew-message{margin:0 16px}.rocket-renew-message>p{font-size:0.875rem;line-height:1.5}.rocket-expired-message>p{font-size:0.875rem;line-height:1.5;padding-left:80px}.rocket-expired-title{font-size:1.375rem;line-height:1.5;font-weight:bold}.rocket-expired-title::before{content:url(../img/warning.svg);display:inline-block;height:48px;width:63px;margin-right:17px;vertical-align:middle}.rocket-expired-cta-container{justify-content:center;align-items:center}.rocket-renew-cta{display:block;background:#172153;border-radius:44px;color:#fff;font-size:1rem;line-height:1.125;font-weight:bold;padding:16px 24px;text-decoration:none}.rocket-renew-cta:hover,.rocket-renew-cta:active,.rocket-renew-cta:focus{color:#fff}.rocket-renew-cta::after{content:"→";font-weight:normal;margin-left:8px}.wpr-menuItem{position:relative;display:block;padding:16px 44px 18px 20px;text-decoration:none;color:#121116;border-top:1px solid #e0e4e9;border-left:2px solid transparent;overflow:hidden;transition:all 100ms ease-out;-webkit-transition:all 100ms ease-out}@media(max-width: 783px){.wpr-menuItem{width:57px;height:50px;padding:0}}.wpr-menuItem:before{position:absolute;top:calc(50% - 12px);right:18px;text-align:center;font-size:1.4375rem;line-height:1;color:#121116;opacity:.4;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-menuItem:hover,.wpr-menuItem.isActive{color:#121116;background:#fff;border-left:2px solid #f56640}.wpr-menuItem:hover .wpr-menuItem-title,.wpr-menuItem.isActive .wpr-menuItem-title{color:#f56640}.wpr-menuItem:hover:before,.wpr-menuItem.isActive:before{color:#f56640;opacity:1}.wpr-menuItem:focus{color:#121116}.wpr-menuItem:focus:before{color:#121116}.wpr-menuItem-title{font-size:0.8125rem;line-height:1.4615384615;font-weight:bold;letter-spacing:-0.08px;text-transform:uppercase;color:#121116}@media(max-width: 783px){.wpr-menuItem-title{display:none !important}}.wpr-menuItem-description{margin-top:2px;color:#72777c;font-size:0.8125rem;line-height:1.2307692308;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}@media(max-width: 783px){.wpr-menuItem-description{display:none}}.wpr-menuItem.wpr-subMenuItem{display:none;padding:10px 20px 8px 25px}@media(max-width: 783px){.wpr-menuItem.wpr-subMenuItem{padding:8px 20px 8px 23px;height:35px}}.wpr-menuItem.wpr-subMenuItem .wpr-menuItem-title{display:inline-block;font-size:0.8125rem;line-height:1.8461538462;text-transform:inherit;font-weight:600}.wpr-menuItem.wpr-subMenuItem:before{position:relative;display:inline-block;top:2px;right:2px;margin-right:8px;font-size:1rem;line-height:1}#wpr-nav-cache:before{right:20px}#wpr-nav-tools:before{right:20px}.wpr-sectionHeader{position:relative;border-bottom:1px solid #e0e4e9;padding-bottom:24px}.wpr-sectionHeader:before{content:"";position:absolute;display:block;width:48px;height:2px;bottom:-1px;left:0;background:#f56640}.wpr-sectionHeader .wpr-title1{line-height:48px}.wpr-sectionHeader .wpr-title1:before{display:inline-block;width:48px;height:48px;margin-right:24px;background:#fde0d9;color:#f56640;text-align:center;border-radius:3px}.wpr-sectionHeader-title{margin-top:8px;padding-left:72px}.wpr-sectionHeader-description{color:#666;margin-top:8px;padding-left:72px}.wpr-sectionHeader-logo{vertical-align:top;margin-right:24px}.wpr-optionHeader{position:relative;display:flex;justify-content:space-between;margin-top:48px;padding-bottom:9px;border-bottom:1px solid #e0e4e9}.wpr-optionHeader .wpr-title2{line-height:24px;color:#f56640;padding-right:40px}.wpr-optionHeader .wpr-infoAction{margin-right:8px}.wpr-optionHeader.wpr-isHidden{display:none}.wpr-fieldsContainer{margin-top:8px}.wpr-fieldsContainer-description{color:#666}.wpr-fieldsContainer-description a:hover,.wpr-fieldsContainer-description a:focus{color:#1eadbf}.wpr-fieldsContainer-fieldset{margin-top:16px;background:#f9fafb;padding:16px;border:1px solid #e8ebee;border-radius:2px}.wpr-fieldsContainer-fieldset--split{display:flex}.wpr-fieldsContainer-fieldset--split .wpr-field+.wpr-field{border:none}.wpr-fieldsContainer-fieldset--split .wpr-field{flex:0 0 50%;padding:0}.wpr-fieldsContainer-fieldset--split .wpr-field:first-child{padding-right:15px}.wpr-fieldsContainer-fieldset--split .wpr-field:last-child{padding-left:15px}.wpr-fieldsContainer-helper{margin-top:16px;color:#d60e5b;font-weight:500}.wpr-fieldsContainer-helper:before{position:relative;top:3px;font-size:1.125rem;line-height:1;margin-right:4px}.wpr-fieldsContainer.wpr-isHidden{display:none}.wpr-infoAction{position:relative;height:24px;font-size:0.8125rem;line-height:1.8461538462;vertical-align:middle;letter-spacing:-0.03em;font-weight:500;color:#666;white-space:nowrap;text-decoration:none;transition:all 200ms ease-out;-webkit-transition:all 200ms ease-out}.wpr-infoAction:before{position:absolute;margin-left:-26px;font-size:1.125rem;line-height:1.3333333333;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-infoAction--help{text-transform:uppercase;color:#02707f;font-weight:bold;font-size:0.75rem;line-height:2;letter-spacing:0}@media(max-width: 783px){.wpr-infoAction--help{display:none}}.wpr-infoAction--help:before{color:#1eadbf}.wpr-infoAction:hover,.wpr-infoAction:focus{color:#f56640;outline:none}.wpr-infoAction:hover:before,.wpr-infoAction:focus:before{color:#ffa58b}.wpr-button{position:relative;display:inline-block;width:auto;padding:8px 24px;text-align:center;background:#f56640;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);text-transform:uppercase;text-decoration:none;letter-spacing:-0.08px;font-weight:bold;border-radius:4px;color:#fff !important;white-space:nowrap;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:all 200ms ease-out;-webkit-transition:all 200ms ease-out;font-size:0.8125rem;line-height:1.5384615385}.wpr-button:hover,.wpr-button:focus{color:#fff !important;transform:translateY(-2px);box-shadow:0 7px 14px rgba(50,50,93,.25),0 3px 6px rgba(0,0,0,.2)}.wpr-button--small{padding:5px 0;letter-spacing:-0.08px;font-size:0.6875rem;line-height:1.8181818182}.wpr-button--icon{min-width:160px;padding-left:8px;padding-right:40px;text-align:left}.wpr-button--icon:before{position:absolute;right:8px;font-size:0.9375rem;line-height:1.3333333333}.wpr-button--fixed{position:fixed;display:flex;padding:8px 16px;right:24px;bottom:32px;border-radius:16px}.wpr-button--fixed:before{font-size:1.125rem;line-height:1;margin-right:8px}.wpr-button--purple{background:#2d1656}.wpr-button--blue{min-width:inherit;background:#1eadbf}.wpr-button--lightBlue{min-width:inherit;background:#40bacb}.wpr-button--red{background:#d33f49}.wpr-button--gray{background:#e0e4e9;color:#121116 !important}.wpr-button--gray:hover,.wpr-button--gray:active,.wpr-button--gray:focus{color:#121116 !important}.wpr-button--gray.radio-active{background:#2d1656 !important;color:#fff !important}.wpr-button--gray.radio-active:hover,.wpr-button--gray.radio-active:active,.wpr-button--gray.radio-active:focus{color:#fff !important}.wpr-button--blueDark{background:#02707f}.wpr-button:focus{outline:none;color:#fff !important}.wpr-field{padding:16px 0;transition:opacity 150ms ease-out;-webkit-transition:opacity 150ms ease-out}.wpr-field+.wpr-field,.wpr-field+.wpr-warningContainer{border-top:1px solid #e0e4e9}.wpr-field:first-child{padding-top:0}.wpr-field:last-child{padding-bottom:0}.wpr-field-description{margin-top:4px;color:#666;font-size:0.8125rem;line-height:1.5384615385}.wpr-field-description .wpr-js-popin{color:#444;text-decoration:underline}.wpr-field-description .wpr-js-popin:hover,.wpr-field-description .wpr-js-popin:focus{color:#1eadbf}.wpr-field-description a:hover,.wpr-field-description a:focus{color:#1eadbf}.wpr-field-description-helper{color:#00a66b}.wpr-field-description-label{font-size:0.875rem;line-height:1.4285714286;font-weight:500;color:#666}.wpr-field-list{margin:0;color:#666;font-weight:500}.wpr-field-list li+li{margin-top:16px}.wpr-field-list li:before{position:relative;top:3px;margin-right:8px;color:#02707f;font-size:1.125rem;line-height:1.1111111111}.wpr-field-list a{text-decoration:none}.wpr-field-list a:hover,.wpr-field-list a:focus{color:#1eadbf}.wpr-field-betweenText{margin:0 16px;font-weight:bold}.wpr-field .wpr-button{margin:8px 0}.wpr-field .wpr-flex{display:flex;justify-content:space-between;align-items:center}@media(max-width: 783px){.wpr-field .wpr-flex{text-align:left;flex-direction:column}}.wpr-field .wpr-flex--egal>div{flex:0 0 50%}@media(max-width: 783px){.wpr-field .wpr-flex--egal>div{width:100%}}.wpr-field .wpr-flex--egal>div:last-child{text-align:right}@media(max-width: 783px){.wpr-field .wpr-flex--egal>div:last-child{text-align:left}}.wpr-field .wpr-flex--egal>div .wpr-field-description{font-style:normal;color:#666}.wpr-field p{margin-bottom:0}.wpr-field label{font-weight:500}.wpr-field h4{font-size:0.875rem;line-height:1.7142857143}.wpr-field.wpr-isDisabled{opacity:.55}.wpr-field.wpr-isParent{padding-bottom:0;margin-bottom:16px}.wpr-field.wpr-Delayjs{margin-top:16px}.wpr-field.wpr-RemoveUnUsedCss{margin-bottom:0}.wpr-field.wpr-NoPaddingBottom{padding-bottom:0}.wpr-field.wpr-isLastElem{margin-top:16px}.wpr-field.wpr-isHidden{display:none}.wpr-field .wpr-isHidden{display:none}.wpr-field--children{display:none;padding-left:32px}.wpr-field--children.wpr-isOpen{display:block}.wpr-field--children.wpr-field--textarea{padding-right:80px}@media(max-width: 1239px){.wpr-field--children.wpr-field--textarea{padding-right:32px}}@media(max-width: 783px){.wpr-field--children.wpr-field--textarea{padding-right:0}}.wpr-field--children.no-space{padding-left:0}.wpr-field--checkbox .wpr-field-description{margin-left:32px}.wpr-field--radio{padding:24px 16px}.wpr-field--radio:first-child{padding-top:8px}.wpr-field--radio:last-child{padding-bottom:8px}.wpr-field--radio .wpr-field-description{margin-left:88px}.wpr-field--radio .wpr-field-description button{color:#666}.wpr-field--split{display:inline-block;width:50%;padding-right:16px;padding-bottom:0}.wpr-field--split+.wpr-field--split{padding-left:16px;padding-right:0}.wpr-field--split+.wpr-field--split:nth-child(2){padding-top:0;border-top:none}.wpr-field--cache .wpr-field--number,.wpr-field--cache .wpr-field--select{display:inline-block;padding-top:0;width:auto;padding-bottom:0;font-weight:bold}.wpr-field--cache .wpr-field--select{position:relative;padding-left:8px;top:-2px;border-top:none}.wpr-field--cache .wpr-field--number .wpr-text input[type=number]{background:#f2f3f6;height:35px;border:1px solid #e0e4e9;font-family:inherit;font-size:1em}.wpr-field--cache .wpr-field-description{margin:8px 0;color:#00a66b}.wpr-field--cache .wpr-field-description-label{color:#121116}.wpr-field--textarea .wpr-field-description pre{background:rgba(0,0,0,.07);padding:1em;margin:1em 0 0;white-space:normal}.wpr-field--textarea .wpr-field-description pre code{background:transparent;-webkit-touch-callout:all;-webkit-user-select:all;-khtml-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;color:#121116}.wpr-fieldWarning{display:none;position:relative;padding:16px 16px 24px 56px;background:#19073b;margin:8px 0 0;color:#fff}.wpr-fieldWarning.wpr-isOpen{display:block}.wpr-fieldWarning:after{content:"";position:absolute;display:block;top:-8px;left:20px;width:0;height:0;border-style:solid;border-width:0 12px 8px 12px;border-color:transparent transparent #19073b transparent}.wpr-fieldWarning:before{content:"";position:absolute;display:block;width:calc(100% + 32px);height:100%;top:0;left:-16px;background:#19073b}.wpr-fieldWarning-title{position:relative;color:#f56640;font-size:0.875rem;line-height:1.4285714286;font-weight:bold}.wpr-fieldWarning-title:before{position:absolute;left:-36px;font-size:1.5rem;line-height:.8333333333}.wpr-fieldWarning-description{position:relative;margin-top:8px}.wpr-fieldWarning .wpr-button{margin-top:16px}.wpr-fieldWarning.wpr-radio-warning{margin-left:-32px}.wpr-fieldWarning.wpr-radio-warning:after{left:40px}.wpr-warningContainer+.wpr-warningContainer,.wpr-warningContainer+.wpr-field,.wpr-field+.wpr-warningContainer{border-top:1px solid #e0e4e9;padding-top:16px}.wpr-warningContainer+.wpr-warningContainer,.wpr-field+.wpr-warningContainer{padding-bottom:16px}@media only screen and (max-width: 400px){.wpr-fieldWarning.wpr-radio-warning{margin-left:-32px}.wpr-fieldWarning.wpr-radio-warning .wpr-button{white-space:normal;padding-right:32px}}@media only screen and (max-width: 350px){.wpr-radio-buttons{padding-left:24px}.wpr-fieldWarning.wpr-radio-warning{margin-left:-24px;padding-left:30px;padding-right:0}.wpr-fieldWarning.wpr-radio-warning .wpr-button{padding-right:24px}}.wpr-documentation{padding:24px 16px;border-radius:4px;color:#fff;text-align:center;background:#40bacb}.wpr-documentation p{margin:8px 0 16px;font-weight:500}.wpr-documentation i{display:block;font-size:2.25rem;line-height:1;margin-bottom:8px}.wpr-documentation .wpr-button{padding-left:16px;padding-right:16px}.wpr-addon{padding:24px 0}.wpr-addon .wpr-flex{align-items:flex-start}@media(max-width: 783px){.wpr-addon .wpr-flex{align-items:center}}.wpr-addon .wpr-flex>div{text-align:left}.wpr-addon .wpr-addon-title{margin-bottom:16px;font-weight:500}.wpr-addon .wpr-field-description{font-style:normal}.wpr-addon .wpr-field-helper{font-size:0.8125rem;line-height:1.5384615385;color:#666;background-color:#e0e4e9;padding:8px;margin:8px 0}.wpr-addon .wpr-field-helper span.wpr-helper-title{font-weight:600}.wpr-addon .wpr-field-helper span.wpr-helper-title::after{content:"\a";white-space:pre}.wpr-addon .wpr-addon-logo{text-align:center;flex:0 0 160px}@media(max-width: 1239px){.wpr-addon .wpr-addon-logo{max-width:100px}.wpr-addon .wpr-addon-logo img{width:100%;height:auto}}@media(max-width: 1083px){.wpr-addon .wpr-addon-logo{max-width:160px}}@media(max-width: 783px){.wpr-addon .wpr-addon-logo{flex:0 0 auto;margin-bottom:16px}}.wpr-addon .wpr-addon-text{margin-left:32px;flex:1 1 auto}@media(max-width: 1239px){.wpr-addon .wpr-addon-text{margin-left:16px}}@media(max-width: 1083px){.wpr-addon .wpr-addon-text{margin-left:32px}}@media(max-width: 783px){.wpr-addon .wpr-addon-text{margin-left:0}}.wpr-addon .wpr-addon-text a{display:inline-block;margin-top:24px}.wpr-addon .wpr-addon-text .button{margin-top:24px}.wpr-addon .wpr-addon-text .wpr-add-on-helper{font-weight:normal;color:#1eadbf}.wpr-addon .wpr-addon-text .wpr-add-on-helper a{margin-top:0}.wpr-webp-addon .wpr-addon .wpr-addon-text a{margin-top:0px}.notice-wpr-warning{background:#ffd147;display:flex;flex-flow:row wrap;align-items:center;margin-top:16px;padding:8px 32px;border:0}.notice-wpr-warning p:first-child{font-size:1rem;line-height:1.125;margin-left:80px}.notice-wpr-warning p:first-child::before{content:url(../img/warning.svg);display:inline-block;height:48px;width:63px;margin-right:17px;vertical-align:middle;margin-left:-80px}@media(max-width: 1239px){.notice-wpr-warning p:first-child::before{margin-bottom:-30px}}.notice-wpr-warning p:last-child{margin-left:63px;flex-basis:100%;align-items:center;justify-content:flex-start;display:flex}@media(max-width: 783px){.notice-wpr-warning p:last-child{align-content:center;flex-direction:column;margin-left:0}}.notice-wpr-warning p:last-child a{margin:0 16px}@media(max-width: 783px){.notice-wpr-warning p:last-child a{margin:8px 16px}}.notice-wpr-warning p:last-child a:first-child{display:block;background:#172153;border-radius:44px;color:#fff;font-size:1rem;line-height:1.125;font-weight:bold;padding:16px 24px;text-decoration:none}.notice-wpr-warning p:last-child a:first-child:hover,.notice-wpr-warning p:last-child a:first-child:active,.notice-wpr-warning p:last-child a:first-child:focus{color:#fff}.notice-wpr-warning p:last-child a:first-child::after{content:"→";font-weight:normal;margin-left:8px}.wpr-notice{position:relative;color:#444;background:#ebfaf5 url("../img/bg-activated.svg") no-repeat 90% bottom;background-size:350px;margin-top:24px;border-radius:4px;overflow:hidden}.wpr-notice-container{padding:24px 25% 24px 40px}.wpr-notice-supTitle{font-size:1rem;line-height:1.375;font-weight:bold}.wpr-notice-title{font-size:1.5rem;line-height:1.3333333333;color:#3ece9d;margin-top:16px;font-weight:bold}.wpr-notice-description{font-size:0.875rem;line-height:1.5714285714;margin:16px 0 24px}.wpr-notice-continue{color:#666}.wpr-notice-close{position:absolute;top:24px;right:24px;color:#666;text-decoration:none;font-size:1.5rem;line-height:1;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-notice-close:hover{color:#444}.wpr-notice-close:focus{outline:none}.wpr-tools{position:relative;display:flex;flex-direction:row;padding:32px 0}@media(max-width: 1239px){.wpr-tools{flex-direction:column}}@media(max-width: 1083px){.wpr-tools{flex-direction:row}}@media(max-width: 783px){.wpr-tools{flex-direction:column}}.wpr-tools:nth-child(2){margin-top:16px}.wpr-tools+.wpr-tools{border-top:1px solid #e0e4e9}.wpr-tools-label{display:block}.wpr-tools-label:before{position:absolute;left:0;margin-top:5px;font-size:2.25rem;line-height:1;color:#f56640}@media(max-width: 783px){.wpr-tools-label:before{display:block;position:initial}}.wpr-tools-col{flex:1 1 auto}.wpr-tools-col:first-child{padding-left:72px;padding-right:24px;min-width:340px}@media(max-width: 783px){.wpr-tools-col:first-child{padding-left:0;padding-right:0;min-width:auto}}.wpr-tools-col:last-child{text-align:right}@media(max-width: 783px){.wpr-tools-col:last-child{text-align:left}}.wpr-tools .wpr-button{margin-top:24px;white-space:normal}.wpr-tools .wpr-field-description{font-style:normal;color:#666}.wpr-tools #wpr-update-exclusion-msg{min-height:20px}.wpr-imagify{display:flex;justify-content:space-between;flex-wrap:wrap;margin-top:30px}.wpr-imagify-description{width:40%;padding-right:60px}@media(max-width: 1239px){.wpr-imagify-description{width:auto;padding-right:0}}.wpr-imagify-screenshot{width:60%}@media(max-width: 1239px){.wpr-imagify-screenshot{margin-top:60px;width:auto}}.wpr-imagify-screenshot img{max-width:100%;height:auto}.wpr-imagify-more,.wpr-imagify-name{color:#00a8dc;font-weight:700;margin-bottom:0}.wpr-imagify-more::before{content:"✓";color:#000;font-size:2rem;margin-right:5px}.wpr-imagify p{font-size:1rem}.wpr-imagify p:first-child{margin-top:0}.wpr-imagify ul{margin-top:40px}.wpr-imagify li{display:flex;align-items:flex-start;margin-bottom:35px}.wpr-imagify li:before{width:24px;height:24px;margin-right:10px;flex-shrink:0}.wpr-imagify li .text{flex-grow:1;display:inline-block}.wpr-imagify a{text-decoration:none}.wpr-imagify a:hover{color:#00a8dc}.wpr-imagify .button-primary{background:#2abb9b;border:1px solid #bebebe;box-shadow:none;font-size:1rem;font-weight:700;height:auto;line-height:1;margin-top:60px;padding:20px 45px;text-shadow:none;text-transform:uppercase}.wpr-imagify-plugin-tile{display:flex;align-items:center;width:100%;padding:20px;background-color:#f9fafb;margin-top:20px;border:1px solid #ebe9e9}.wpr-imagify-plugin-tile-info{margin-left:20px}.wpr-imagify-plugin-tile-info .wpr-star-rating{display:flex;align-items:center}.wpr-imagify-plugin-tile-info .star-rating .star{font-size:16px;width:16px;height:13px}.wpr-imagify-plugin-tile-info .num-ratings{font-size:13px;margin-left:10px}.wpr-imagify-plugin-tile-title{margin-bottom:5px}.wpr-imagify-plugin-tile .wpr-button{margin-left:auto}.wpr-imagify-plugin-tile .wpr-button:before{margin-right:5px}.wpr-tutorials-section{display:flex;flex-flow:row wrap}div.wpr-tutorial-item{width:32%;margin-bottom:10px;margin-right:1%}.wpr-tutorial-link{cursor:pointer;transition:color 200ms ease-out}.wpr-tutorial-link:hover{color:#1eadbf}@media(max-width: 1083px){div.wpr-tutorial-item{width:48%}}@media(max-width: 783px){div.wpr-tutorial-item{width:100%}}.wpr-rocketcdn-modal{display:none}.wpr-rocketcdn-modal.is-open{display:block}.wpr-rocketcdn-modal__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);display:flex;justify-content:center;align-items:center}.wpr-rocketcdn-modal__container{max-width:674px;max-height:100vh;overflow-y:auto;box-sizing:border-box}.wpr-rocketcdn-modal iframe{max-width:100%}.wpr-checkbox{position:relative;padding-left:32px}.wpr-checkbox label{user-select:none}.wpr-checkbox [type=checkbox]:not(:checked),.wpr-checkbox [type=checkbox]:checked{position:absolute;left:-9999px}.wpr-checkbox [type=checkbox]:not(:checked)+label:before,.wpr-checkbox [type=checkbox]:checked+label:before{content:"";position:absolute;left:0;top:4px;width:14px;height:14px;border:2px solid #444;border-radius:3px;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-checkbox [type=checkbox]:not(:checked)+label:after,.wpr-checkbox [type=checkbox]:checked+label:after{content:"";position:absolute;top:5px;left:2px;color:#fff;font-family:"wpr-icomoon";speak:none;font-size:0.875rem;line-height:1.2857142857;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-checkbox [type=checkbox]:not(:checked)+label:after{opacity:0;transform:scale(2)}.wpr-checkbox [type=checkbox]:checked+label:after{opacity:1;transform:scale(1)}.wpr-checkbox [type=checkbox]:checked+label:before{background:#19073b;border-color:#19073b}.wpr-checkbox [type=checkbox]:checked:focus+label:before{background:#665090;border:2px dotted #665090}.wpr-checkbox [type=checkbox]:focus+label:before{border:2px dotted #444}.wpr-checkbox-warning{color:#d33f49;margin-left:16px}.wpr-checkbox-warning::before{margin-right:8px}.wpr-radio{position:relative;padding-left:88px}.wpr-radio label{user-select:none;font-weight:bold}.wpr-radio [type=checkbox]:not(:checked),.wpr-radio [type=checkbox]:checked{position:absolute;left:-9999px}.wpr-radio [type=checkbox]:not(:checked)+label:before,.wpr-radio [type=checkbox]:checked+label:before,.wpr-radio [type=checkbox]:not(:checked)+label:after,.wpr-radio [type=checkbox]:checked+label:after{content:"";position:absolute}.wpr-radio [type=checkbox]:not(:checked)+label:before,.wpr-radio [type=checkbox]:checked+label:before{left:0;width:52px;height:22px;background:#fff;border-radius:12px;border:1px solid #444;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-radio [type=checkbox]:not(:checked)+label:after,.wpr-radio [type=checkbox]:checked+label:after{width:18px;height:18px;border-radius:100%;background:#444;top:3px;left:3px;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-radio [type=checkbox]:disabled+label:after,.wpr-radio [type=checkbox]:disabled+label:after{background:#e0e4e9}.wpr-radio [type=checkbox]:disabled+label:before,.wpr-radio [type=checkbox]:disabled+label:before{border:1px solid #e0e4e9}.wpr-radio [type=checkbox]:checked+label:before{border-color:#1eadbf}.wpr-radio [type=checkbox]:checked+label:after{background:#1eadbf;left:33px}.wpr-radio [type=checkbox]:checked+label .wpr-radio-ui,.wpr-radio [type=checkbox]:not(:checked)+label .wpr-radio-ui:before,.wpr-radio [type=checkbox]:checked+label .wpr-radio-ui:after{position:absolute;left:4px;width:52px;text-transform:uppercase;letter-spacing:-0.01em;font-weight:bold;font-size:0.6875rem;line-height:2.1818181818;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-radio [type=checkbox]:not(:checked)+label .wpr-radio-ui:before{content:attr(data-l10n-inactive);left:27px;color:#666}.wpr-radio [type=checkbox]:checked+label .wpr-radio-ui:after{content:attr(data-l10n-active);color:#02707f}.wpr-radio--reverse{padding-right:72px;padding-left:0}.wpr-radio--reverse [type=checkbox]:not(:checked)+label:before,.wpr-radio--reverse [type=checkbox]:checked+label:before{right:0;left:inherit}.wpr-radio--reverse [type=checkbox]:not(:checked)+label:after,.wpr-radio--reverse [type=checkbox]:checked+label:after{right:33px;left:inherit}.wpr-radio--reverse [type=checkbox]:checked+label:after{right:3px;left:inherit}.wpr-radio--reverse [type=checkbox]:checked+label .wpr-radio-ui,.wpr-radio--reverse [type=checkbox]:not(:checked)+label .wpr-radio-ui:before,.wpr-radio--reverse [type=checkbox]:checked+label .wpr-radio-ui:after{right:-2px;left:inherit}.wpr-radio--reverse [type=checkbox]:not(:checked)+label .wpr-radio-ui:before{right:-25px;left:inherit}.wpr-radio [type=checkbox]:not(:checked):focus+label:before{border:1px dashed #444}.wpr-radio [type=checkbox]:checked:focus+label:before{border:1px dashed #1eadbf}.wpr-radio--tips [type=checkbox]:checked+label:before{border-color:#3ece9d}.wpr-radio--tips [type=checkbox]:checked+label:after{background:#3ece9d}.wpr-radio--tips [type=checkbox]:checked+label .wpr-radio-ui:after{color:#00a66b}.wpr-radio--tips [type=checkbox]:checked:focus+label:before{border:1px dashed #3ece9d}.wpr-select{position:relative}.wpr-select select{margin:0;padding:0 8px;height:36px;border:1px solid #e0e4e9;background:#f2f3f6;color:#121116;box-shadow:none;border-radius:0;letter-spacing:.011em}.wpr-select select:focus{outline:none;border-color:#444;box-shadow:none}.wpr-select select:disabled{background-image:none}.wpr-select label{font-weight:bold;margin-left:8px}.wpr-textarea{margin-top:8px}.wpr-textarea textarea{padding:8px;width:100%;height:100px;font-family:Monaco;color:#121116;background:#fff;border:2px solid #c2cad4;border-radius:3px;font-size:0.8125rem;line-height:1.2307692308;transition:border 200ms ease-out;-webkit-transition:border 200ms ease-out}.wpr-textarea textarea:focus{outline:none;border-color:#444;box-shadow:none}.wpr-textarea+.wpr-field-description{color:#00a66b}.wpr-text label{color:#666}.wpr-text input[type=text],.wpr-text input[type=number]{margin-top:8px;padding:0 8px;width:100%;height:32px;color:#121116;background:#fff;border:2px solid #c2cad4;border-radius:3px;font-family:Monaco;font-size:0.75rem;line-height:1.3333333333;transition:border 200ms ease-out;-webkit-transition:border 200ms ease-out}.wpr-text input[type=text]:focus,.wpr-text input[type=number]:focus{outline:none;border-color:#444;box-shadow:none}.wpr-text input[type=text].wpr-isError,.wpr-text input[type=number].wpr-isError{border-color:#d33f49}.wpr-text input[type=number]{width:80px}.wpr-text--number label{margin-right:8px}.wpr-upload input[type=file]{display:block;width:252px;margin:8px 8px 8px 0;padding:8px;border:1px solid #e0e4e9;background:#f2f3f6;color:#121116;font-size:0.6875rem;line-height:1.4545454545}.wpr-upload input[type=file]:focus{outline:none;border-color:#444;box-shadow:none}.wpr-multiple{display:flex;align-items:center;flex-wrap:wrap}@media(max-width: 783px){.wpr-multiple{align-items:center;flex-direction:column}}.wpr-multiple .wpr-text{flex:1 1 auto;position:relative;top:-2px}@media(max-width: 783px){.wpr-multiple .wpr-text{width:100%}}.wpr-multiple .wpr-button{margin-left:16px;width:auto;min-width:inherit;padding-right:30px}@media(max-width: 783px){.wpr-multiple .wpr-button{margin-left:0}}.wpr-multiple input[type=text]{flex-grow:2}.wpr-multiple select{height:30px}.wpr-multiple-default{margin-right:20px}.wpr-multiple-list{display:none;padding:8px 0;margin:16px 0 0;background:#f2f3f6;border-radius:2px}.wpr-multiple-list li{margin-bottom:0;padding:4px 16px;font-size:0.8125rem;line-height:1.2307692308;font-family:Monaco}.wpr-multiple-list li span{display:inline-block;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-multiple-close{position:relative;top:3px;font-size:1rem;line-height:1;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-multiple-close:focus{outline:none}.wpr-multiple-close:hover,.wpr-multiple-close:focus{color:#d33f49}.wpr-multiple-close:hover+span,.wpr-multiple-close:focus+span{color:#d33f49}.wpr-multiple-select .wpr-list{border:2px solid #c2cad4;background-color:#fff;border-radius:5px;padding:10px;margin:8px 0}.wpr-multiple-select .wpr-list .wpr-list-header{display:flex;justify-content:space-between}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-multiple-select-exclude_js_ads:before{font-family:"wpr-icomoon";content:"";padding-right:8px}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-multiple-select-exclude_js_plugins:before{font-family:"wpr-icomoon";content:"";padding-right:8px}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-multiple-select-exclude_js_themes:before{font-family:"wpr-icomoon";content:"";padding-right:8px}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-list-header-arrow{width:15px;cursor:pointer;display:flex;transform:rotate(180deg)}.wpr-multiple-select .wpr-list .wpr-list-header h3{font-weight:500;color:#121116;font-size:0.875rem;line-height:1.5}.wpr-multiple-select .wpr-list .wpr-list-body{display:none}.wpr-multiple-select .wpr-list .wpr-list-body li{padding-left:30px}.wpr-multiple-select .wpr-list .wpr-list-body li .wpr-checkbox img{width:15px}.wpr-multiple-select .wpr-list.open .wpr-list-body{display:block}.wpr-multiple-select .wpr-list.open .wpr-list-body .wpr-checkbox label{color:#72777c}.wpr-multiple-select .wpr-list.open .wpr-list-body .wpr-checkbox input[checked=checked]+label{color:#121116}.wpr-multiple-select .wpr-list.open .wpr-list-header{border-bottom:1px solid #c2cad4;margin-bottom:10px;padding-bottom:5px}.wpr-multiple-select .wpr-list.open .wpr-list-header-arrow{transform:rotate(0deg)}.wpr-field--categorizedmultiselect .wpr-list{padding-right:15px;padding-left:15px}.wpr-field--categorizedmultiselect .wpr-list.open .wpr-list-header{padding-bottom:9px;margin-bottom:10px}.wpr-field--categorizedmultiselect .wpr-list.open .wpr-list-header{max-height:32px}.wpr-field--categorizedmultiselect .wpr-list .wpr-list-header{max-height:32px}.wpr-field--categorizedmultiselect .wpr-list [type=checkbox]+label:before{top:4px}.wpr-field--categorizedmultiselect .wpr-list [type=checkbox]:checked+label:after{top:4px}.wpr-field--categorizedmultiselect .wpr-list-header .wpr-checkbox{padding-left:29px}.wpr-field--categorizedmultiselect .wpr-list-body{display:block;max-height:250px;overflow-y:auto}.wpr-field--categorizedmultiselect .wpr-list-body ul{margin:0}.wpr-field--categorizedmultiselect .wpr-list-body ul li{margin-bottom:10px}.wpr-field--categorizedmultiselect .wpr-list-body ul li .wpr-checkbox{padding-left:25px}.wpr-field--categorizedmultiselect .wpr-list-body ul li .wpr-checkbox label{color:#121116 !important;font-weight:normal}.wpr-field--categorizedmultiselect .dashicons{color:#72777c}.wpr-field--categorizedmultiselect .wpr-multiple-select-title{font-weight:bold;margin-left:5px}@media only screen and (min-width: 782px){.wpr-field--categorizedmultiselect{padding-right:80px}} \ No newline at end of file +h1,h2,h3,h4{color:currentColor;margin:0;font-weight:normal}button{padding:0;border:none;background:none;cursor:pointer}a{color:currentColor;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}a:hover{color:currentColor}input[type=submit]{cursor:pointer;border:none}a:active,button:active{outline:none}a:focus,button:focus{color:currentColor;box-shadow:none}.wpr-wrap{padding:16px;margin:0 0 0 -20px}@media(max-width: 783px){.wpr-wrap{padding:0;margin:0 0 0 -10px}}.wpr-body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-ms-interpolation-mode:nearest-neighbor;image-rendering:optimizeQuality;text-rendering:optimizeLegibility;display:flex;color:#121116;font-size:0.875rem;line-height:1.5}.wpr-body *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media(max-width: 783px){#hs-beacon{display:none !important}}.wpr-u-flex{display:flex;align-items:center;justify-content:center}.wpr-mt-2{margin-top:20px}.wpr-fs-sm{font-size:.9em}.wpr-fs-md{font-size:1em}@font-face{font-family:"wpr-icomoon";src:url("../fonts/icomoon.eot");src:url("../fonts/icomoon.eot?#iefix") format("embedded-opentype"),url("../fonts/icomoon.woff") format("woff"),url("../fonts/icomoon.ttf") format("truetype"),url("../fonts/icomoon.svg#icomoon") format("svg");font-weight:normal;font-style:normal}[class^=wpr-icon-]:before,[class*=" wpr-icon-"]:after,[class^=wpr-icon-]:after,[class*=" wpr-icon-"]:before,[id^=wpr-nav-]:before,[id*=" wpr-nav-"]:after,[id^=wpr-nav-]:after,[id*=" wpr-nav-"]:before{font-family:"wpr-icomoon";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class^=wpr-icon-] span.hidden,[class*=" wpr-icon-"] span.hidden{display:inline-block;height:0;width:0;overflow:hidden}.wpr-icon-chevron-right:before{content:""}.wpr-icon-chevron-left:before{content:"";transform:rotate(180deg)}.wpr-icon-chevron-down:before{content:"";transform:scale(0.6)}.wpr-icon-chevron-up:before{content:"";top:50%;transform:translateY(-50%) scale(0.6)}.wpr-icon-rollback:before{content:""}.wpr-icon-addon:before,.wpr-addonSubMenuItem:before{content:""}.wpr-icon-addons:before,#wpr-nav-addons:before{content:""}.wpr-icon-book:before{content:""}.wpr-icon-cdn:before,#wpr-nav-page_cdn:before{content:""}.wpr-icon-database:before,#wpr-nav-database:before{content:""}.wpr-icon-export:before{content:""}.wpr-icon-files:before,#wpr-nav-cache:before{content:""}.wpr-icon-help:before{content:""}.wpr-icon-home:before,#wpr-nav-dashboard:before{content:""}.wpr-icon-import:before{content:""}.wpr-icon-important:before{content:""}.wpr-icon-information:before{content:""}.wpr-icon-information2:before{content:""}.wpr-icon-interrogation:before{content:""}.wpr-icon-media:before,#wpr-nav-media:before{content:""}.wpr-icon-plus:before{content:""}.wpr-icon-refresh:before,#wpr-nav-preload:before{content:""}.wpr-icon-rules:before,#wpr-nav-advanced_cache:before{content:""}.wpr-icon-stack:before,#wpr-nav-file_optimization:before{content:""}.wpr-icon-tools:before,#wpr-nav-tools:before{content:""}.wpr-icon-trash:before{content:""}.wpr-icon-user:before{content:""}.wpr-icon-check:before{content:""}.wpr-icon-check2:before{content:""}.wpr-icon-close:before{content:""}.wpr-icon-heartbeat:before,#wpr-nav-heartbeat:before{content:url("../img/heartbeat.svg")}.wpr-icon-heartbeat-hover:before,#wpr-nav-heartbeat.isActive:before,#wpr-nav-heartbeat:hover:before{content:url("../img/heartbeat-hover.svg")}.wpr-icon-imagify:before,#wpr-nav-imagify:before{content:url("../img/imagify.svg")}.wpr-icon-imagify-hover:before,#wpr-nav-imagify.isActive:before,#wpr-nav-imagify:hover:before{content:url("../img/imagify-hover.svg")}.wpr-icon-tutorial:before,#wpr-nav-tutorials:before{content:url("../img/play.svg")}.wpr-icon-tutorial-hover:before,#wpr-nav-tutorials.isActive:before,#wpr-nav-tutorials:hover:before{content:url("../img/play-hover.svg")}.wpr-icon-tutorial-alt:before{content:url("../img/play-alt.svg")}.wpr-imagify-info:before{content:url("../img/imagify-info.svg")}.wpr-imagify-install:before{content:url("../img/imagify-install.svg")}.wpr-title1{font-size:1.625rem;line-height:1;font-weight:600;letter-spacing:.01em}.wpr-title2{font-size:1rem;line-height:1.5;font-weight:bold;letter-spacing:-0.02em}.wpr-title3,.wpr-select label,.wpr-select select,.wpr-field--radio label{font-size:0.875rem;line-height:1.7142857143;font-weight:bold;letter-spacing:-0.011em}.wpr-Header{display:flex;flex-direction:column;flex:0 0 225px}@media(max-width: 783px){.wpr-Header{flex:0 0 50px}}.wpr-Header-logo{padding:32px 0 24px;text-align:center}@media(max-width: 783px){.wpr-Header-logo{padding:16px 0 8px}}@media(max-width: 783px){.wpr-Header-logo-desktop{display:none}}.wpr-Header-logo-mobile{display:none}@media(max-width: 783px){.wpr-Header-logo-mobile{display:inline-block}}.wpr-Header-footer{margin-top:auto;padding:48px 20px 0;font-size:0.6875rem;line-height:4.3636363636;color:#666;opacity:.6;font-weight:bold}@media(max-width: 783px){.wpr-Header-footer{display:none}}.wpr-Sidebar{position:relative;display:none;flex:0 0 290px;padding:24px 16px}@media(max-width: 1239px){.wpr-Sidebar{flex:0 0 260px}}@media(max-width: 1083px){.wpr-Sidebar{display:none !important}}.wpr-Sidebar-title{margin-bottom:32px}.wpr-Sidebar-notice{padding:8px 16px;margin-bottom:16px;background:#fff;border:1px solid #e8ebee;border-left:2px solid #1eadbf;border-radius:0 3px 3px 0;color:#666}.wpr-Sidebar-notice p{margin:0}.wpr-Sidebar-notice-link{display:inline-block;margin-top:8px;font-size:0.6875rem;line-height:1.8181818182;color:#02707f;letter-spacing:-0.05em;text-transform:uppercase;text-decoration:none;font-weight:bold}.wpr-Sidebar-notice-link:hover,.wpr-Sidebar-notice-link:focus{color:#40bacb}.wpr-Sidebar-info{padding:16px;background:#ebfaf5;margin-bottom:16px;border-radius:3px}.wpr-Sidebar-info h4{padding-left:48px;font-weight:500}.wpr-Sidebar-info p{margin:8px 0 0;font-size:0.6875rem;line-height:1.4545454545;color:#666}.wpr-Sidebar-info i{position:absolute;display:block;margin-top:-1px;width:40px;height:40px;color:#00a66b;font-size:1.0625rem;line-height:2.3529411765;background:#c6f0de;border-radius:3px;text-align:center}.wpr-Content{position:relative;background:#fff;padding:32px 24px;flex:1 1 auto;max-width:1230px}@media(max-width: 783px){.wpr-Content{padding:24px 16px}}.wpr-Content form>input:last-child{margin-top:24px;color:#fff !important}.wpr-Content.isNotFull{max-width:960px}.wpr-Content-tips{position:absolute;top:48px;right:24px;font-weight:bold;color:#666}@media(max-width: 1083px){.wpr-Content-tips{display:none !important}}.wpr-Page{margin-bottom:32px}.wpr-Page-row{display:flex;flex-direction:row}@media(max-width: 1239px){.wpr-Page-row{flex-direction:column}}.wpr-Page-col{flex:1 1 auto}.wpr-Page-col--fixed{margin-left:24px;flex:0 0 325px}@media(max-width: 1239px){.wpr-Page-col--fixed{margin-left:0}}.wpr-Page#dashboard #wpr-action-refresh_account:before{transition:all 200ms ease-out;opacity:1;transform:translateY(0)}.wpr-Page#dashboard #wpr-action-refresh_account.wpr-isLoading:before{animation:loading 1.2s infinite}.wpr-Page#dashboard #wpr-action-refresh_account.wpr-isHidden:before{opacity:0}.wpr-Page#dashboard #wpr-action-refresh_account.wpr-isShown:before{opacity:1}@keyframes loading{from{transform:rotate(0)}to{transform:rotate(360deg)}}.wpr-Page#dashboard .wpr-documentation{margin-top:98px;padding:43px 16px}@media(max-width: 1239px){.wpr-Page#dashboard .wpr-documentation{margin-top:40px}}.wpr-Page#dashboard .wpr-documentation .wpr-button{margin-top:8px}.wpr-Page#dashboard .wpr-documentation i{font-size:3.375rem;line-height:1}.wpr-Page#dashboard .wpr-radio{padding-left:72px}.wpr-Page#dashboard .wpr-field--radio{padding:16px 8px}.wpr-Page#dashboard .wpr-field--radio:first-child{padding-top:0}.wpr-Page#dashboard .wpr-field--radio:last-child{padding-bottom:0}.wpr-Page#dashboard .wpr-field--radio .wpr-field-description{font-style:normal;color:#666;margin-left:72px}.wpr-Page#dashboard .wpr-field-account{padding-bottom:0}.wpr-Page#dashboard .wpr-infoAccount{font-weight:bold;margin-left:8px;color:#444}.wpr-Page#dashboard .wpr-infoAccount:before{content:"";position:relative;display:inline-block;width:13px;height:13px;background:#e0e4e9;border-radius:50%;color:#fff;margin-right:6px;text-align:center;top:2px;font-size:0.5rem;line-height:1.625}.wpr-Page#dashboard .wpr-infoAccount.wpr-isValid{color:#00a66b}.wpr-Page#dashboard .wpr-infoAccount.wpr-isValid:before{content:"";font-family:"wpr-icomoon";speak:none;background:#3ece9d;top:-1px}.wpr-Page#dashboard .wpr-infoAccount.wpr-isInvalid{color:#d60e5b}.wpr-Page#dashboard .wpr-infoAccount.wpr-isInvalid:before{content:"!";font-weight:bold;font-size:0.625rem;line-height:1.3;speak:none;background:#d33f49;top:-1px}.wpr-Page#dashboard #wpr-account-data:before{content:none}.wpr-Page#tools #wpr-action-rocket_enable_mobile_cpcss:before{transition:all 200ms ease-out;opacity:1;transform:translateY(0)}.wpr-Page#tools #wpr-action-rocket_enable_mobile_cpcss.wpr-isLoading:before{animation:loading 1.2s infinite}.wpr-Popin{display:none;position:fixed;width:772px;height:auto;top:50%;left:50%;background:#fff;border-radius:3px;transform:translateX(-50%) translateY(-50%);z-index:100000}.wpr-Popin-overlay{display:none;position:fixed;opacity:0;width:100%;height:100%;top:0;left:0;background:rgba(0,0,0,.8);z-index:99999}.wpr-Popin-header{display:flex;align-items:center;justify-content:space-between;height:64px;padding:0 32px;background:#2d1656;color:#fff;font-weight:600}.wpr-Popin-close{color:#665090;font-size:1.5rem;line-height:1;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-Popin-close:hover,.wpr-Popin-close:focus{color:#fff;outline:none}.wpr-Popin-content{padding:8px 32px;color:#666}.wpr-Popin-flex{display:flex;flex-direction:row;align-items:center}.wpr-Popin-flex div{margin-left:32px}.wpr-Popin p{margin:16px 0}.wpr-Popin .wp-rocket-data-table{padding:12px 24px;background:#f2f3f6 !important;border:none}.wpr-Popin .wp-rocket-data-table td{width:50%;color:#121116;padding:8px 0;padding-left:4px;border-bottom:1px solid #c2cad4}.wpr-Popin .wp-rocket-data-table td:not(.column-primary){font-family:"Monaco";font-size:0.75rem;line-height:1.6666666667;color:#666;letter-spacing:-0.01em}.wpr-Popin .wp-rocket-data-table tr{background:#f2f3f6;border-bottom:1px solid #e0e4e9}.wpr-Popin .wp-rocket-data-table tr:last-child td{border-bottom:none}.wpr-Popin .wp-rocket-data-table strong{font-weight:500}.wpr-Popin .wp-rocket-data-table em{font-style:normal}.wpr-Popin .wp-rocket-data-table code{padding:0;margin:0;background:rgba(0,0,0,0)}.wpr-rocketcdn-cta-small{border-radius:5px;margin:24px 0;padding:16px}.wpr-rocketcdn-cta-small.wpr-isHidden{display:none}.wpr-rocketcdn-cta-small .notice-title{font-weight:700}.wpr-rocketcdn-cta-small .wpr-flex{display:flex;justify-content:space-between;align-items:center}@media(max-width: 783px){.wpr-rocketcdn-cta-small .wpr-flex{text-align:start;flex-direction:column}}.wpr-rocketcdn-cta{margin:10px 0;position:relative}.wpr-rocketcdn-cta.wpr-isHidden{display:none}.wpr-rocketcdn-cta-close{position:absolute;top:16px;right:16px;background:rgba(0,0,0,0);border:0;color:rgba(255,255,255,.5)}.wpr-rocketcdn-cta-close--no-promo{position:absolute;top:16px;right:16px;background:rgba(0,0,0,0);border:0;color:rgba(0,0,0,.5)}.wpr-rocketcdn-cta-close--no-promo:before{content:"✕";font-weight:700;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta-close:before{content:"✕";color:#121116;font-weight:700;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta .wpr-rocketcdn-promo{background:#ffd147;border-top-left-radius:2px;border-top-right-radius:2px;padding:16px 48px 16px 16px}.wpr-rocketcdn-cta .wpr-rocketcdn-promo-title{font-weight:700;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta .wpr-rocketcdn-promo-date{margin:0;font-weight:500;font-size:1rem;line-height:1.5}.wpr-rocketcdn-cta-subtitle{color:#444;margin-top:0;font-size:0.875rem;line-height:1.7142857143}.wpr-rocketcdn-cta-content{background:#f9fafb;border-top:1px solid #e8ebee;border-left:1px solid #e8ebee;border-right:1px solid #e8ebee;padding:16px}.wpr-rocketcdn-cta-content--no-promo{border-top-left-radius:2px;border-top-right-radius:2px;background:#f9fafb;border-top:1px solid #e8ebee;border-left:1px solid #e8ebee;border-right:1px solid #e8ebee;padding:16px}.wpr-rocketcdn-cta .wpr-flex{display:flex;justify-content:space-between;align-items:center}@media(max-width: 783px){.wpr-rocketcdn-cta .wpr-flex{text-align:start;flex-direction:column}}.wpr-rocketcdn-cta .wpr-rocketcdn-features{margin:0;padding-right:16px}@media(max-width: 783px){.wpr-rocketcdn-cta .wpr-rocketcdn-features{border-right:none}}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing{background-color:#fff;align-items:center;display:flex;flex-direction:column;padding:16px;padding-bottom:32px;width:33.3333333333%;max-width:219px}@media(max-width: 783px){.wpr-rocketcdn-cta .wpr-rocketcdn-pricing{width:auto}}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing-regular{color:#72777c;margin-bottom:8px}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing .wpr-rocketcdn-cta-billing-detail{margin-bottom:16px;font-size:1rem;line-height:1.375}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing .wpr-rocketcdn-cta-currency-major{font-weight:700;font-size:3rem;line-height:1.1666666667}.wpr-rocketcdn-cta .wpr-rocketcdn-pricing .wpr-rocketcdn-cta-currency-minor{font-weight:700;vertical-align:top;font-size:1.5rem;line-height:1.3333333333}.wpr-rocketcdn-cta .wpr-rocketcdn-feature{margin:24px 0;min-height:30px;padding-left:62px;position:relative}.wpr-rocketcdn-cta .wpr-rocketcdn-feature:before{position:absolute;top:50%;left:5px;transform:translateY(-50%)}.wpr-rocketcdn-cta .wpr-rocketcdn-bandwidth:before{content:url(../img/bandwidth.svg)}.wpr-rocketcdn-cta .wpr-rocketcdn-configuration:before{content:url(../img/configuration.svg)}.wpr-rocketcdn-cta .wpr-rocketcdn-automatic:before{content:url(../img/automatic.svg)}.wpr-rocketcdn-cta-footer{color:#121116;font-weight:600;padding:16px 8px 8px;font-size:0.875rem;line-height:1.5714285714}.wpr-rocketcdn-cta-footer a{position:relative;padding-left:22px}.wpr-rocketcdn-cta-footer a:before{content:"";position:absolute;width:14px;height:15px;background:url("../img/icon-i-circle.svg") no-repeat center center;top:3px;left:0}.wpr-rocketcdn-cta-promo-footer{color:#121116;padding:16px 8px 8px;font-size:0.875rem;line-height:1.5714285714}.wpr-rocketcdn-subscription{text-align:end}.wpr-rocketcdn-subscription .wpr-rocketcdn-open{color:#666;text-decoration:underline}.wpr-rocket-analytics-cta.wpr-isHidden{display:none}.wpr-license-upgrade-button{font-weight:bold;text-decoration:underline}.wpr-license-upgrade-button:hover{text-decoration:none}.wpr-field.wpr-field-account .wpr-flex{align-items:flex-start}.wpr-infoAccount-License{flex:1 0 60%;margin-right:16px}@media(max-width: 783px){.wpr-field.wpr-field-account .wpr-flex>div{width:100%}}.wpr-field.wpr-field-account .wpr-flex>div:last-child{text-align:right}@media(max-width: 783px){.wpr-field.wpr-field-account .wpr-flex>div:last-child{text-align:left}}.wpr-Popin-Upgrade .wpr-Popin-content{padding-bottom:32px}.wpr-Popin-Upgrade .wpr-Popin-flex{justify-content:space-between}.wpr-Popin-Upgrade .wpr-Popin-flex>div{align-items:center;border:1px solid #dadada;border-radius:24px;display:flex;flex-direction:column;margin:0 16px 0 0;padding:24px;text-align:center;width:50%}.wpr-Popin-Upgrade .wpr-Popin-flex>div:last-child{margin-right:0}@media(max-width: 783px){.wpr-Popin-Upgrade .wpr-Popin-flex>div{margin:0;width:100%}}.wpr-Upgrade-Plus .wpr-upgrade-title::before{content:url(../img/plus.svg);display:block;width:117px;height:31px;top:0;position:absolute;left:50%;transform:translateX(-50%)}.wpr-Upgrade-Infinite .wpr-upgrade-title::before{content:url(../img/infinite.svg);display:block;width:48px;height:31px;top:0;position:absolute;left:50%;transform:translateX(-50%)}div.wpr-upgrade-saving{background:#ffd147;border-radius:44px;color:#121116;font-weight:bold;margin:0 0 24px 0;padding:8px 16px;text-align:center}.wpr-upgrade-title{color:#f56f46;font-size:1.875rem;line-height:1.2;margin-bottom:16px;padding-top:55px;position:relative}div.wpr-upgrade-prices{color:#121116;font-size:3rem;line-height:1;font-weight:bold;margin:0 0 16px 0}.wpr-upgrade-price-symbol{font-size:1.875rem;line-height:1;vertical-align:super}.wpr-upgrade-price-regular{color:#72777c;font-size:1rem;line-height:1;vertical-align:top}div.wpr-upgrade-websites{color:#121116;font-size:0.875rem;line-height:1;font-weight:bold;margin:0 0 24px 0}.wpr-upgrade-link{background:#fff;border:1px solid #f56f46;border-radius:800px;color:#f56f46;display:block;font-size:1rem;line-height:1.125;font-weight:bold;padding:16px 24px;text-decoration:none}.wpr-upgrade-link:hover{background:#f56f46;color:#fff}.wpr-upgrade-link::after{content:"→";font-weight:normal;margin-left:8px}.rocket-promo-banner{background:#ffd147;display:flex;justify-content:space-around;margin-top:16px;padding:24px;position:relative}@media(max-width: 783px){.rocket-promo-banner{flex-flow:column}}.rocket-promo-banner>div{display:flex;flex-flow:column;width:50%}@media(max-width: 783px){.rocket-promo-banner>div{width:100%}}.rocket-promo-title{font-weight:bold;margin-bottom:24px}.rocket-promo-discount{background:#fff;border-radius:44px;display:inline-block;margin-right:8px;padding:8px 16px;text-transform:uppercase}.rocket-promo-message,.rocket-promo-deal{font-size:1rem;line-height:1.5;margin-bottom:0}.rocket-promo-deal{margin-top:8px}.rocket-promo-cta-block{align-items:center;margin-right:24px}.rocket-promo-countdown{display:flex;flex-flow:row wrap;width:66%}.rocket-promo-countdown>.rocket-countdown-item{background:#fff;border-radius:8px;flex:1;margin-right:8px;padding:8px;text-align:center}.rocket-promo-countdown>.rocket-countdown-item>.rocket-countdown-value{display:block;font-size:1.5rem;line-height:1;font-weight:bold}.rocket-promo-cta{background:#172153;border-radius:44px;color:#fff;font-weight:bold;padding:16px 32px}.rocket-renewal-banner{background:#ffd147;display:flex;flex-flow:row wrap;align-items:center;justify-content:space-evenly;margin-top:16px;padding:8px}.rocket-renewal-expired-banner{background:#ffd147;margin-top:16px;padding:24px;position:relative}.rocket-renewal-expired-banner-container{display:flex;justify-content:space-around}@media(max-width: 783px){.rocket-renewal-expired-banner-container{flex-flow:column}}.rocket-renewal-expired-banner-container>div{display:flex;flex-flow:column;width:50%}@media(max-width: 783px){.rocket-renewal-expired-banner-container>div{width:100%}}.rocket-renew-message{margin:0 16px}.rocket-renew-message>p{font-size:0.875rem;line-height:1.5}.rocket-expired-message>p{font-size:0.875rem;line-height:1.5;padding-left:80px}.rocket-expired-title{font-size:1.375rem;line-height:1.5;font-weight:bold}.rocket-expired-title::before{content:url(../img/warning.svg);display:inline-block;height:48px;width:63px;margin-right:17px;vertical-align:middle}.rocket-expired-cta-container{justify-content:center;align-items:center}.rocket-renew-cta{display:block;background:#172153;border-radius:44px;color:#fff;font-size:1rem;line-height:1.125;font-weight:bold;padding:16px 24px;text-decoration:none}.rocket-renew-cta:hover,.rocket-renew-cta:active,.rocket-renew-cta:focus{color:#fff}.rocket-renew-cta::after{content:"→";font-weight:normal;margin-left:8px}.wpr-menuItem{position:relative;display:block;padding:16px 44px 18px 20px;text-decoration:none;color:#121116;border-top:1px solid #e0e4e9;border-left:2px solid rgba(0,0,0,0);overflow:hidden;transition:all 100ms ease-out;-webkit-transition:all 100ms ease-out}@media(max-width: 783px){.wpr-menuItem{width:57px;height:50px;padding:0}}.wpr-menuItem:before{position:absolute;top:calc(50% - 12px);right:18px;text-align:center;font-size:1.4375rem;line-height:1;color:#121116;opacity:.4;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-menuItem:hover,.wpr-menuItem.isActive{color:#121116;background:#fff;border-left:2px solid #f56640}.wpr-menuItem:hover .wpr-menuItem-title,.wpr-menuItem.isActive .wpr-menuItem-title{color:#f56640}.wpr-menuItem:hover:before,.wpr-menuItem.isActive:before{color:#f56640;opacity:1}.wpr-menuItem:focus{color:#121116}.wpr-menuItem:focus:before{color:#121116}.wpr-menuItem-title{font-size:0.8125rem;line-height:1.4615384615;font-weight:bold;letter-spacing:-0.08px;text-transform:uppercase;color:#121116}@media(max-width: 783px){.wpr-menuItem-title{display:none !important}}.wpr-menuItem-description{margin-top:2px;color:#72777c;font-size:0.8125rem;line-height:1.2307692308;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}@media(max-width: 783px){.wpr-menuItem-description{display:none}}.wpr-menuItem.wpr-subMenuItem{display:none;padding:10px 20px 8px 25px}@media(max-width: 783px){.wpr-menuItem.wpr-subMenuItem{padding:8px 20px 8px 23px;height:35px}}.wpr-menuItem.wpr-subMenuItem .wpr-menuItem-title{display:inline-block;font-size:0.8125rem;line-height:1.8461538462;text-transform:inherit;font-weight:600}.wpr-menuItem.wpr-subMenuItem:before{position:relative;display:inline-block;top:2px;right:2px;margin-right:8px;font-size:1rem;line-height:1}#wpr-nav-cache:before{right:20px}#wpr-nav-tools:before{right:20px}.wpr-sectionHeader{position:relative;border-bottom:1px solid #e0e4e9;padding-bottom:24px}.wpr-sectionHeader:before{content:"";position:absolute;display:block;width:48px;height:2px;bottom:-1px;left:0;background:#f56640}.wpr-sectionHeader .wpr-title1{line-height:48px}.wpr-sectionHeader .wpr-title1:before{display:inline-block;width:48px;height:48px;margin-right:24px;background:#fde0d9;color:#f56640;text-align:center;border-radius:3px}.wpr-sectionHeader-title{margin-top:8px;padding-left:72px}.wpr-sectionHeader-description{color:#666;margin-top:8px;padding-left:72px}.wpr-sectionHeader-logo{vertical-align:top;margin-right:24px}.wpr-optionHeader{position:relative;display:flex;justify-content:space-between;margin-top:48px;padding-bottom:9px;border-bottom:1px solid #e0e4e9}.wpr-optionHeader .wpr-title2{line-height:24px;color:#f56640;padding-right:40px}.wpr-optionHeader .wpr-infoAction{margin-right:8px}.wpr-optionHeader.wpr-isHidden{display:none}.wpr-fieldsContainer{margin-top:8px}.wpr-fieldsContainer-description{color:#666}.wpr-fieldsContainer-description a:hover,.wpr-fieldsContainer-description a:focus{color:#1eadbf}.wpr-fieldsContainer-fieldset{margin-top:16px;background:#f9fafb;padding:16px;border:1px solid #e8ebee;border-radius:2px}.wpr-fieldsContainer-fieldset--split{display:flex}.wpr-fieldsContainer-fieldset--split .wpr-field+.wpr-field{border:none}.wpr-fieldsContainer-fieldset--split .wpr-field{flex:0 0 50%;padding:0}.wpr-fieldsContainer-fieldset--split .wpr-field:first-child{padding-right:15px}.wpr-fieldsContainer-fieldset--split .wpr-field:last-child{padding-left:15px}.wpr-fieldsContainer-helper{margin-top:16px;color:#d60e5b;font-weight:500}.wpr-fieldsContainer-helper:before{position:relative;top:3px;font-size:1.125rem;line-height:1;margin-right:4px}.wpr-fieldsContainer.wpr-isHidden{display:none}.wpr-infoAction{position:relative;height:24px;font-size:0.8125rem;line-height:1.8461538462;vertical-align:middle;letter-spacing:-0.03em;font-weight:500;color:#666;white-space:nowrap;text-decoration:none;transition:all 200ms ease-out;-webkit-transition:all 200ms ease-out}.wpr-infoAction:before{position:absolute;margin-left:-26px;font-size:1.125rem;line-height:1.3333333333;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-infoAction--help{text-transform:uppercase;color:#02707f;font-weight:bold;font-size:0.75rem;line-height:2;letter-spacing:0}@media(max-width: 783px){.wpr-infoAction--help{display:none}}.wpr-infoAction--help:before{color:#1eadbf}.wpr-infoAction:hover,.wpr-infoAction:focus{color:#f56640;outline:none}.wpr-infoAction:hover:before,.wpr-infoAction:focus:before{color:#ffa58b}.wpr-button{position:relative;display:inline-block;width:auto;padding:8px 24px;text-align:center;background:#f56640;box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);text-transform:uppercase;text-decoration:none;letter-spacing:-0.08px;font-weight:bold;border-radius:4px;color:#fff !important;white-space:nowrap;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:all 200ms ease-out;-webkit-transition:all 200ms ease-out;font-size:0.8125rem;line-height:1.5384615385}.wpr-button:hover,.wpr-button:focus{color:#fff !important;transform:translateY(-2px);box-shadow:0 7px 14px rgba(50,50,93,.25),0 3px 6px rgba(0,0,0,.2)}.wpr-button--small{padding:5px 0;letter-spacing:-0.08px;font-size:0.6875rem;line-height:1.8181818182}.wpr-button--no-min-width{min-width:auto !important}.wpr-button--icon{min-width:160px;padding-left:8px;padding-right:40px;text-align:left}.wpr-button--icon:before{position:absolute;right:8px;font-size:0.9375rem;line-height:1.3333333333}.wpr-button--fixed{position:fixed;display:flex;padding:8px 16px;right:24px;bottom:32px;border-radius:16px}.wpr-button--fixed:before{font-size:1.125rem;line-height:1;margin-right:8px}.wpr-button--purple{background:#2d1656}.wpr-button--blue{min-width:inherit;background:#1eadbf}.wpr-button--lightBlue{min-width:inherit;background:#40bacb}.wpr-button--red{background:#d33f49}.wpr-button--gray{background:#e0e4e9;color:#121116 !important}.wpr-button--gray:hover,.wpr-button--gray:active,.wpr-button--gray:focus{color:#121116 !important}.wpr-button--gray.radio-active{background:#2d1656 !important;color:#fff !important}.wpr-button--gray.radio-active:hover,.wpr-button--gray.radio-active:active,.wpr-button--gray.radio-active:focus{color:#fff !important}.wpr-button--blueDark{background:#02707f}.wpr-button:focus{outline:none;color:#fff !important}.wpr-field{padding:16px 0;transition:opacity 150ms ease-out;-webkit-transition:opacity 150ms ease-out}.wpr-field+.wpr-field,.wpr-field+.wpr-warningContainer{border-top:1px solid #e0e4e9}.wpr-field:first-child{padding-top:0}.wpr-field:last-child{padding-bottom:0}.wpr-field-description{margin-top:4px;color:#666;font-size:0.8125rem;line-height:1.5384615385}.wpr-field-description .wpr-js-popin{color:#444;text-decoration:underline}.wpr-field-description .wpr-js-popin:hover,.wpr-field-description .wpr-js-popin:focus{color:#1eadbf}.wpr-field-description a:hover,.wpr-field-description a:focus{color:#1eadbf}.wpr-field-description-helper{color:#00a66b}.wpr-field-description-label{font-size:0.875rem;line-height:1.4285714286;font-weight:500;color:#666}.wpr-field-list{margin:0;color:#666;font-weight:500}.wpr-field-list li+li{margin-top:16px}.wpr-field-list li:before{position:relative;top:3px;margin-right:8px;color:#02707f;font-size:1.125rem;line-height:1.1111111111}.wpr-field-list a{text-decoration:none}.wpr-field-list a:hover,.wpr-field-list a:focus{color:#1eadbf}.wpr-field-betweenText{margin:0 16px;font-weight:bold}.wpr-field .wpr-button{margin:8px 0}.wpr-field .wpr-flex{display:flex;justify-content:space-between;align-items:center}@media(max-width: 783px){.wpr-field .wpr-flex{text-align:left;flex-direction:column}}.wpr-field .wpr-flex--egal>div{flex:0 0 50%}@media(max-width: 783px){.wpr-field .wpr-flex--egal>div{width:100%}}.wpr-field .wpr-flex--egal>div:last-child{text-align:right}@media(max-width: 783px){.wpr-field .wpr-flex--egal>div:last-child{text-align:left}}.wpr-field .wpr-flex--egal>div .wpr-field-description{font-style:normal;color:#666}.wpr-field p{margin-bottom:0}.wpr-field label{font-weight:500}.wpr-field h4{font-size:0.875rem;line-height:1.7142857143}.wpr-field.wpr-isDisabled{opacity:.55}.wpr-field.wpr-isParent{padding-bottom:0;margin-bottom:16px}.wpr-field.wpr-Delayjs{margin-top:16px}.wpr-field.wpr-RemoveUnUsedCss{margin-bottom:0}.wpr-field.wpr-NoPaddingBottom{padding-bottom:0}.wpr-field.wpr-isLastElem{margin-top:16px}.wpr-field.wpr-isHidden{display:none}.wpr-field .wpr-isHidden{display:none}.wpr-field--children{display:none;padding-left:32px}.wpr-field--children.wpr-isOpen{display:block}.wpr-field--children.wpr-field--textarea{padding-right:80px}@media(max-width: 1239px){.wpr-field--children.wpr-field--textarea{padding-right:32px}}@media(max-width: 783px){.wpr-field--children.wpr-field--textarea{padding-right:0}}.wpr-field--children.no-space{padding-left:0}.wpr-field--checkbox .wpr-field-description{margin-left:32px}.wpr-field--radio{padding:24px 16px}.wpr-field--radio:first-child{padding-top:8px}.wpr-field--radio:last-child{padding-bottom:8px}.wpr-field--radio .wpr-field-description{margin-left:88px}.wpr-field--radio .wpr-field-description button{color:#666}.wpr-field--split{display:inline-block;width:50%;padding-right:16px;padding-bottom:0}.wpr-field--split+.wpr-field--split{padding-left:16px;padding-right:0}.wpr-field--split+.wpr-field--split:nth-child(2){padding-top:0;border-top:none}.wpr-field--cache .wpr-field--number,.wpr-field--cache .wpr-field--select{display:inline-block;padding-top:0;width:auto;padding-bottom:0;font-weight:bold}.wpr-field--cache .wpr-field--select{position:relative;padding-left:8px;top:-2px;border-top:none}.wpr-field--cache .wpr-field--number .wpr-text input[type=number]{background:#f2f3f6;height:35px;border:1px solid #e0e4e9;font-family:inherit;font-size:1em}.wpr-field--cache .wpr-field-description{margin:8px 0;color:#00a66b}.wpr-field--cache .wpr-field-description-label{color:#121116}.wpr-field--textarea .wpr-field-description pre{background:rgba(0,0,0,.07);padding:1em;margin:1em 0 0;white-space:normal}.wpr-field--textarea .wpr-field-description pre code{background:rgba(0,0,0,0);-webkit-touch-callout:all;-webkit-user-select:all;-khtml-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;color:#121116}.wpr-fieldWarning{display:none;position:relative;padding:16px 16px 24px 56px;background:#19073b;margin:8px 0 0;color:#fff}.wpr-fieldWarning.wpr-isOpen{display:block}.wpr-fieldWarning:after{content:"";position:absolute;display:block;top:-8px;left:20px;width:0;height:0;border-style:solid;border-width:0 12px 8px 12px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) #19073b rgba(0,0,0,0)}.wpr-fieldWarning:before{content:"";position:absolute;display:block;width:calc(100% + 32px);height:100%;top:0;left:-16px;background:#19073b}.wpr-fieldWarning-title{position:relative;color:#f56640;font-size:0.875rem;line-height:1.4285714286;font-weight:bold}.wpr-fieldWarning-title:before{position:absolute;left:-36px;font-size:1.5rem;line-height:.8333333333}.wpr-fieldWarning-description{position:relative;margin-top:8px}.wpr-fieldWarning .wpr-button{margin-top:16px}.wpr-fieldWarning.wpr-radio-warning{margin-left:-32px}.wpr-fieldWarning.wpr-radio-warning:after{left:40px}.wpr-warningContainer+.wpr-warningContainer,.wpr-warningContainer+.wpr-field,.wpr-field+.wpr-warningContainer{border-top:1px solid #e0e4e9;padding-top:16px}.wpr-warningContainer+.wpr-warningContainer,.wpr-field+.wpr-warningContainer{padding-bottom:16px}@media only screen and (max-width: 400px){.wpr-fieldWarning.wpr-radio-warning{margin-left:-32px}.wpr-fieldWarning.wpr-radio-warning .wpr-button{white-space:normal;padding-right:32px}}@media only screen and (max-width: 350px){.wpr-radio-buttons{padding-left:24px}.wpr-fieldWarning.wpr-radio-warning{margin-left:-24px;padding-left:30px;padding-right:0}.wpr-fieldWarning.wpr-radio-warning .wpr-button{padding-right:24px}}.wpr-documentation{padding:24px 16px;border-radius:4px;color:#fff;text-align:center;background:#40bacb}.wpr-documentation p{margin:8px 0 16px;font-weight:500}.wpr-documentation i{display:block;font-size:2.25rem;line-height:1;margin-bottom:8px}.wpr-documentation .wpr-button{padding-left:16px;padding-right:16px}.wpr-addon{padding:24px 0}.wpr-addon .wpr-flex{align-items:flex-start}@media(max-width: 783px){.wpr-addon .wpr-flex{align-items:center}}.wpr-addon .wpr-flex>div{text-align:left}.wpr-addon .wpr-addon-title{margin-bottom:16px;font-weight:500}.wpr-addon .wpr-field-description{font-style:normal}.wpr-addon .wpr-field-helper{font-size:0.8125rem;line-height:1.5384615385;color:#666;background-color:#e0e4e9;padding:8px;margin:8px 0}.wpr-addon .wpr-field-helper span.wpr-helper-title{font-weight:600}.wpr-addon .wpr-field-helper span.wpr-helper-title::after{content:"\a";white-space:pre}.wpr-addon .wpr-addon-logo{text-align:center;flex:0 0 160px}@media(max-width: 1239px){.wpr-addon .wpr-addon-logo{max-width:100px}.wpr-addon .wpr-addon-logo img{width:100%;height:auto}}@media(max-width: 1083px){.wpr-addon .wpr-addon-logo{max-width:160px}}@media(max-width: 783px){.wpr-addon .wpr-addon-logo{flex:0 0 auto;margin-bottom:16px}}.wpr-addon .wpr-addon-text{margin-left:32px;flex:1 1 auto}@media(max-width: 1239px){.wpr-addon .wpr-addon-text{margin-left:16px}}@media(max-width: 1083px){.wpr-addon .wpr-addon-text{margin-left:32px}}@media(max-width: 783px){.wpr-addon .wpr-addon-text{margin-left:0}}.wpr-addon .wpr-addon-text a{display:inline-block;margin-top:24px}.wpr-addon .wpr-addon-text .button{margin-top:24px}.wpr-addon .wpr-addon-text .wpr-add-on-helper{font-weight:normal;color:#1eadbf}.wpr-addon .wpr-addon-text .wpr-add-on-helper a{margin-top:0}.wpr-webp-addon .wpr-addon .wpr-addon-text a{margin-top:0px}.notice-wpr-warning{background:#ffd147;display:flex;flex-flow:row wrap;align-items:center;margin-top:16px;padding:8px 32px;border:0}.notice-wpr-warning p:first-child{font-size:1rem;line-height:1.125;margin-left:80px}.notice-wpr-warning p:first-child::before{content:url(../img/warning.svg);display:inline-block;height:48px;width:63px;margin-right:17px;vertical-align:middle;margin-left:-80px}@media(max-width: 1239px){.notice-wpr-warning p:first-child::before{margin-bottom:-30px}}.notice-wpr-warning p:last-child{margin-left:63px;flex-basis:100%;align-items:center;justify-content:flex-start;display:flex}@media(max-width: 783px){.notice-wpr-warning p:last-child{align-content:center;flex-direction:column;margin-left:0}}.notice-wpr-warning p:last-child a{margin:0 16px}@media(max-width: 783px){.notice-wpr-warning p:last-child a{margin:8px 16px}}.notice-wpr-warning p:last-child a:first-child{display:block;background:#172153;border-radius:44px;color:#fff;font-size:1rem;line-height:1.125;font-weight:bold;padding:16px 24px;text-decoration:none}.notice-wpr-warning p:last-child a:first-child:hover,.notice-wpr-warning p:last-child a:first-child:active,.notice-wpr-warning p:last-child a:first-child:focus{color:#fff}.notice-wpr-warning p:last-child a:first-child::after{content:"→";font-weight:normal;margin-left:8px}.wpr-notice{position:relative;color:#444;background:#ebfaf5 url("../img/bg-activated.svg") no-repeat 90% bottom;background-size:350px;margin-top:24px;border-radius:4px;overflow:hidden}.wpr-notice-container{padding:24px 25% 24px 40px}.wpr-notice-supTitle{font-size:1rem;line-height:1.375;font-weight:bold}.wpr-notice-title{font-size:1.5rem;line-height:1.3333333333;color:#3ece9d;margin-top:16px;font-weight:bold}.wpr-notice-description{font-size:0.875rem;line-height:1.5714285714;margin:16px 0 24px}.wpr-notice-continue{color:#666}.wpr-notice-close{position:absolute;top:24px;right:24px;color:#666;text-decoration:none;font-size:1.5rem;line-height:1;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-notice-close:hover{color:#444}.wpr-notice-close:focus{outline:none}.wpr-tools{position:relative;display:flex;flex-direction:row;padding:32px 0}@media(max-width: 1239px){.wpr-tools{flex-direction:column}}@media(max-width: 1083px){.wpr-tools{flex-direction:row}}@media(max-width: 783px){.wpr-tools{flex-direction:column}}.wpr-tools:nth-child(2){margin-top:16px}.wpr-tools+.wpr-tools{border-top:1px solid #e0e4e9}.wpr-tools-label{display:block}.wpr-tools-label:before{position:absolute;left:0;margin-top:5px;font-size:2.25rem;line-height:1;color:#f56640}@media(max-width: 783px){.wpr-tools-label:before{display:block;position:initial}}.wpr-tools-col{flex:1 1 auto}.wpr-tools-col:first-child{padding-left:72px;padding-right:24px;min-width:340px}@media(max-width: 783px){.wpr-tools-col:first-child{padding-left:0;padding-right:0;min-width:auto}}.wpr-tools-col:last-child{text-align:right}@media(max-width: 783px){.wpr-tools-col:last-child{text-align:left}}.wpr-tools .wpr-button{margin-top:24px;white-space:normal}.wpr-tools .wpr-field-description{font-style:normal;color:#666}.wpr-tools #wpr-update-exclusion-msg{min-height:20px}.wpr-imagify{display:flex;justify-content:space-between;flex-wrap:wrap;margin-top:30px}.wpr-imagify-description{width:40%;padding-right:60px}@media(max-width: 1239px){.wpr-imagify-description{width:auto;padding-right:0}}.wpr-imagify-screenshot{width:60%}@media(max-width: 1239px){.wpr-imagify-screenshot{margin-top:60px;width:auto}}.wpr-imagify-screenshot img{max-width:100%;height:auto}.wpr-imagify-more,.wpr-imagify-name{color:#00a8dc;font-weight:700;margin-bottom:0}.wpr-imagify-more::before{content:"✓";color:#000;font-size:2rem;margin-right:5px}.wpr-imagify p{font-size:1rem}.wpr-imagify p:first-child{margin-top:0}.wpr-imagify ul{margin-top:40px}.wpr-imagify li{display:flex;align-items:flex-start;margin-bottom:35px}.wpr-imagify li:before{width:24px;height:24px;margin-right:10px;flex-shrink:0}.wpr-imagify li .text{flex-grow:1;display:inline-block}.wpr-imagify a{text-decoration:none}.wpr-imagify a:hover{color:#00a8dc}.wpr-imagify .button-primary{background:#2abb9b;border:1px solid #bebebe;box-shadow:none;font-size:1rem;font-weight:700;height:auto;line-height:1;margin-top:60px;padding:20px 45px;text-shadow:none;text-transform:uppercase}.wpr-imagify-plugin-tile{display:flex;align-items:center;width:100%;padding:20px;background-color:#f9fafb;margin-top:20px;border:1px solid #ebe9e9}.wpr-imagify-plugin-tile-info{margin-left:20px}.wpr-imagify-plugin-tile-info .wpr-star-rating{display:flex;align-items:center}.wpr-imagify-plugin-tile-info .star-rating .star{font-size:16px;width:16px;height:13px}.wpr-imagify-plugin-tile-info .num-ratings{font-size:13px;margin-left:10px}.wpr-imagify-plugin-tile-title{margin-bottom:5px}.wpr-imagify-plugin-tile .wpr-button{margin-left:auto}.wpr-imagify-plugin-tile .wpr-button:before{margin-right:5px}.wpr-tutorials-section{display:flex;flex-flow:row wrap}div.wpr-tutorial-item{width:32%;margin-bottom:10px;margin-right:1%}.wpr-tutorial-link{cursor:pointer;transition:color 200ms ease-out}.wpr-tutorial-link:hover{color:#1eadbf}@media(max-width: 1083px){div.wpr-tutorial-item{width:48%}}@media(max-width: 783px){div.wpr-tutorial-item{width:100%}}.wpr-rocketcdn-modal{display:none}.wpr-rocketcdn-modal.is-open{display:block}.wpr-rocketcdn-modal__overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);display:flex;justify-content:center;align-items:center}.wpr-rocketcdn-modal__container{max-width:674px;max-height:100vh;overflow-y:auto;box-sizing:border-box}.wpr-rocketcdn-modal iframe{max-width:100%}.wpr-checkbox{position:relative;padding-left:32px}.wpr-checkbox label{user-select:none}.wpr-checkbox [type=checkbox]:not(:checked),.wpr-checkbox [type=checkbox]:checked{position:absolute;left:-9999px}.wpr-checkbox [type=checkbox]:not(:checked)+label:before,.wpr-checkbox [type=checkbox]:checked+label:before{content:"";position:absolute;left:0;top:4px;width:14px;height:14px;border:2px solid #444;border-radius:3px;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-checkbox [type=checkbox]:not(:checked)+label:after,.wpr-checkbox [type=checkbox]:checked+label:after{content:"";position:absolute;top:5px;left:2px;color:#fff;font-family:"wpr-icomoon";speak:none;font-size:0.875rem;line-height:1.2857142857;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-checkbox [type=checkbox]:not(:checked)+label:after{opacity:0;transform:scale(2)}.wpr-checkbox [type=checkbox]:checked+label:after{opacity:1;transform:scale(1)}.wpr-checkbox [type=checkbox]:checked+label:before{background:#19073b;border-color:#19073b}.wpr-checkbox [type=checkbox]:checked:focus+label:before{background:#665090;border:2px dotted #665090}.wpr-checkbox [type=checkbox]:focus+label:before{border:2px dotted #444}.wpr-checkbox-warning{color:#d33f49;margin-left:16px}.wpr-checkbox-warning::before{margin-right:8px}.wpr-radio{position:relative;padding-left:88px}.wpr-radio label{user-select:none;font-weight:bold}.wpr-radio [type=checkbox]:not(:checked),.wpr-radio [type=checkbox]:checked{position:absolute;left:-9999px}.wpr-radio [type=checkbox]:not(:checked)+label:before,.wpr-radio [type=checkbox]:checked+label:before,.wpr-radio [type=checkbox]:not(:checked)+label:after,.wpr-radio [type=checkbox]:checked+label:after{content:"";position:absolute}.wpr-radio [type=checkbox]:not(:checked)+label:before,.wpr-radio [type=checkbox]:checked+label:before{left:0;width:52px;height:22px;background:#fff;border-radius:12px;border:1px solid #444;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-radio [type=checkbox]:not(:checked)+label:after,.wpr-radio [type=checkbox]:checked+label:after{width:18px;height:18px;border-radius:100%;background:#444;top:3px;left:3px;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-radio [type=checkbox]:disabled+label:after,.wpr-radio [type=checkbox]:disabled+label:after{background:#e0e4e9}.wpr-radio [type=checkbox]:disabled+label:before,.wpr-radio [type=checkbox]:disabled+label:before{border:1px solid #e0e4e9}.wpr-radio [type=checkbox]:checked+label:before{border-color:#1eadbf}.wpr-radio [type=checkbox]:checked+label:after{background:#1eadbf;left:33px}.wpr-radio [type=checkbox]:checked+label .wpr-radio-ui,.wpr-radio [type=checkbox]:not(:checked)+label .wpr-radio-ui:before,.wpr-radio [type=checkbox]:checked+label .wpr-radio-ui:after{position:absolute;left:4px;width:52px;text-transform:uppercase;letter-spacing:-0.01em;font-weight:bold;font-size:0.6875rem;line-height:2.1818181818;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-radio [type=checkbox]:not(:checked)+label .wpr-radio-ui:before{content:attr(data-l10n-inactive);left:27px;color:#666}.wpr-radio [type=checkbox]:checked+label .wpr-radio-ui:after{content:attr(data-l10n-active);color:#02707f}.wpr-radio--reverse{padding-right:72px;padding-left:0}.wpr-radio--reverse [type=checkbox]:not(:checked)+label:before,.wpr-radio--reverse [type=checkbox]:checked+label:before{right:0;left:inherit}.wpr-radio--reverse [type=checkbox]:not(:checked)+label:after,.wpr-radio--reverse [type=checkbox]:checked+label:after{right:33px;left:inherit}.wpr-radio--reverse [type=checkbox]:checked+label:after{right:3px;left:inherit}.wpr-radio--reverse [type=checkbox]:checked+label .wpr-radio-ui,.wpr-radio--reverse [type=checkbox]:not(:checked)+label .wpr-radio-ui:before,.wpr-radio--reverse [type=checkbox]:checked+label .wpr-radio-ui:after{right:-2px;left:inherit}.wpr-radio--reverse [type=checkbox]:not(:checked)+label .wpr-radio-ui:before{right:-25px;left:inherit}.wpr-radio [type=checkbox]:not(:checked):focus+label:before{border:1px dashed #444}.wpr-radio [type=checkbox]:checked:focus+label:before{border:1px dashed #1eadbf}.wpr-radio--tips [type=checkbox]:checked+label:before{border-color:#3ece9d}.wpr-radio--tips [type=checkbox]:checked+label:after{background:#3ece9d}.wpr-radio--tips [type=checkbox]:checked+label .wpr-radio-ui:after{color:#00a66b}.wpr-radio--tips [type=checkbox]:checked:focus+label:before{border:1px dashed #3ece9d}.wpr-select{position:relative}.wpr-select select{margin:0;padding:0 8px;height:36px;border:1px solid #e0e4e9;background:#f2f3f6;color:#121116;box-shadow:none;border-radius:0;letter-spacing:.011em}.wpr-select select:focus{outline:none;border-color:#444;box-shadow:none}.wpr-select select:disabled{background-image:none}.wpr-select label{font-weight:bold;margin-left:8px}.wpr-textarea{margin-top:8px}.wpr-textarea textarea{padding:8px;width:100%;height:100px;font-family:Monaco;color:#121116;background:#fff;border:2px solid #c2cad4;border-radius:3px;font-size:0.8125rem;line-height:1.2307692308;transition:border 200ms ease-out;-webkit-transition:border 200ms ease-out}.wpr-textarea textarea:focus{outline:none;border-color:#444;box-shadow:none}.wpr-textarea+.wpr-field-description{color:#00a66b}.wpr-text label{color:#666}.wpr-text input[type=text],.wpr-text input[type=number]{margin-top:8px;padding:0 8px;width:100%;height:32px;color:#121116;background:#fff;border:2px solid #c2cad4;border-radius:3px;font-family:Monaco;font-size:0.75rem;line-height:1.3333333333;transition:border 200ms ease-out;-webkit-transition:border 200ms ease-out}.wpr-text input[type=text]:focus,.wpr-text input[type=number]:focus{outline:none;border-color:#444;box-shadow:none}.wpr-text input[type=text].wpr-isError,.wpr-text input[type=number].wpr-isError{border-color:#d33f49}.wpr-text input[type=number]{width:80px}.wpr-text--number label{margin-right:8px}.wpr-upload input[type=file]{display:block;width:252px;margin:8px 8px 8px 0;padding:8px;border:1px solid #e0e4e9;background:#f2f3f6;color:#121116;font-size:0.6875rem;line-height:1.4545454545}.wpr-upload input[type=file]:focus{outline:none;border-color:#444;box-shadow:none}.wpr-multiple{display:flex;align-items:center;flex-wrap:wrap}@media(max-width: 783px){.wpr-multiple{align-items:center;flex-direction:column}}.wpr-multiple .wpr-text{flex:1 1 auto;position:relative;top:-2px}@media(max-width: 783px){.wpr-multiple .wpr-text{width:100%}}.wpr-multiple .wpr-button{margin-left:16px;width:auto;min-width:inherit;padding-right:30px}@media(max-width: 783px){.wpr-multiple .wpr-button{margin-left:0}}.wpr-multiple input[type=text]{flex-grow:2}.wpr-multiple select{height:30px}.wpr-multiple-default{margin-right:20px}.wpr-multiple-list{display:none;padding:8px 0;margin:16px 0 0;background:#f2f3f6;border-radius:2px}.wpr-multiple-list li{margin-bottom:0;padding:4px 16px;font-size:0.8125rem;line-height:1.2307692308;font-family:Monaco}.wpr-multiple-list li span{display:inline-block;transition:all 150ms ease-out;-webkit-transition:all 150ms ease-out}.wpr-multiple-close{position:relative;top:3px;font-size:1rem;line-height:1;transition:color 200ms ease-out;-webkit-transition:color 200ms ease-out}.wpr-multiple-close:focus{outline:none}.wpr-multiple-close:hover,.wpr-multiple-close:focus{color:#d33f49}.wpr-multiple-close:hover+span,.wpr-multiple-close:focus+span{color:#d33f49}.wpr-multiple-select .wpr-list{border:2px solid #c2cad4;background-color:#fff;border-radius:5px;padding:10px;margin:8px 0}.wpr-multiple-select .wpr-list .wpr-list-header{display:flex;justify-content:space-between}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-multiple-select-exclude_js_ads:before{font-family:"wpr-icomoon";content:"";padding-right:8px}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-multiple-select-exclude_js_plugins:before{font-family:"wpr-icomoon";content:"";padding-right:8px}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-multiple-select-exclude_js_themes:before{font-family:"wpr-icomoon";content:"";padding-right:8px}.wpr-multiple-select .wpr-list .wpr-list-header .wpr-list-header-arrow{width:15px;cursor:pointer;display:flex;transform:rotate(180deg)}.wpr-multiple-select .wpr-list .wpr-list-header h3{font-weight:500;color:#121116;font-size:0.875rem;line-height:1.5}.wpr-multiple-select .wpr-list .wpr-list-body{display:none}.wpr-multiple-select .wpr-list .wpr-list-body li{padding-left:30px}.wpr-multiple-select .wpr-list .wpr-list-body li .wpr-checkbox img{width:15px}.wpr-multiple-select .wpr-list.open .wpr-list-body{display:block}.wpr-multiple-select .wpr-list.open .wpr-list-body .wpr-checkbox label{color:#72777c}.wpr-multiple-select .wpr-list.open .wpr-list-body .wpr-checkbox input[checked=checked]+label{color:#121116}.wpr-multiple-select .wpr-list.open .wpr-list-header{border-bottom:1px solid #c2cad4;margin-bottom:10px;padding-bottom:5px}.wpr-multiple-select .wpr-list.open .wpr-list-header-arrow{transform:rotate(0deg)}.wpr-field--categorizedmultiselect .wpr-list{padding-right:15px;padding-left:15px}.wpr-field--categorizedmultiselect .wpr-list.open .wpr-list-header{padding-bottom:9px;margin-bottom:10px}.wpr-field--categorizedmultiselect .wpr-list.open .wpr-list-header{max-height:32px}.wpr-field--categorizedmultiselect .wpr-list .wpr-list-header{max-height:32px}.wpr-field--categorizedmultiselect .wpr-list [type=checkbox]+label:before{top:4px}.wpr-field--categorizedmultiselect .wpr-list [type=checkbox]:checked+label:after{top:4px}.wpr-field--categorizedmultiselect .wpr-list-header .wpr-checkbox{padding-left:29px}.wpr-field--categorizedmultiselect .wpr-list-body{display:block;max-height:250px;overflow-y:auto}.wpr-field--categorizedmultiselect .wpr-list-body ul{margin:0}.wpr-field--categorizedmultiselect .wpr-list-body ul li{margin-bottom:10px}.wpr-field--categorizedmultiselect .wpr-list-body ul li .wpr-checkbox{padding-left:25px}.wpr-field--categorizedmultiselect .wpr-list-body ul li .wpr-checkbox label{color:#121116 !important;font-weight:normal}.wpr-field--categorizedmultiselect .dashicons{color:#72777c}.wpr-field--categorizedmultiselect .wpr-multiple-select-title{font-weight:bold;margin-left:5px}@media only screen and (min-width: 782px){.wpr-field--categorizedmultiselect{padding-right:80px}} \ No newline at end of file diff --git a/src/scss/components/_button.scss b/src/scss/components/_button.scss index c036adc4e0..5a3cd0b6b3 100644 --- a/src/scss/components/_button.scss +++ b/src/scss/components/_button.scss @@ -38,6 +38,9 @@ letter-spacing: -0.08px; @include font-size(11,20); } + &--no-min-width{ + min-width: auto !important; + } &--icon{ min-width: 160px; From 33b692bbfc5b7b94513d5649cf55f88e13634590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Tue, 20 Aug 2024 08:34:06 -0400 Subject: [PATCH 081/192] Closes #6835 LCR frontend (#6849) --- composer.json | 1 + .../LazyRenderContent/Frontend/Controller.php | 100 ++++++++++++++++++ .../Frontend/Processor/Dom.php | 99 +++++++++++++++++ .../Frontend/Processor/Processor.php | 45 ++++++++ .../Frontend/Processor/ProcessorInterface.php | 15 +++ .../Frontend/Processor/Regex.php | 72 +++++++++++++ .../Frontend/Processor/SimpleHtmlDom.php | 77 ++++++++++++++ .../LazyRenderContent/Frontend/Subscriber.php | 46 ++++++++ .../LazyRenderContent/ServiceProvider.php | 21 ++++ inc/Plugin.php | 1 + .../Frontend/Processor/Dom/addHashes.php | 23 ++++ .../Processor/Processor/getProcessor.php | 16 +++ .../Frontend/Processor/Regex/addHashes.php | 23 ++++ .../Processor/SimpleHtmlDom/addHashes.php | 23 ++++ .../Frontend/Processor/expected.html | 24 +++++ .../Frontend/Processor/expectedRegex.html | 24 +++++ .../Frontend/Processor/original.html | 24 +++++ .../Frontend/Processor/Dom/addHashes.php | 30 ++++++ .../Processor/Processor/getProcessor.php | 34 ++++++ .../Frontend/Processor/Regex/addHashes.php | 30 ++++++ .../Processor/SimpleHtmlDom/addHashes.php | 30 ++++++ 21 files changed, 758 insertions(+) create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/ProcessorInterface.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expected.html create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expectedRegex.html create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/original.html create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php diff --git a/composer.json b/composer.json index c3dac045e9..19f6fe5e66 100644 --- a/composer.json +++ b/composer.json @@ -44,6 +44,7 @@ "php": ">=7.3", "cloudflare/cf-ip-rewrite": "^1.0", "composer/installers": "^1.0 || ^2.0", + "voku/simple_html_dom": "^4.8", "wp-media/apply-filters-typed": "^1.0" }, "require-dev": { diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php new file mode 100644 index 0000000000..6c15a1b7a6 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -0,0 +1,100 @@ +processor = $processor; + $this->context = $context; + $this->query = $query; + $this->options = $options; + } + + /** + * Add hashes to the HTML elements + * + * @param string $html The HTML content. + * + * @return string + */ + public function add_hashes( $html ) { + global $wp; + + if ( ! $this->context->is_allowed() ) { + return $html; + } + + $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); + $is_mobile = $this->is_mobile(); + + if ( ! $this->query->get_row( $url, $is_mobile ) ) { + return $html; + } + + /** + * Filters the Lazy Render Content processor to use. + * + * @since 3.17 + * + * @param string $processor The processor to use. + */ + $processor = wpm_apply_filters_typed( 'string', 'rocket_lrc_processor', 'dom' ); + + $this->processor->set_processor( $processor ); + + return $this->processor->get_processor()->add_hashes( $html ); + } + + /** + * Determines if the page is mobile and separate cache for mobile files is enabled. + * + * @return bool + */ + private function is_mobile(): bool { + return $this->options->get( 'cache_mobile', 0 ) + && $this->options->get( 'do_caching_mobile_files', 0 ) + && wp_is_mobile(); + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php new file mode 100644 index 0000000000..3ee5a3b45f --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php @@ -0,0 +1,99 @@ +loadHTML( $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ) ) { + foreach ( libxml_get_errors() as $error ) { + Logger::error( $error->message, [ 'LazyRenderContent' ] ); + } + + libxml_clear_errors(); + + return $html; + } + + libxml_use_internal_errors( $internal_errors ); + + // Get the body element. + $body = $dom->getElementsByTagName( 'body' )->item( 0 ); + + if ( ! $body ) { + Logger::error( 'Body element not found in the HTML content.', [ 'LazyRenderContent' ] ); + + return $html; + } + + $this->add_hash_to_element( $body, 2 ); + + return $dom->saveHTML(); + } + + /** + * Add a hash to the element and its children. + * + * @param \DOMElement $element The element to add the hash to. + * @param int $depth The depth of the recursion. + */ + private function add_hash_to_element( $element, $depth ) { + if ( $depth < 0 ) { + return; + } + + $skip_tags = [ + 'DIV', + 'MAIN', + 'FOOTER', + 'SECTION', + 'ARTICLE', + 'HEADER', + ]; + + static $count = 0; + + foreach ( $element->childNodes as $child ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + if ( ! $child instanceof \DOMElement ) { + continue; + } + + if ( + XML_ELEMENT_NODE !== $child->nodeType // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + || + ! in_array( strtoupper( $child->tagName ), $skip_tags, true ) // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + ) { + continue; + } + + // Calculate the hash of the opening tag. + $child_html = $child->ownerDocument->saveHTML( $child ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + $opening_tag_html = strstr( $child_html, '>', true ) . '>'; + + $hash = md5( $opening_tag_html . $count ); + + ++$count; + + // Add the data-rocket-location-hash attribute. + $child->setAttribute( 'data-rocket-location-hash', $hash ); + + // Recursively process child elements. + $this->add_hash_to_element( $child, $depth - 1 ); + } + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor.php new file mode 100644 index 0000000000..070b29875f --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor.php @@ -0,0 +1,45 @@ +processor = new Dom(); + break; + case 'simplehtmldom': + $this->processor = new SimpleHtmlDom(); + break; + case 'regex': + $this->processor = new Regex(); + break; + default: + $this->processor = new Dom(); + } + } + + /** + * Get the processor. + * + * @return ProcessorInterface + */ + public function get_processor(): ProcessorInterface { + return $this->processor; + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/ProcessorInterface.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/ProcessorInterface.php new file mode 100644 index 0000000000..1a071cee7b --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/ProcessorInterface.php @@ -0,0 +1,15 @@ +]*>)(?>.*?<\/body>)/is', $html, $matches ); + + if ( ! $result ) { + Logger::error( 'Body element not found in the HTML content.', [ 'LazyRenderContent' ] ); + + return $html; + } + + return $this->add_hash_to_element( $html, $matches[0] ); + } + + /** + * Add a hash to the element and its children. + * + * @param string $html The HTML content. + * @param string $element The element to add the hash to. + * + * @return string + */ + private function add_hash_to_element( $html, $element ) { + $skip_tags = [ + 'div', + 'main', + 'footer', + 'section', + 'article', + 'header', + ]; + + $result = preg_match_all( '/(?><(' . implode( '|', $skip_tags ) . ')[^>]*>)/is', $element, $matches, PREG_SET_ORDER ); + + if ( ! $result ) { + Logger::error( 'No elements found in the HTML content.', [ 'LazyRenderContent' ] ); + + return $html; + } + + $count = 0; + + foreach ( $matches as $child ) { + // Calculate the hash of the opening tag. + $opening_tag_html = strstr( $child[0], '>', true ) . '>'; + + $hash = md5( $opening_tag_html . $count ); + + ++$count; + + // Add the data-rocket-location-hash attribute. + $replace = preg_replace( '/' . $child[1] . '/is', '$0 data-rocket-location-hash="' . $hash . '"', $child[0], 1 ); + + $html = preg_replace( '/' . preg_quote( $child[0], '/' ) . '/', $replace, $html, 1 ); + } + + return $html; + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php new file mode 100644 index 0000000000..3c7f88a2d4 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php @@ -0,0 +1,77 @@ +getElementByTagName( 'body' ); + + if ( $body instanceof SimpleHtmlDomBlank ) { + Logger::error( 'Body element not found in the HTML content.', [ 'LazyRenderContent' ] ); + + return $html; + } + + $this->add_hash_to_element( $body, 2 ); + + return $dom->save(); + } + + /** + * Add a hash to the element and its children. + * + * @param SimpleHtmlDomInterface $element The element to add the hash to. + * @param int $depth The depth of the recursion. + */ + private function add_hash_to_element( $element, $depth ) { + if ( $depth < 0 ) { + return; + } + + $skip_tags = [ + 'DIV', + 'MAIN', + 'FOOTER', + 'SECTION', + 'ARTICLE', + 'HEADER', + ]; + + static $count = 0; + + foreach ( $element->childNodes() as $child ) { + if ( ! in_array( strtoupper( $child->getTag() ), $skip_tags, true ) ) { + continue; + } + + // Calculate the hash of the opening tag. + $child_html = $child->html(); + $opening_tag_html = strstr( $child_html, '>', true ) . '>'; + + $hash = md5( $opening_tag_html . $count ); + + ++$count; + + // Add the data-rocket-location-hash attribute. + $child->setAttribute( 'data-rocket-location-hash', $hash ); + + // Recursively process child elements. + $this->add_hash_to_element( $child, $depth - 1 ); + } + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php new file mode 100644 index 0000000000..cbc2dc2bc4 --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -0,0 +1,46 @@ +controller = $controller; + } + + /** + * Returns an array of events that this subscriber wants to listen to. + * + * @return array + */ + public static function get_subscribed_events(): array { + return [ + 'rocket_buffer' => [ 'add_hashes', 16 ], + ]; + } + + /** + * Add hashes to the HTML elements + * + * @param string $html The HTML content. + * + * @return string + */ + public function add_hashes( $html ) { + return $this->controller->add_hashes( $html ); + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php index f05d0fce07..d05500274c 100644 --- a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php +++ b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php @@ -7,6 +7,8 @@ use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context; use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Table\LazyRenderContent as LRCTable; use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Queries\LazyRenderContent as LRCQuery; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\{Controller as FrontController, Subscriber as FrontSubscriber}; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Processor\Processor; class ServiceProvider extends AbstractServiceProvider { /** @@ -23,6 +25,9 @@ class ServiceProvider extends AbstractServiceProvider { 'lrc_factory', 'lrc_table', 'lrc_query', + 'lrc_frontend_processor', + 'lrc_frontend_controller', + 'lrc_frontend_subscriber', ]; /** @@ -56,5 +61,21 @@ public function register(): void { $this->getContainer()->get( 'lrc_query' ), ] ); + $this->getContainer()->add( 'lrc_frontend_processor', Processor::class ); + $this->getContainer()->add( 'lrc_frontend_controller', FrontController::class ) + ->addArguments( + [ + $this->getContainer()->get( 'lrc_frontend_processor' ), + $this->getContainer()->get( 'lrc_context' ), + $this->getContainer()->get( 'lrc_query' ), + $this->getContainer()->get( 'options' ), + ] + ); + $this->getContainer()->addShared( 'lrc_frontend_subscriber', FrontSubscriber::class ) + ->addArguments( + [ + $this->getContainer()->get( 'lrc_frontend_controller' ), + ] + ); } } diff --git a/inc/Plugin.php b/inc/Plugin.php index dd5895d647..eccb82bf5f 100644 --- a/inc/Plugin.php +++ b/inc/Plugin.php @@ -399,6 +399,7 @@ private function init_common_subscribers() { 'performance_hints_cron_subscriber', 'performance_hints_warmup_subscriber', 'performance_hints_admin_subscriber', + 'lrc_frontend_subscriber', ]; $host_type = HostResolver::get_host_service(); diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php new file mode 100644 index 0000000000..12d89731c9 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php @@ -0,0 +1,23 @@ + [ + 'html' => 'test', + 'expected' => 'test', + ], + 'testShouldReturnOriginalWhenMissingBody' => [ + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnOriginalWhenDepthIsZero' => [ + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnUpdated' => [ + 'html' => $original, + 'expected' => $expected, + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php new file mode 100644 index 0000000000..040220408e --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php @@ -0,0 +1,16 @@ + [ + 'processor' => 'dom', + ], + 'testShouldReturnSimpleHtmlDomProcessor' => [ + 'processor' => 'simplehtmldom', + ], + 'testShouldReturnRegexProcessor' => [ + 'processor' => 'regex', + ], + 'testShouldReturnDomProcessorWhenIncorrectValue' => [ + 'processor' => 'incorrect', + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php new file mode 100644 index 0000000000..21bb144158 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php @@ -0,0 +1,23 @@ + [ + 'html' => 'test', + 'expected' => 'test', + ], + 'testShouldReturnOriginalWhenMissingBody' => [ + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnOriginalWhenDepthIsZero' => [ + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnUpdated' => [ + 'html' => $original, + 'expected' => $expected, + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php new file mode 100644 index 0000000000..12d89731c9 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php @@ -0,0 +1,23 @@ + [ + 'html' => 'test', + 'expected' => 'test', + ], + 'testShouldReturnOriginalWhenMissingBody' => [ + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnOriginalWhenDepthIsZero' => [ + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnUpdated' => [ + 'html' => $original, + 'expected' => $expected, + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expected.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expected.html new file mode 100644 index 0000000000..c29f6f1a60 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expected.html @@ -0,0 +1,24 @@ + + + Original + + +
+
+
+

Original

+
+
+
+

Text

+

Original content

+
+
+
+
+
+

Original footer

+
+
+ + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expectedRegex.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expectedRegex.html new file mode 100644 index 0000000000..bee28babe6 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/expectedRegex.html @@ -0,0 +1,24 @@ + + + Original + + +
+
+
+

Original

+
+
+
+

Text

+

Original content

+
+
+
+
+
+

Original footer

+
+
+ + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/original.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/original.html new file mode 100644 index 0000000000..024512c570 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/original.html @@ -0,0 +1,24 @@ + + + Original + + +
+
+
+

Original

+
+
+
+

Text

+

Original content

+
+
+
+
+
+

Original footer

+
+
+ + diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php new file mode 100644 index 0000000000..df464679ad --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom/addHashes.php @@ -0,0 +1,30 @@ +processor = new Dom(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $html, $expected ) { + $this->assertSame( + $this->format_the_html( $expected ), + $this->format_the_html( $this->processor->add_hashes( $html ) ) + ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php new file mode 100644 index 0000000000..50fecd0109 --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Processor/getProcessor.php @@ -0,0 +1,34 @@ +processor = new Processor(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $processor ) { + $this->processor->set_processor( $processor ); + + $this->assertInstanceOf( + ProcessorInterface::class, + $this->processor->get_processor() + ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php new file mode 100644 index 0000000000..9d1fd59f5e --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Regex/addHashes.php @@ -0,0 +1,30 @@ +processor = new Regex(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $html, $expected ) { + $this->assertSame( + $this->format_the_html( $expected ), + $this->format_the_html( $this->processor->add_hashes( $html ) ) + ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php new file mode 100644 index 0000000000..efd5c2e55f --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom/addHashes.php @@ -0,0 +1,30 @@ +processor = new SimpleHtmlDom(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $html, $expected ) { + $this->assertSame( + $this->format_the_html( $expected ), + $this->format_the_html( $this->processor->add_hashes( $html ) ) + ); + } +} From 2510e861c4e881c7546f8ce020c948efa0384de3 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:59:59 +0100 Subject: [PATCH 082/192] Inject beacon for other factories without optimization data in db (#6876) --- .../Common/PerformanceHints/Frontend/Processor.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index 19442a6718..7566fd51c9 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -58,20 +58,16 @@ public function maybe_apply_optimizations( string $html ): string { $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); $is_mobile = $this->is_mobile(); - $html_optimized = null; - // Flag to check if any optimization has been applied. - $optimization_applied = false; - foreach ( $this->factories as $factory ) { $row = $factory->queries()->get_row( $url, $is_mobile ); if ( empty( $row ) ) { + // Flag false if optimization has not been applied. + $optimization_applied = false; continue; } - $html_optimized = $factory->get_frontend_controller()->optimize( $html, $row ); - // Update html for the next iteration. - $html = $html_optimized; + $html = $factory->get_frontend_controller()->optimize( $html, $row ); // Set flag as true since optimization has been applied. $optimization_applied = true; } @@ -81,7 +77,7 @@ public function maybe_apply_optimizations( string $html ): string { $html = $this->inject_beacon( $html, $url, $is_mobile ); } - return $html_optimized ?? $html; + return $html; } /** From 7ba09e60c6220614b090b288451903284df2436e Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 21 Aug 2024 09:31:31 +0100 Subject: [PATCH 083/192] Add period check and environment check to wamr_up methods :closes: #6850 --- .../PerformanceHints/WarmUp/Controller.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php index 5bffd9b05d..4a4e7a3c74 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php @@ -66,6 +66,14 @@ public function __construct( array $factories, Options_Data $options, APIClient * @return void */ public function warm_up_home(): void { + if ( 'local' === wp_get_environment_type() ) { + return; + } + + if ( $this->user->is_license_expired_grace_period() ) { + return; + } + if ( (bool) $this->options->get( 'remove_unused_css', 0 ) ) { return; } @@ -88,6 +96,10 @@ public function warm_up(): void { return; } + if ( $this->user->is_license_expired_grace_period() ) { + return; + } + if ( (bool) $this->options->get( 'remove_unused_css', 0 ) ) { return; } @@ -109,10 +121,6 @@ public function warm_up(): void { * @return array */ public function fetch_links(): array { - if ( $this->user->is_license_expired_grace_period() ) { - return []; - } - $user_agent = 'WP Rocket/Pre-fetch Home Links Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'; $home_url = home_url(); From 8ba49663ec68dd627590072ea290f0e5fc585d57 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Wed, 21 Aug 2024 09:53:41 +0100 Subject: [PATCH 084/192] Remove Not operator (#6880) --- .../Optimization/LazyRenderContent/Frontend/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index 6c15a1b7a6..2b9d931fb9 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -69,7 +69,7 @@ public function add_hashes( $html ) { $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); $is_mobile = $this->is_mobile(); - if ( ! $this->query->get_row( $url, $is_mobile ) ) { + if ( $this->query->get_row( $url, $is_mobile ) ) { return $html; } From 6a6f33474550b91fcb758aa6a231986b71422910 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 21 Aug 2024 10:27:27 +0100 Subject: [PATCH 085/192] Modify tests --- .../WarmUp/Controller/fetchLinks.php | 15 --------------- .../WarmUp/Subscriber/warmUp.php | 17 +++++++++++++++++ .../WarmUp/Subscriber/warmUp.php | 7 +++++-- .../WarmUp/Controller/fetchLinks.php | 3 --- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php index b87b5b1d41..0abf3937fb 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php @@ -11,21 +11,6 @@ $html_with_rss_feed_rest_api = 'RSS FeedRest APIHello World 4Hello World 5Hello World 6Hello World 7Hello World 8Hello World 9Rich Dad Poor DadBuy (He came to set the captives free) - Rebecca BrownHome'; return [ - 'shouldReturnEmptyWhenLicenseExpired' => [ - 'config' => [ - 'license_expired' => true, - 'headers' => [ - 'user-agent' => 'WP Rocket/Pre-fetch Home Links Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1', - 'timeout' => 60, - ], - 'response' => [ - 'response' => [ - 'code' => 500, - ], - ], - ], - 'expected' => [], - ], 'shouldReturnEmptyWhenNot200' => [ 'config' => [ 'license_expired' => false, diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php index 892aaad7b6..5c14bb2383 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php @@ -5,6 +5,7 @@ 'wp_env' => 'production', 'remove_unused_css' => 0, 'is_allowed' => [1], + 'license_expired' => false, 'links' => [ 'http://example.com/link1', 'http://example.com/link2', @@ -12,11 +13,25 @@ ], 'expected' => 2, ], + 'testShouldNotCallSendToSaasWhenLicenseExpired' => [ + 'config' => [ + 'wp_env' => 'production', + 'remove_unused_css' => 0, + 'is_allowed' => [1], + 'license_expired' => true, + 'links' => [ + 'http://example.com/link1', + 'http://example.com/link2', + ], + ], + 'expected' => 0, + ], 'testShouldNotCallSendToSaasWhenLocalEnv' => [ 'config' => [ 'wp_env' => 'local', 'remove_unused_css' => 0, 'is_allowed' => [1], + 'license_expired' => false, 'links' => [ 'http://example.com/link1', 'http://example.com/link2', @@ -28,6 +43,7 @@ 'config' => [ 'wp_env' => 'production', 'remove_unused_css' => 1, + 'license_expired' => false, 'is_allowed' => [1], 'links' => [ 'http://example.com/link1', @@ -40,6 +56,7 @@ 'config' => [ 'wp_env' => 'production', 'remove_unused_css' => 0, + 'license_expired' => false, 'is_allowed' => [], 'links' => [ 'http://example.com/link1', diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php index f8ba9d85ab..436dce0f71 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUp.php @@ -39,16 +39,19 @@ public function testShouldDoExpected( $config, $expected ) { $options->shouldReceive('get') ->with('remove_unused_css', 0) ->andReturn($config['remove_unused_css']); + + $user->shouldReceive( 'is_license_expired_grace_period' ) + ->once() + ->andReturn( $config['license_expired'] ); } $queue->shouldReceive('add_job_warmup_url') ->times($expected); - add_action('rocket_job_warmup', [$controller, 'warm_up']); do_action('rocket_job_warmup'); - + remove_action('rocket_job_warmup', [$controller, 'warm_up']); } } diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php index b8786206b6..b4817a5a01 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/WarmUp/Controller/fetchLinks.php @@ -33,9 +33,6 @@ protected function setUp(): void { * @dataProvider configTestData */ public function testShouldReturnExpected( $config, $expected ) { - $this->user->shouldReceive( 'is_license_expired_grace_period' ) - ->once() - ->andReturn( $config['license_expired'] ); Functions\when( 'home_url' )->alias( function ( $link = '' ) { From ebcbbb371b45764ebf60bdda7e899e9ecb9a2a44 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 21 Aug 2024 11:00:58 +0100 Subject: [PATCH 086/192] Add test for home page warm up --#6850 --- .../WarmUp/Subscriber/warmUpHome.php | 53 +++++++++++++++++ .../WarmUp/Subscriber/warmUpHome.php | 57 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php create mode 100644 tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php new file mode 100644 index 0000000000..1c18725374 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php @@ -0,0 +1,53 @@ + [ + 'config' => [ + 'wp_env' => 'production', + 'remove_unused_css' => 0, + 'factories' => [1], + 'license_expired' => false, + 'home_url' => 'http://example.com/', + ], + 'expected' => 1, + ], + 'testShouldNotCallSendToSaasWhenLicenseExpired' => [ + 'config' => [ + 'wp_env' => 'production', + 'remove_unused_css' => 0, + 'factories' => [1], + 'license_expired' => true, + 'home_url' => 'http://example.com/', + ], + 'expected' => 0, + ], + 'testShouldNotCallSendToSaasWhenLocalEnv' => [ + 'config' => [ + 'wp_env' => 'local', + 'remove_unused_css' => 0, + 'factories' => [1], + 'license_expired' => false, + 'home_url' => 'http://example.com/', + ], + 'expected' => 0, + ], + 'testShouldNotCallSendToSaasWhenRemoveUnusedCssEnabled' => [ + 'config' => [ + 'wp_env' => 'production', + 'remove_unused_css' => 1, + 'license_expired' => false, + 'factories' => [1], + 'home_url' => 'http://example.com/', + ], + 'expected' => 0, + ], + 'testShouldNotCallSendToSaasWhenFactoriesAreEmpty' => [ + 'config' => [ + 'wp_env' => 'production', + 'remove_unused_css' => 0, + 'license_expired' => false, + 'factories' => [], + 'home_url' => 'http://example.com/', + ], + 'expected' => 0, + ], +]; diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php new file mode 100644 index 0000000000..5fb64510ef --- /dev/null +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php @@ -0,0 +1,57 @@ +makePartial(); + + $controller->shouldReceive('send_to_saas') + ->andReturn($config['home_url']); + + Functions\expect( 'wp_get_environment_type' )->andReturn($config['wp_env']); + + $queue->shouldReceive('add_job_warmup') + ->times($expected); + + if ( 'local' !== $config['wp_env'] ) { + $options->shouldReceive('get') + ->with('remove_unused_css', 0) + ->andReturn($config['remove_unused_css']); + + $user->shouldReceive( 'is_license_expired_grace_period' ) + ->once() + ->andReturn( $config['license_expired'] ); + } + + add_action('rocket_after_clear_performance_hints_data', [$controller, 'warm_up_home']); + + do_action('rocket_after_clear_performance_hints_data'); + + remove_action('rocket_after_clear_performance_hints_data', [$controller, 'warm_up_home']); + } +} From a560c6b03d4bb64118ab10ee88decc15c54e6e62 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 21 Aug 2024 14:54:18 +0100 Subject: [PATCH 087/192] Closes #6828 Add Ajax for LRC (#6873) --- .../AJAX/AJAXControllerTrait.php | 31 ++ .../Media/AboveTheFold/AJAX/Controller.php | 27 +- .../LazyRenderContent/AJAX/Controller.php | 140 +++++++++ .../LazyRenderContent/Factory.php | 16 +- .../LazyRenderContent/ServiceProvider.php | 21 +- .../AJAX/Controller/addData.php | 291 ++++++++++++++++++ .../AJAX/Controller/checkData.php | 53 ++++ .../AJAX/Controller/addData.php | 107 +++++++ .../AJAX/Controller/checkData.php | 83 +++++ 9 files changed, 734 insertions(+), 35 deletions(-) create mode 100644 inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php create mode 100644 inc/Engine/Optimization/LazyRenderContent/AJAX/Controller.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php diff --git a/inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php b/inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php new file mode 100644 index 0000000000..56ae3fcf41 --- /dev/null +++ b/inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php @@ -0,0 +1,31 @@ +query = $query; + $this->context = $context; + } + + /** + * Add LRC data to the database + * + * @return array + */ + public function add_data(): array { + $payload = []; + check_ajax_referer( 'rocket_beacon', 'rocket_beacon_nonce' ); + + if ( ! $this->context->is_allowed() ) { + $payload['lrc'] = 'not allowed'; + + return $payload; + } + + $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; + $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; + $results = isset( $_POST['results'] ) ? json_decode( wp_unslash( $_POST['results'] ) ) : (object) [ 'lrc' => [] ]; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $hashes = $results->lrc ?? []; + $below_the_fold = []; + + /** + * Filters the maximum number of LRC hashes being saved into the database. + * + * @param int $max_number Maximum number to allow. + * @param string $url Current page url. + * @param string[]|array $hashes Current list of LRC hashes. + */ + $max_lrc_hashes_number = wpm_apply_filters_typed( 'integer', 'rocket_lrc_hashes_number', 20, $url, $hashes ); + if ( 0 >= $max_lrc_hashes_number ) { + $max_lrc_hashes_number = 1; + } + + foreach ( (array) $hashes as $hash ) { + $below_the_fold[] = sanitize_text_field( wp_unslash( $hash ) ); + --$max_lrc_hashes_number; + } + + $row = $this->query->get_row( $url, $is_mobile ); + if ( ! empty( $row ) ) { + $payload['lrc'] = 'item already in the database'; + + return $payload; + } + + $status = isset( $_POST['status'] ) ? sanitize_text_field( wp_unslash( $_POST['status'] ) ) : ''; + list( $status_code, $status_message ) = $this->get_status_code_message( $status ); + + $item = [ + 'url' => $url, + 'is_mobile' => $is_mobile, + 'status' => $status_code, + 'error_message' => $status_message, + 'below_the_fold' => ( is_array( $below_the_fold ) || is_object( $below_the_fold ) ) ? wp_json_encode( $below_the_fold ) : $below_the_fold, + 'last_accessed' => current_time( 'mysql', true ), + 'created_at' => current_time( 'mysql', true ), + ]; + + $result = $this->query->add_item( $item ); + $payload['lrc'] = $item; + + if ( ! $result ) { + $payload['lrc'] = 'error when adding the entry to the database'; + } + + return $payload; + } + + /** + * Checks if there is existing data for the current URL and device type from the beacon script. + * + * This method is called via AJAX. It checks if there is existing LRC data for the current URL and device type. + * If the data exists, it returns a JSON success response with true. If the data does not exist, it returns a JSON success response with false. + * If the context is not allowed, it returns a JSON error response with false. + * + * @return array + */ + public function check_data(): array { + $payload = [ + 'lrc' => false, + ]; + check_ajax_referer( 'rocket_beacon', 'rocket_beacon_nonce' ); + + if ( ! $this->context->is_allowed() ) { + $payload['lrc'] = true; + return $payload; + } + + $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; + $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; + + $row = $this->query->get_row( $url, $is_mobile ); + + if ( ! empty( $row ) ) { + $payload['lrc'] = true; + } + + return $payload; + } +} diff --git a/inc/Engine/Optimization/LazyRenderContent/Factory.php b/inc/Engine/Optimization/LazyRenderContent/Factory.php index 3616883e88..8eed15fe49 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Factory.php +++ b/inc/Engine/Optimization/LazyRenderContent/Factory.php @@ -51,14 +51,16 @@ class Factory implements FactoryInterface { /** * Instantiate the class. * - * @param ContextInterface $context LRC Context instance. - * @param TableInterface $table LRC Table instance. - * @param QueriesInterface $queries LRC Queries instance. + * @param ContextInterface $context LRC Context instance. + * @param TableInterface $table LRC Table instance. + * @param QueriesInterface $queries LRC Queries instance. + * @param AjaxControllerInterface $ajax_controller LRC AJAX Controller instance. */ - public function __construct( ContextInterface $context, TableInterface $table, QueriesInterface $queries ) { - $this->context = $context; - $this->table = $table; - $this->queries = $queries; + public function __construct( ContextInterface $context, TableInterface $table, QueriesInterface $queries, AjaxControllerInterface $ajax_controller ) { + $this->context = $context; + $this->table = $table; + $this->queries = $queries; + $this->ajax_controller = $ajax_controller; } /** diff --git a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php index d05500274c..a5a52977b5 100644 --- a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php +++ b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php @@ -7,6 +7,7 @@ use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context; use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Table\LazyRenderContent as LRCTable; use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Queries\LazyRenderContent as LRCQuery; +use WP_Rocket\Engine\Optimization\LazyRenderContent\AJAX\Controller as AJAXController; use WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\{Controller as FrontController, Subscriber as FrontSubscriber}; use WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Processor\Processor; @@ -25,6 +26,7 @@ class ServiceProvider extends AbstractServiceProvider { 'lrc_factory', 'lrc_table', 'lrc_query', + 'lrc_ajax_controller', 'lrc_frontend_processor', 'lrc_frontend_controller', 'lrc_frontend_subscriber', @@ -53,12 +55,15 @@ public function register(): void { $this->getContainer()->add( 'lrc_query', LRCQuery::class ); - $this->getContainer()->addShared( 'lrc_factory', Factory::class ) + $this->getContainer()->addShared( 'lrc_table', LRCTable::class ); + + $this->getContainer()->add( 'lrc_query', LRCQuery::class ); + + $this->getContainer()->add( 'lrc_ajax_controller', AJAXController::class ) ->addArguments( [ - $this->getContainer()->get( 'lrc_context' ), - $this->getContainer()->get( 'lrc_table' ), $this->getContainer()->get( 'lrc_query' ), + $this->getContainer()->get( 'lrc_context' ), ] ); $this->getContainer()->add( 'lrc_frontend_processor', Processor::class ); @@ -77,5 +82,15 @@ public function register(): void { $this->getContainer()->get( 'lrc_frontend_controller' ), ] ); + + $this->getContainer()->addShared( 'lrc_factory', Factory::class ) + ->addArguments( + [ + $this->getContainer()->get( 'lrc_context' ), + $this->getContainer()->get( 'lrc_table' ), + $this->getContainer()->get( 'lrc_query' ), + $this->getContainer()->get( 'lrc_ajax_controller' ), + ] + ); } } diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php new file mode 100644 index 0000000000..5c2796a174 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php @@ -0,0 +1,291 @@ + [ + 'config' => [ + 'filter' => false, + 'url' => 'http://example.org', + 'is_mobile' => false, + 'results' => json_encode( + [ + 'lrc' => [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] + ], + ), + ], + 'expected' => [ + 'item' => [ + 'url' => 'http://example.org', + 'is_mobile' => false, + 'status' => 'completed', + 'below_the_fold' => json_encode( [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] ), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + 'error_message' => '' + ], + 'result' => false, + 'message' => 'not allowed', + ], + ], + 'testShouldBailoutWhenDBError' => [ + 'config' => [ + 'filter' => true, + 'url' => 'http://example.org', + 'is_mobile' => false, + 'results' => json_encode( + [ + 'lrc' => [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] + ], + ), + ], + 'expected' => [ + 'item' => [ + 'url' => 'http://example.org', + 'is_mobile' => false, + 'status' => 'completed', + 'below_the_fold' => json_encode( [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] ), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + 'error_message' => '' + ], + 'result' => false, + 'message' => 'error when adding the entry to the database', + ], + ], + 'testShouldAddItemToDB' => [ + 'config' => [ + 'filter' => true, + 'url' => 'http://example.org', + 'is_mobile' => false, + 'results' => json_encode( + [ + 'lrc' => [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] + ], + ), + ], + 'expected' => [ + 'item' => [ + 'url' => 'http://example.org', + 'is_mobile' => false, + 'status' => 'completed', + 'below_the_fold' => json_encode( [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] ), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + 'error_message' => '' + ], + 'result' => true, + 'message' => [ + 'url' => 'http://example.org', + 'is_mobile' => false, + 'status' => 'completed', + 'error_message' => '', + 'below_the_fold' => json_encode([ + (object)[ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ] + ], + ), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + ], + ], + ], + 'testShouldAddItemToDBWhenMobile' => [ + 'config' => [ + 'filter' => true, + 'url' => 'http://example.org', + 'is_mobile' => true, + 'results' => json_encode( + [ + 'lrc' => [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] + ], + ), + ], + 'expected' => [ + 'item' => [ + 'url' => 'http://example.org', + 'is_mobile' => true, + 'status' => 'completed', + 'below_the_fold' => json_encode( [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] ), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + 'error_message' => '' + ], + 'result' => true, + 'message' => [ + 'url' => 'http://example.org', + 'is_mobile' => true, + 'status' => 'completed', + 'error_message' => '', + 'below_the_fold' => json_encode([ + (object)[ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ] + ], + ), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + ], + ], + ], + 'testShouldSanitizeBelowTheFold' => [ + 'config' => [ + 'filter' => true, + 'url' => 'http://example.org', + 'is_mobile' => true, + 'results' => json_encode( + [ + 'lrc' => [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] + ], + ), + ], + 'expected' => [ + 'valid_source' => [ + 'db47c7d69edcf4565baa182deb470091' => 'db47c7d69edcf4565alert(Test%20XSS);baa182deb470091', + 'db47c7d69edcf4565baa182deb470092' => 'alert(Test%20XSS);db47c7d69edcf4565baa182deb470092' + ], + 'item' => [ + 'url' => 'http://example.org', + 'is_mobile' => true, + 'status' => 'completed', + 'below_the_fold' => json_encode( [ + (object) [ + 'db47c7d69edcf4565alert(Test%20XSS);baa182deb470091', + 'alert(Test%20XSS);db47c7d69edcf4565baa182deb470092', + ], + ] ), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + 'error_message' => '' + ], + 'result' => true, + 'message' => [ + 'url' => 'http://example.org', + 'is_mobile' => true, + 'status' => 'completed', + 'error_message' => '', + 'below_the_fold' => json_encode([ + (object)[ + 'db47c7d69edcf4565alert(Test%20XSS);baa182deb470091', + 'alert(Test%20XSS);db47c7d69edcf4565baa182deb470092', + ] + ]), + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + ], + ], + ], + 'testShouldNotAddItemToDBWhenNoData' => [ + 'config' => [ + 'filter' => true, + 'url' => 'http://example.com', + 'is_mobile' => false, + 'results' => json_encode( + [ + 'lrc' => [] + ], + ), + ], + 'expected' => [ + 'item' => [ + 'url' => 'http://example.com', + 'is_mobile' => false, + 'status' => 'completed', + 'error_message' => '', + 'below_the_fold' => '[]', + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + ], + 'result' => true, + 'message' => [ + 'url' => 'http://example.com', + 'is_mobile' => false, + 'status' => 'completed', + 'error_message' => '', + 'below_the_fold' => '[]', + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + ], + ], + ], + 'testShouldAddItemToDBWhenScriptTimeout' => [ + 'config' => [ + 'filter' => true, + 'url' => 'http://example.com', + 'is_mobile' => false, + 'status' => 'timeout', + 'results' => json_encode( + [ + 'lrc' => [] + ], + ), + ], + 'expected' => [ + 'item' => [ + 'url' => 'http://example.com', + 'is_mobile' => false, + 'status' => 'failed', + 'error_message' => 'Script timeout', + 'below_the_fold' => '[]', + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + ], + 'result' => true, + 'message' => [ + 'url' => 'http://example.com', + 'is_mobile' => false, + 'status' => 'failed', + 'error_message' => 'Script timeout', + 'below_the_fold' => '[]', + 'last_accessed' => '2024-01-01 00:00:00', + 'created_at' => '2024-01-01 00:00:00', + ], + ], + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php new file mode 100644 index 0000000000..9e194bad1d --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php @@ -0,0 +1,53 @@ + [ + 'config' => [ + 'url' => 'http://example.org', + 'is_mobile' => false, + 'filter' => false, + 'row' => (object) [ + 'below_the_fold' => json_encode( [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] ), + ], + ], + 'expected' => [ + 'result' => true, + 'message' => true + ], + ], + 'testShouldReturnSuccess' => [ + 'config' => [ + 'url' => 'http://example.org', + 'is_mobile' => false, + 'filter' => true, + 'row' => (object) [ + 'below_the_fold' => json_encode( [ + (object) [ + 'db47c7d69edcf4565baa182deb470091', + 'db47c7d69edcf4565baa182deb470092', + ], + ] ), + ], + ], + 'expected' => [ + 'result' => true, + 'message' => true + ], + ], + 'testShouldReturnError' => [ + 'config' => [ + 'url' => 'http://example.org', + 'is_mobile' => false, + 'row' => false, + 'filter' => true, + ], + 'expected' => [ + 'result' => false, + 'message' => false + ], + ], +]; diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php new file mode 100644 index 0000000000..114913a2ad --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/addData.php @@ -0,0 +1,107 @@ +query = $this->createPartialMock( LazyRenderContent::class, [ 'add_item' ] ); + $this->context = Mockery::mock( Context::class ); + $this->controller = new Controller( $this->query, $this->context ); + $this->temp_post = $_POST; + + + $this->stubEscapeFunctions(); + } + + protected function tearDown(): void { + unset( $_POST ); + $_POST = $this->temp_post; + + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $this->stubEscapeFunctions(); + $this->stubTranslationFunctions(); + + $_POST = [ + 'url' => addslashes( $config['url'] ), + 'is_mobile' => addslashes( $config['is_mobile'] ), + 'results' => addslashes( $config['results'] ), + 'status' => addslashes( $config['status'] ?? 'success' ), + ]; + + Functions\expect( 'check_ajax_referer' ) + ->once() + ->with( 'rocket_beacon', 'rocket_beacon_nonce' ) + ->andReturn( true ); + + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + $valid_source = $expected['valid_source'] ?? []; + + if(empty($valid_source)) { + Functions\when( 'sanitize_text_field' )->alias( + function ( $value ) { + return is_string( $value ) ? strip_tags( $value ) : $value; + } + ); + } else{ + Functions\when('sanitize_text_field')->alias( + function ($value) use ($valid_source) { + $arr_value = []; + if (!is_string($value)) { + foreach ($valid_source as $key => $replacement) { + $arr_value[] = strip_tags($replacement); + } + return (object) $arr_value; + } + + return strip_tags($value); + } + ); + } + + Functions\when( 'current_time' ) + ->justReturn( $expected['item']['last_accessed'] ); + + $this->query->method( 'add_item' ) + ->with( $expected['item'] ) + ->willReturn( $expected['result'] ); + + Functions\when( 'wp_unslash' )->alias( + function ( $value ) { + return is_string( $value ) ? stripslashes( $value ) : $value; + } + ); + + $this->stubWpParseUrl(); + + $this->assertSame( [ 'lrc' => $expected['message'] ], $this->controller->add_data() ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php new file mode 100644 index 0000000000..b30dff9b59 --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/AJAX/Controller/checkData.php @@ -0,0 +1,83 @@ +query = $this->createPartialMock( LazyRenderContent::class, [ 'get_row' ] ); + $this->context = Mockery::mock( Context::class ); + $this->controller = new Controller( $this->query, $this->context ); + $this->temp_post = $_POST; + + + $this->stubEscapeFunctions(); + } + + protected function tearDown(): void { + unset( $_POST ); + $_POST = $this->temp_post; + + parent::tearDown(); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $this->stubEscapeFunctions(); + $this->stubTranslationFunctions(); + + $_POST = [ + 'url' => addslashes( $config['url'] ), + 'is_mobile' => addslashes( $config['is_mobile'] ), + ]; + + $this->context->shouldReceive( 'is_allowed' ) + ->atMost() + ->once() + ->andReturn( $config['filter'] ); + + Functions\expect( 'check_ajax_referer' ) + ->once() + ->with( 'rocket_beacon', 'rocket_beacon_nonce' ) + ->andReturn( true ); + + Functions\when('esc_url_raw')->alias( + function( $url ){ + return $url; + } + ); + + Functions\when( 'wp_unslash' )->alias( + function ( $value ) { + return is_string( $value ) ? stripslashes( $value ) : $value; + } + ); + + $this->query->method( 'get_row' ) + ->with( $config['url'], $config['is_mobile'] ) + ->willReturn( $config['row'] ); + + $this->assertSame( [ 'lrc' => $expected['message'] ], $this->controller->check_data() ); + } +} From 90991239762bce936b5168e8a65c2aa3b468e5f1 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Wed, 21 Aug 2024 15:23:09 +0100 Subject: [PATCH 088/192] fixed conflicts --- assets/js/wpr-beacon.min.js.map | 5 ----- 1 file changed, 5 deletions(-) diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 57e814973c..2da16b02b1 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,12 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], -<<<<<<< HEAD "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n let shouldSaveResultsIntoDB = false;\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n shouldSaveResultsIntoDB = true;\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available\");\n }\n if (shouldSaveResultsIntoDB) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], "mappings": "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", -======= - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n let shouldSaveResultsIntoDB = false;\n const shouldGenerateLcp = this.config.status.atf && isGeneratedBefore === false;\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n shouldSaveResultsIntoDB = true;\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available\");\n }\n if (shouldSaveResultsIntoDB) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.success;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], - "mappings": "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", ->>>>>>> feature/lrc "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldSaveResultsIntoDB", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] } From 249e8e5c4df8de8360128e3ec211fd0849c9f5b9 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 21 Aug 2024 15:35:16 +0100 Subject: [PATCH 089/192] closes #6883 Add action for performance hints data clear url --- inc/Engine/Cache/PurgeActionsSubscriber.php | 25 ++++++++++--------- .../PerformanceHints/Admin/Controller.php | 8 ++++++ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/inc/Engine/Cache/PurgeActionsSubscriber.php b/inc/Engine/Cache/PurgeActionsSubscriber.php index bed2dcae19..198ef0543d 100644 --- a/inc/Engine/Cache/PurgeActionsSubscriber.php +++ b/inc/Engine/Cache/PurgeActionsSubscriber.php @@ -44,21 +44,22 @@ public static function get_subscribed_events() { $slug = rocket_get_constant( 'WP_ROCKET_SLUG' ); return [ - 'profile_update' => 'purge_user_cache', - 'delete_user' => 'purge_user_cache', - 'create_term' => [ 'maybe_purge_cache_on_term_change', 10, 3 ], - 'edit_term' => [ 'maybe_purge_cache_on_term_change', 10, 3 ], - 'delete_term' => [ 'maybe_purge_cache_on_term_change', 10, 3 ], - 'after_rocket_clean_post' => [ + 'profile_update' => 'purge_user_cache', + 'delete_user' => 'purge_user_cache', + 'create_term' => [ 'maybe_purge_cache_on_term_change', 10, 3 ], + 'edit_term' => [ 'maybe_purge_cache_on_term_change', 10, 3 ], + 'delete_term' => [ 'maybe_purge_cache_on_term_change', 10, 3 ], + 'after_rocket_clean_post' => [ [ 'purge_dates_archives' ], [ 'purge_post_terms_urls' ], ], - 'rocket_saas_complete_job_status' => [ 'purge_url_cache', 100 ], - 'rocket_rucss_after_clearing_usedcss' => 'purge_url_cache', - 'rocket_after_save_dynamic_lists' => 'purge_cache_after_saving_dynamic_lists', - 'update_option_' . $slug => [ 'purge_cache_reject_uri_partially', 10, 2 ], - 'update_option_blog_public' => 'purge_cache', - 'wp_rocket_upgrade' => [ 'on_update', 10, 2 ], + 'rocket_saas_complete_job_status' => [ 'purge_url_cache', 100 ], + 'rocket_rucss_after_clearing_usedcss' => 'purge_url_cache', + 'rocket_performance_hints_data_after_clearing' => 'purge_url_cache', + 'rocket_after_save_dynamic_lists' => 'purge_cache_after_saving_dynamic_lists', + 'update_option_' . $slug => [ 'purge_cache_reject_uri_partially', 10, 2 ], + 'update_option_blog_public' => 'purge_cache', + 'wp_rocket_upgrade' => [ 'on_update', 10, 2 ], ]; } diff --git a/inc/Engine/Common/PerformanceHints/Admin/Controller.php b/inc/Engine/Common/PerformanceHints/Admin/Controller.php index 2e76308cde..63955eb71e 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Controller.php @@ -149,6 +149,14 @@ public function clean_url() { $url = $parse_url['scheme'] . '://' . $parse_url['host'] . $url; } + /** + * Fires after clearing performance hints data for specific url. + * + * + * @param string $url Current page URL. + */ + do_action( 'rocket_performance_hints_data_after_clearing', $url ); + $this->delete_by_url( $url ); } From 196cc465a838700eea58150d71e6553727ef361e Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 22 Aug 2024 11:01:46 +0100 Subject: [PATCH 090/192] Add to general test --- .../Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php index 5fb64510ef..42a6b454f0 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php @@ -14,10 +14,8 @@ /** * Test class covering \WP_Rocket\Engine\Common\PerformanceHints\WarmUp\Subscriber::warm_up_home * - * @group PerformanceHints - * @group WarmUp */ -class Test_warmUpHome extends TestCase { +class Test_WarmUpHome extends TestCase { /** * Test should do expected. * From 826789b950d838f5292855afa66032b88cce5c94 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 22 Aug 2024 11:50:04 +0100 Subject: [PATCH 091/192] revert test group changes --- .../Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php index 42a6b454f0..df9703bc1c 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber/warmUpHome.php @@ -14,6 +14,8 @@ /** * Test class covering \WP_Rocket\Engine\Common\PerformanceHints\WarmUp\Subscriber::warm_up_home * + * @group PerformanceHints + * @group WarmUp */ class Test_WarmUpHome extends TestCase { /** From 767c33173b1044757fda85c4a6ba3e4d5acd4271 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 22 Aug 2024 12:09:18 +0100 Subject: [PATCH 092/192] Fix lint --- inc/Engine/Common/PerformanceHints/Admin/Controller.php | 1 - 1 file changed, 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/Admin/Controller.php b/inc/Engine/Common/PerformanceHints/Admin/Controller.php index 63955eb71e..6ff7129a62 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Controller.php @@ -152,7 +152,6 @@ public function clean_url() { /** * Fires after clearing performance hints data for specific url. * - * * @param string $url Current page URL. */ do_action( 'rocket_performance_hints_data_after_clearing', $url ); From 76d0b1a2d6f729e7d087afc9095e172966244eb5 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 22 Aug 2024 14:36:10 +0100 Subject: [PATCH 093/192] Modify logic check --- .../PerformanceHints/WarmUp/Controller.php | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php index 4a4e7a3c74..fd77f7dd62 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php @@ -60,21 +60,26 @@ public function __construct( array $factories, Options_Data $options, APIClient $this->queue = $queue; } + /** + * Should terminate early if true. + * + * @return bool + */ + private function should_terminate_early(): bool { + return ( + 'local' === wp_get_environment_type() || + $this->user->is_license_expired_grace_period() || + (bool) $this->options->get( 'remove_unused_css', 0 ) + ); + } + /** * Send home URL for warm up. * * @return void */ public function warm_up_home(): void { - if ( 'local' === wp_get_environment_type() ) { - return; - } - - if ( $this->user->is_license_expired_grace_period() ) { - return; - } - - if ( (bool) $this->options->get( 'remove_unused_css', 0 ) ) { + if ( $this->should_terminate_early() ) { return; } @@ -92,15 +97,7 @@ public function warm_up_home(): void { * @return void */ public function warm_up(): void { - if ( 'local' === wp_get_environment_type() ) { - return; - } - - if ( $this->user->is_license_expired_grace_period() ) { - return; - } - - if ( (bool) $this->options->get( 'remove_unused_css', 0 ) ) { + if ( $this->should_terminate_early() ) { return; } From cdbb929c2c3e2af3fc21a687073b1db1c9d97fc9 Mon Sep 17 00:00:00 2001 From: WordPress Fan <146129302+wordpressfan@users.noreply.github.com> Date: Thu, 22 Aug 2024 16:56:05 +0300 Subject: [PATCH 094/192] LRC script implementation (#6874) Co-authored-by: Michael Lee --- assets/js/wpr-beacon.js | 128 ++++++++++++++++++++++++++++++-- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 11 +-- 3 files changed, 127 insertions(+), 14 deletions(-) diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index bc58da5e96..ae0eeaf2dd 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -190,6 +190,116 @@ }; var BeaconLcp_default = BeaconLcp; + // src/BeaconLrc.js + var BeaconLrc = class { + constructor(config, logger) { + this.config = config; + this.logger = logger; + this.lazyRenderElements = []; + } + async run() { + try { + const elementsInView = this._getLazyRenderElements(); + if (elementsInView) { + this._processElements(elementsInView); + } + } catch (err) { + this.errorCode = "script_error"; + this.logger.logMessage("Script Error: " + err); + } + } + _getLazyRenderElements() { + const elements = document.querySelectorAll(this.config.elements); + if (elements.length <= 0) { + return []; + } + const validElements = Array.from(elements).filter((element) => !this._skipElement(element)); + return validElements.map((element) => ({ + element, + depth: this._getElementDepth(element), + distance: this._getElementDistance(element), + hash: this._getLocationHash(element) + })); + } + _getElementDepth(element) { + let depth = 0; + let parent = element.parentElement; + while (parent) { + depth++; + parent = parent.parentElement; + } + return depth; + } + _getElementDistance(element) { + const rect = element.getBoundingClientRect(); + const scrollTop = window.pageYOffset || document.documentElement.scrollTop; + return rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight); + } + _skipElement(element) { + const skipStrings = this.config.skipStrings || ["memex"]; + if (!element || !element.id) return false; + return skipStrings.some((str) => element.id.toLowerCase().includes(str)); + } + _shouldSkipElement(element, exclusions) { + if (!element) return false; + for (let i = 0; i < exclusions.length; i++) { + const [attribute, pattern] = exclusions[i]; + const attributeValue = element.getAttribute(attribute); + if (attributeValue && new RegExp(pattern, "i").test(attributeValue)) { + return true; + } + } + return false; + } + _processElements(elements) { + elements.forEach(({ element, depth, distance, hash }) => { + if (this._shouldSkipElement(element, this.config.exclusions || [])) { + return; + } + if ("No hash detected" !== hash) { + this.lazyRenderElements.push(hash); + } + const style = distance > 1800 ? "color: green;" : distance === 0 ? "color: red;" : ""; + console.log(`%c${" ".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, style); + const xpath = this._getXPath(element); + console.log(`%c${" ".repeat(depth)}Xpath: ${xpath}`, style); + console.log(`%c${" ".repeat(depth)}Location hash: ${hash}`, style); + console.log(`%c${" ".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, style); + }); + } + _getXPath(element) { + if (element.id !== "") { + return `//*[@id="${element.id}"]`; + } + return this._getElementXPath(element); + } + _getElementXPath(element) { + if (element === document.body) { + return "/html/body"; + } + const position = this._getElementPosition(element); + return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`; + } + _getElementPosition(element) { + let pos = 1; + let sibling = element.previousElementSibling; + while (sibling) { + if (sibling.nodeName === element.nodeName) { + pos++; + } + sibling = sibling.previousElementSibling; + } + return pos; + } + _getLocationHash(element) { + return element.hasAttribute("data-rocket-location-hash") ? element.getAttribute("data-rocket-location-hash") : "No hash detected"; + } + getResults() { + return this.lazyRenderElements; + } + }; + var BeaconLrc_default = BeaconLrc; + // src/Logger.js var Logger = class { constructor(enabled) { @@ -209,6 +319,7 @@ constructor(config) { this.config = config; this.lcpBeacon = null; + this.lrcBeacon = null; this.infiniteLoopId = null; this.errorCode = ""; this.logger = new Logger_default(this.config.debug); @@ -223,16 +334,21 @@ this._handleInfiniteLoop(); }, 1e4); const isGeneratedBefore = await this._getGeneratedBefore(); - let shouldSaveResultsIntoDB = false; const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false); + const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false); if (shouldGenerateLcp) { this.lcpBeacon = new BeaconLcp_default(this.config, this.logger); await this.lcpBeacon.run(); - shouldSaveResultsIntoDB = true; } else { - this.logger.logMessage("Not running BeaconLcp because data is already available"); + this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"); + } + if (shouldGeneratelrc) { + this.lrcBeacon = new BeaconLrc_default(this.config, this.logger); + await this.lrcBeacon.run(); + } else { + this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"); } - if (shouldSaveResultsIntoDB) { + if (shouldGenerateLcp || shouldGeneratelrc) { this._saveFinalResultIntoDB(); } else { this.logger.logMessage("Not saving results into DB as no beacon features ran."); @@ -268,7 +384,8 @@ } _saveFinalResultIntoDB() { const results = { - lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null + lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null, + lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null }; const data = new FormData(); data.append("action", "rocket_beacon"); @@ -331,4 +448,5 @@ }, rocket_beacon_data.delay); }); })(window.rocket_beacon_data); + var BeaconEntryPoint_default = BeaconManager_default; })(); diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index 5558cce7e4..834eb5abb6 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var g=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,a=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||a>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=g,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const o=n.querySelector("img");if(o)s=o.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&c.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},a=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(r=>r!=="none");if(s.length===0)return null;const o=s[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const l=[...o.matchAll(a)];t.bg_set=l.map(r=>r[1]?{src:r[1].trim()+(r[2]?" "+r[2].trim():"")}:{}),t.bg_set.every(r=>r.src==="")&&(t.bg_set=l.map(r=>r[1]?{src:r[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",a=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||a)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,h=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},m=h,p=class{constructor(e){this.config=e,this.lcpBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new m(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore();let i=!1;this.config.status.atf&&(e===!1||e.lcp===!1)?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run(),i=!0):this.logger.logMessage("Not running BeaconLcp because data is already available"),i?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},f=p;(e=>{if(!e)return;const i=new f(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data)})(); +(()=>{var u=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||r>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=u,h=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const a=n.querySelector("img");if(a)s=a.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&c.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(o=>o!=="none");if(s.length===0)return null;const a=s[0];if(t.type="bg-img",a.includes("image-set(")&&(t.type="bg-img-set"),!a||a===""||a.includes("data:image"))return null;const g=[...a.matchAll(r)];t.bg_set=g.map(o=>o[1]?{src:o[1].trim()+(o[2]?" "+o[2].trim():"")}:{}),t.bg_set.every(o=>o.src==="")&&(t.bg_set=g.map(o=>o[1]?{src:o[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=h,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll(this.config.elements);return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return i.top+t-(window.innerHeight||document.documentElement.clientHeight)}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[]))return;n!=="No hash detected"&&this.lazyRenderElements.push(n);const s=r>1800?"color: green;":r===0?"color: red;":"";console.log(`%c${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,s);const a=this._getXPath(i);console.log(`%c${" ".repeat(t)}Xpath: ${a}`,s),console.log(`%c${" ".repeat(t)}Location hash: ${n}`,s),console.log(`%c${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,s)})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 57e814973c..cd7673486d 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,12 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], -<<<<<<< HEAD - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n let shouldSaveResultsIntoDB = false;\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n shouldSaveResultsIntoDB = true;\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available\");\n }\n if (shouldSaveResultsIntoDB) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], - "mappings": "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", -======= - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n let shouldSaveResultsIntoDB = false;\n const shouldGenerateLcp = this.config.status.atf && isGeneratedBefore === false;\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n shouldSaveResultsIntoDB = true;\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available\");\n }\n if (shouldSaveResultsIntoDB) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.success;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n})();\n"], - "mappings": "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", ->>>>>>> feature/lrc - "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldSaveResultsIntoDB", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance"] + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(this.config.elements);\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight);\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" !== hash) {\n this.lazyRenderElements.push(hash);\n }\n const style = distance > 1800 ? \"color: green;\" : distance === 0 ? \"color: red;\" : \"\";\n console.log(`%c${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, style);\n const xpath = this._getXPath(element);\n console.log(`%c${\"\t\".repeat(depth)}Xpath: ${xpath}`, style);\n console.log(`%c${\"\t\".repeat(depth)}Location hash: ${hash}`, style);\n console.log(`%c${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, style);\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], + "mappings": "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", + "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "style", "xpath", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] } From bea83ff6c4ecfba4fb427c14cb58ce04571b05b0 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Thu, 22 Aug 2024 16:34:56 +0100 Subject: [PATCH 095/192] Add the LRC Factory in the PerformanceHints (#6888) Co-authored-by: WordPressFan --- assets/js/wpr-beacon.js | 2 +- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 6 +- .../PerformanceHints/ServiceProvider.php | 1 + .../LazyRenderContent/Factory.php | 20 +- .../LazyRenderContent/Frontend/Controller.php | 28 +- .../LazyRenderContent/ServiceProvider.php | 1 + .../Subscriber/HTML/output_w_beacon.html | 2 +- .../HTML/output_with_beacon_and_atf_opt.html | 8 + .../Subscriber/maybe_apply_optimizations.php | 605 ++++++++++-------- tests/Integration/DBTrait.php | 25 + tests/Integration/bootstrap.php | 4 +- .../Subscriber/maybe_apply_optimizations.php | 9 +- 13 files changed, 444 insertions(+), 269 deletions(-) create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index 924603c8ba..ae0eeaf2dd 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -449,4 +449,4 @@ }); })(window.rocket_beacon_data); var BeaconEntryPoint_default = BeaconManager_default; -})(); \ No newline at end of file +})(); diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index 638a5315cf..834eb5abb6 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ (()=>{var u=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||r>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=u,h=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const a=n.querySelector("img");if(a)s=a.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&c.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(o=>o!=="none");if(s.length===0)return null;const a=s[0];if(t.type="bg-img",a.includes("image-set(")&&(t.type="bg-img-set"),!a||a===""||a.includes("data:image"))return null;const g=[...a.matchAll(r)];t.bg_set=g.map(o=>o[1]?{src:o[1].trim()+(o[2]?" "+o[2].trim():"")}:{}),t.bg_set.every(o=>o.src==="")&&(t.bg_set=g.map(o=>o[1]?{src:o[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=h,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll(this.config.elements);return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return i.top+t-(window.innerHeight||document.documentElement.clientHeight)}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[]))return;n!=="No hash detected"&&this.lazyRenderElements.push(n);const s=r>1800?"color: green;":r===0?"color: red;":"";console.log(`%c${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,s);const a=this._getXPath(i);console.log(`%c${" ".repeat(t)}Xpath: ${a}`,s),console.log(`%c${" ".repeat(t)}Location hash: ${n}`,s),console.log(`%c${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,s)})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); -//# sourceMappingURL=wpr-beacon.min.js.map \ No newline at end of file +//# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 7623631c59..3dd61b821f 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -4,4 +4,8 @@ "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(this.config.elements);\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight);\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" !== hash) {\n this.lazyRenderElements.push(hash);\n }\n const style = distance > 1800 ? \"color: green;\" : distance === 0 ? \"color: red;\" : \"\";\n console.log(`%c${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, style);\n const xpath = this._getXPath(element);\n console.log(`%c${\"\t\".repeat(depth)}Xpath: ${xpath}`, style);\n console.log(`%c${\"\t\".repeat(depth)}Location hash: ${hash}`, style);\n console.log(`%c${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, style);\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], "mappings": "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", "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "style", "xpath", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] -} \ No newline at end of file +<<<<<<< HEAD +} +======= +} +>>>>>>> feature/lrc diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 3da17a3893..0fae0f498f 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -62,6 +62,7 @@ public function register(): void { $factory_array = [ $this->getContainer()->get( 'atf_factory' ), + $this->getContainer()->get( 'lrc_factory' ), ]; foreach ( $factory_array as $factory ) { diff --git a/inc/Engine/Optimization/LazyRenderContent/Factory.php b/inc/Engine/Optimization/LazyRenderContent/Factory.php index 8eed15fe49..7466ea6bd7 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Factory.php +++ b/inc/Engine/Optimization/LazyRenderContent/Factory.php @@ -51,16 +51,18 @@ class Factory implements FactoryInterface { /** * Instantiate the class. * - * @param ContextInterface $context LRC Context instance. - * @param TableInterface $table LRC Table instance. - * @param QueriesInterface $queries LRC Queries instance. - * @param AjaxControllerInterface $ajax_controller LRC AJAX Controller instance. + * @param ContextInterface $context LRC Context instance. + * @param TableInterface $table LRC Table instance. + * @param QueriesInterface $queries LRC Queries instance. + * @param AjaxControllerInterface $ajax_controller LRC AJAX Controller instance. + * @param FrontendControllerInterface $frontend_controller LRC Frontend Controller instance. */ - public function __construct( ContextInterface $context, TableInterface $table, QueriesInterface $queries, AjaxControllerInterface $ajax_controller ) { - $this->context = $context; - $this->table = $table; - $this->queries = $queries; - $this->ajax_controller = $ajax_controller; + public function __construct( ContextInterface $context, TableInterface $table, QueriesInterface $queries, AjaxControllerInterface $ajax_controller, FrontendControllerInterface $frontend_controller ) { + $this->context = $context; + $this->table = $table; + $this->queries = $queries; + $this->ajax_controller = $ajax_controller; + $this->frontend_controller = $frontend_controller; } /** diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index 2b9d931fb9..3b1abe5045 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -7,8 +7,9 @@ use WP_Rocket\Engine\Common\Context\ContextInterface; use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Queries\LazyRenderContent as LRCQuery; use WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Processor\Processor; +use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface; -class Controller { +class Controller implements ControllerInterface { /** * Processor instance * @@ -87,6 +88,31 @@ public function add_hashes( $html ) { return $this->processor->get_processor()->add_hashes( $html ); } + /** + * Apply LRC Optimzation to content. + * + * @param string $html HTML content. + * @param object $row Database Row. + * + * @return string + */ + public function optimize( string $html, $row ): string { + return $html; + } + + /** + * Add custom data for the LRC optimization. + * + * @param array $data Array of data passed in beacon. + * + * @return array + */ + public function add_custom_data( array $data ): array { + $data['status']['lrc'] = $this->context->is_allowed(); + + return $data; + } + /** * Determines if the page is mobile and separate cache for mobile files is enabled. * diff --git a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php index a5a52977b5..6d7d0fea69 100644 --- a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php +++ b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php @@ -90,6 +90,7 @@ public function register(): void { $this->getContainer()->get( 'lrc_table' ), $this->getContainer()->get( 'lrc_query' ), $this->getContainer()->get( 'lrc_ajax_controller' ), + $this->getContainer()->get( 'lrc_frontend_controller' ), ] ); } diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html index c3fc24545d..9d022667c7 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html @@ -3,5 +3,5 @@ Test - + diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html new file mode 100644 index 0000000000..0dc1d66103 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html @@ -0,0 +1,8 @@ + + + LCP/ATF image test + + +Sample alt + + diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php index fc7a34ee12..d7ad78532d 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php @@ -13,13 +13,31 @@ $html_input_with_relative_img_lcp = file_get_contents(__DIR__ . '/HTML/input_with_relative_img_lcp.html'); $html_input_with_absolute_img_lcp = file_get_contents(__DIR__ . '/HTML/input_with_absolute_img_lcp.html'); $html_input_with_domain_img_lcp = file_get_contents(__DIR__ . '/HTML/input_lcp_image.html'); +$html_output_with_beacon_and_lcp_opt = file_get_contents(__DIR__ . '/HTML/output_with_beacon_and_atf_opt.html'); + +$lrc = [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'below_the_fold' => json_encode( [ + '3ead51141d9876165378a22a92d90415', + 'eb156891061284662641900bc9136fae', + '1b496e8f8129c0eb6eda409a2b17c24d', + ] ), + ], +]; return [ 'test_data' => [ 'shouldAddBeaconToPage' => [ 'config' => [ 'html' => $html_input, - 'row' => null, + 'atf' => [ + 'row' => null, + ], + 'lrc' => [ + 'row' => null, + ], ], 'expected' => $html_output_with_beacon, ], @@ -27,405 +45,488 @@ 'config' => [ 'html' => $html_input, 'filter_delay' => 'string', - 'row' => null, + 'atf' => [ + 'row' => null, + ], + 'lrc' => [ + 'row' => null, + ], ], 'expected' => $html_output_with_beacon, ], 'shouldNotAddBeaconToPage' => [ 'config' => [ 'html' => $html_input, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image.jpg', - ] ), - 'viewport' => json_encode( [ - 0 => (object) [ + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image2.jpg', - ], - ] ), + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + ] ), + ], ], + 'lrc' => $lrc, ], 'expected' => $html_output_with_preload, ], - 'shouldNotAddBeaconToPageWhenLcpFailed' => [ + 'shouldNotAddBeaconToPageWhenPerformanceHintsFailed' => [ 'config' => [ 'html' => $html_input, - 'row' => [ - 'status' => 'failed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - ] ), - 'viewport' => json_encode( [ - ] ), + 'atf' => [ + 'row' => [ + 'status' => 'failed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [] ), + 'viewport' => json_encode( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => $html_output, ], 'shouldPreloadLcpResponsiveImgset' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_bg_responsive_imgset_template.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'bg-img-set', - 'bg_set' => [ - ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testavif.avif 1dppx"], - ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testwebp.webp 2dppx"] - ] - ]), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img-set', + 'bg_set' => [ + ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testavif.avif 1dppx"], + ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testwebp.webp 2dppx"] + ] + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_bg_responsive_imgset_template.php'), ], 'shouldPreloadLcpResponsiveWebkit' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_bg_responsive_webkit_template.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'bg-img-set', - 'bg_set' => [ - ['src' => "https://fastly.picsum.photos/id/976/200/300.jpg?hmac=s1Uz9fgJv32r8elfaIYn7pLpQXps7X9oYNwC5XirhO8 1dppx"], - ['src' => "https://rocketlabsqa.ovh/wp-content/rocket-test-data/images/fixtheissue.jpg 2dppx"] - ] - ]), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img-set', + 'bg_set' => [ + ['src' => "https://fastly.picsum.photos/id/976/200/300.jpg?hmac=s1Uz9fgJv32r8elfaIYn7pLpQXps7X9oYNwC5XirhO8 1dppx"], + ['src' => "https://rocketlabsqa.ovh/wp-content/rocket-test-data/images/fixtheissue.jpg 2dppx"] + ] + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_bg_responsive_webkit_template.php'), ], 'shouldPreloadLcpLayeredBackground' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_layered_bg.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'bg-img', - 'bg_set' => [ - ['src' => "https://fastly.picsum.photos/id/976/200/300.jpg?hmac=s1Uz9fgJv32r8elfaIYn7pLpQXps7X9oYNwC5XirhO8"], - ['src' => "https://rocketlabsqa.ovh/wp-content/rocket-test-data/images/fixtheissue.jpg"] - ] - ]), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img', + 'bg_set' => [ + ['src' => "https://fastly.picsum.photos/id/976/200/300.jpg?hmac=s1Uz9fgJv32r8elfaIYn7pLpQXps7X9oYNwC5XirhO8"], + ['src' => "https://rocketlabsqa.ovh/wp-content/rocket-test-data/images/fixtheissue.jpg"] + ] + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_layered_bg.php'), ], 'shouldPreloadLcpSingleBackground' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_single_bg.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'bg-img', - 'bg_set' => [ - ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testavif.avif"], - ] - ]), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'bg-img', + 'bg_set' => [ + ['src' => "http://example.org/wp-content/rocket-test-data/images/lcp/testavif.avif"], + ] + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_single_bg.php'), ], 'shouldPreloadLcpResponsiveImage' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_responsive.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img-srcset', - 'src' => 'wolf.jpg', - "srcset" => "wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w", - "sizes" => "50vw", - ]), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img-srcset', + 'src' => 'wolf.jpg', + "srcset" => "wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w", + "sizes" => "50vw", + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_responsive.php'), ], 'shouldApplyFetchPriorityToReturnRelativeImage' => [ 'config' => [ 'html' => $html_input_with_relative_img_lcp, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/sample_relative_image.jpg', - ] ), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/sample_relative_image.jpg', + ] ), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_with_relative_img_lcp.php'), ], 'shouldApplyFetchPriorityToAbsoluteImage' => [ 'config' => [ 'html' => $html_input_with_absolute_img_lcp, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.com/wp-content/uploads/sample_absolute_image.jpg', - ] ), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.com/wp-content/uploads/sample_absolute_image.jpg', + ] ), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_with_absolute_img_lcp.php'), ], 'shouldApplyFetchPriorityToImageWithDomain' => [ 'config' => [ 'html' => $html_input_with_domain_img_lcp, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/sample_url_image.png', - ] ), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/sample_url_image.png', + ] ), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_image.php'), ], 'shouldNotApplyFetchPriorityToImageWithFetchpriority' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_with_fetchpriority.html'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/sample_relative_image.jpg', - ] ), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/sample_relative_image.jpg', + ] ), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_with_fetchpriority.html'), ], 'shouldNotApplyFetchPriorityToImageWithDuplicateMarkup' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_with_markup_comment.html'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/sample_relative_image.jpg', - ] ), - 'viewport' => json_encode ( [] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/sample_relative_image.jpg', + ] ), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_with_markup_comment.html'), ], 'shouldNotApplyFetchPriorityToTheWrongElement' => [ 'config' => [ 'html' => $html_input_with_bg_image_lcp, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image.jpg', - ] ), - 'viewport' => json_encode( [ - 0 => (object) [ + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image2.jpg', - ], - 1 => (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image3.jpg', - ], - ] ), + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + 1 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image3.jpg', + ], + ] ), + ], ], + 'lrc' =>$lrc, ], 'expected' => $html_output_with_bg_image_lcp, ], 'shouldApplyFetchPriorityToTheImgTagWithPictureElement' => [ 'config' => [ 'html' => $html_input_with_picture_img_lcp, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image.jpg', - ] ), - 'viewport' => json_encode( [ - 0 => (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image2.jpg', - ], - 1 => (object) [ + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image3.jpg', - ], - ] ), + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + 1 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image3.jpg', + ], + ] ), + ], ], + 'lrc' => $lrc, ], 'expected' => $html_output_with_picture_img_lcp, ], 'shouldApplyFetchPriorityToTheImgElement' => [ 'config' => [ 'html' => $html_input_with_img_lcp, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image.jpg', - ] ), - 'viewport' => json_encode( [ - 0 => (object) [ - 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image2.jpg', - ], - 1 => (object) [ + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ 'type' => 'img', - 'src' => 'http://example.org/wp-content/uploads/image3.jpg', - ], - ] ), + 'src' => 'http://example.org/wp-content/uploads/image.jpg', + ] ), + 'viewport' => json_encode( [ + 0 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image2.jpg', + ], + 1 => (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/image3.jpg', + ], + ] ), + ], ], + 'lrc' => $lrc, ], 'expected' => $html_output_with_img_lcp, ], - 'shouldNotDoAnythingIfNoLcp' => [ + 'shouldNotDoAnythingIfNoPerformanceHintsCandidates' => [ 'config' => [ 'html' => $html_input, - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => 'not found', - 'viewport' => json_encode( [ - ] ), + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => 'not found', + 'viewport' => json_encode( [ + ] ), + ], ], + 'lrc' => $lrc, ], 'expected' => $html_output, ], 'shouldPreloadPictureTag1' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_picture.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'picture', - 'src' => 'large_cat.jpg', - 'sources' => [ - [ - 'srcset' => 'small_cat.jpg', - 'media' => '(max-width: 400px)', - 'type' => '', - 'sizes' => '', - ], - [ - 'srcset' => 'medium_cat.jpg', - 'media' => '(max-width: 800px)', - 'type' => '', - 'sizes' => '', + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'picture', + 'src' => 'large_cat.jpg', + 'sources' => [ + [ + 'srcset' => 'small_cat.jpg', + 'media' => '(max-width: 400px)', + 'type' => '', + 'sizes' => '', + ], + [ + 'srcset' => 'medium_cat.jpg', + 'media' => '(max-width: 800px)', + 'type' => '', + 'sizes' => '', + ] ] - ] - ]), - 'viewport' => json_encode ( [] ), + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_picture.php'), ], 'shouldPreloadPictureTag2' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_picture_2.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'picture', - 'src' => '', - 'sources' => [ - [ - 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.avif 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.avif 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.avif 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.avif 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.avif 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.avif 600w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia.jpg.avif 1920w', - 'media' => '', - 'type' => 'image/avif', - 'sizes' => '(max-width: 1024px) 100vw, 1024px' - ], - [ - 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.webp 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.webp 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.webp 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.webp 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.webp 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.webp 600w', - 'media' => '', - 'type' => 'image/webp', - 'sizes' => '(max-width: 1024px) 100vw, 1024px' + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'picture', + 'src' => '', + 'sources' => [ + [ + 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.avif 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.avif 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.avif 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.avif 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.avif 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.avif 600w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia.jpg.avif 1920w', + 'media' => '', + 'type' => 'image/avif', + 'sizes' => '(max-width: 1024px) 100vw, 1024px' + ], + [ + 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.webp 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.webp 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.webp 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.webp 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.webp 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.webp 600w', + 'media' => '', + 'type' => 'image/webp', + 'sizes' => '(max-width: 1024px) 100vw, 1024px' + ] ] - ] - ]), - 'viewport' => json_encode ( [] ), + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_picture_2.php'), ], 'shouldPreloadPictureTag3' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_picture_3.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'picture', - 'src' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-%E2%80%94-kopia-1024x576.jpg', - 'sources' => [ - [ - 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.avif 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.avif 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.avif 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.avif 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.avif 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.avif 600w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia.jpg.avif 1920w', - 'media' => '', - 'type' => 'image/avif', - 'sizes' => '(max-width: 1024px) 100vw, 1024px' - ], - [ - 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.webp 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.webp 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.webp 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.webp 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.webp 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.webp 600w', - 'media' => '', - 'type' => 'image/webp', - 'sizes' => '(max-width: 1024px) 100vw, 1024px' + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'picture', + 'src' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-%E2%80%94-kopia-1024x576.jpg', + 'sources' => [ + [ + 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.avif 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.avif 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.avif 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.avif 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.avif 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.avif 600w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia.jpg.avif 1920w', + 'media' => '', + 'type' => 'image/avif', + 'sizes' => '(max-width: 1024px) 100vw, 1024px' + ], + [ + 'srcset' => 'https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1024x576.jpg.webp 1024w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-300x169.jpg.webp 300w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-768x432.jpg.webp 768w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1536x864.jpg.webp 1536w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-1200x675.jpg.webp 1200w, https://imagify.rocketlabsqa.ovh/wp-content/uploads/2024/05/home-new-bg-free-img-—-kopia-600x338.jpg.webp 600w', + 'media' => '', + 'type' => 'image/webp', + 'sizes' => '(max-width: 1024px) 100vw, 1024px' + ] ] - ] - ]), - 'viewport' => json_encode ( [] ), + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_picture_3.php'), ], 'shouldPreloadPictureTag4' => [ 'config' => [ 'html' => file_get_contents(__DIR__ . '/HTML/input_lcp_picture_4.php'), - 'row' => [ - 'status' => 'completed', - 'url' => 'http://example.org', - 'lcp' => json_encode( (object) [ - 'type' => 'picture', - 'src' => 'https://variance.pl/wp-content/uploads/2024/05/Kwiatowy-Ksiezyc-1348x900.webp', - 'sources' => [ - [ - 'srcset' => 'https://variance.pl/wp-content/uploads/2024/05/Kwiatowy-Ksiezyc-400x600.webp', - 'media' => '(max-width: 500px)', - 'type' => 'image/webp', - ], - [ - 'srcset' => 'https://variance.pl/wp-content/uploads/2024/05/Kwiatowy-Ksiezyc-768x513.webp', - 'media' => '(min-width: 501px) and (max-width: 768px)', - 'type' => 'image/webp', + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'picture', + 'src' => 'https://variance.pl/wp-content/uploads/2024/05/Kwiatowy-Ksiezyc-1348x900.webp', + 'sources' => [ + [ + 'srcset' => 'https://variance.pl/wp-content/uploads/2024/05/Kwiatowy-Ksiezyc-400x600.webp', + 'media' => '(max-width: 500px)', + 'type' => 'image/webp', + ], + [ + 'srcset' => 'https://variance.pl/wp-content/uploads/2024/05/Kwiatowy-Ksiezyc-768x513.webp', + 'media' => '(min-width: 501px) and (max-width: 768px)', + 'type' => 'image/webp', + ] ] - ] - ]), - 'viewport' => json_encode ( [] ), + ]), + 'viewport' => json_encode ( [] ), + ], ], + 'lrc' => $lrc, ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_picture_4.php'), ], + 'ShouldAddBeaconToPageWhenOnlyOnePerformanceHintsFeatureIsNotInDB' => [ + 'config' => [ + 'html' => $html_input_with_domain_img_lcp, + 'atf' => [ + 'row' => [ + 'status' => 'completed', + 'url' => 'http://example.org', + 'lcp' => json_encode( (object) [ + 'type' => 'img', + 'src' => 'http://example.org/wp-content/uploads/sample_url_image.png', + ] ), + 'viewport' => json_encode ( [] ), + ], + ], + 'lrc' => [ + 'row' => null, + ], + ], + 'expected' => $html_output_with_beacon_and_lcp_opt, + ], ], ]; diff --git a/tests/Integration/DBTrait.php b/tests/Integration/DBTrait.php index 5358318c9a..ee3b3e6292 100644 --- a/tests/Integration/DBTrait.php +++ b/tests/Integration/DBTrait.php @@ -45,12 +45,19 @@ public static function addCache( array $resource ) { $cache_query = $container->get( 'preload_caches_query' ); return $cache_query->create_or_update( $resource ); } + public static function addLcp( array $resource ) { $container = apply_filters( 'rocket_container', null ); $lcp_query = $container->get( 'atf_query' ); return $lcp_query->add_item( $resource ); } + public static function addLrc( array $resource ) { + $container = apply_filters( 'rocket_container', null ); + $lrc_query = $container->get( 'lrc_query' ); + return $lrc_query->add_item( $resource ); + } + public static function installFresh() { $container = apply_filters( 'rocket_container', null ); @@ -94,6 +101,15 @@ public static function installAtfTable() { } } + public static function installLrcTable() { + $container = apply_filters( 'rocket_container', null ); + $lrc_table = $container->get( 'lrc_table' ); + + if ( ! $lrc_table->exists() ) { + $lrc_table->install(); + } + } + public static function uninstallAll() { $container = apply_filters( 'rocket_container', null ); $rucss_usedcss_table = $container->get( 'rucss_usedcss_table' ); @@ -136,6 +152,15 @@ public static function uninstallAtfTable() { } } + public static function uninstallLrcTable() { + $container = apply_filters( 'rocket_container', null ); + $lrc_table = $container->get( 'lrc_table' ); + + if ( $lrc_table->exists() ) { + $lrc_table->uninstall(); + } + } + public static function removeDBHooks() { $container = apply_filters( 'rocket_container', null ); $rucss_usedcss_table = $container->get( 'rucss_usedcss_table' ); diff --git a/tests/Integration/bootstrap.php b/tests/Integration/bootstrap.php index 7ce0f0af88..07081aae87 100644 --- a/tests/Integration/bootstrap.php +++ b/tests/Integration/bootstrap.php @@ -17,8 +17,9 @@ 'muplugins_loaded', function() { - // Disable ATF optimization to prevent DB request (unrelated to other tests). + // Disable ATF & LRC optimizations to prevent DB requests (unrelated to other tests). add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); + add_filter( 'rocket_lazy_render_content_optimization', '__return_false' ); if ( BootstrapManager::isGroup( 'TranslatePress' ) ) { require WP_ROCKET_TESTS_FIXTURES_DIR . '/classes/TRP_Translate_Press.php'; @@ -264,6 +265,7 @@ function() { if ( BootstrapManager::isGroup( 'PerformanceHints' ) ) { add_filter( 'rocket_above_the_fold_optimization', '__return_true' ); + add_filter( 'rocket_lazy_render_content_optimization', '__return_true' ); } // Load the plugin. diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php index 1c88771b2a..8e17a6b3d1 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php @@ -20,10 +20,12 @@ public static function set_up_before_class() { // Install in set_up_before_class because of exists(). self::installAtfTable(); + self::installLrcTable(); } public static function tear_down_after_class() { self::uninstallAtfTable(); + self::uninstallLrcTable(); parent::tear_down_after_class(); } @@ -47,8 +49,11 @@ public function tear_down() { public function testShouldReturnAsExpected( $config, $expected ) { $this->config = $config; - if ( ! empty( $config['row'] ) ) { - self::addLcp( $config['row'] ); + if ( ! empty( $config['atf']['row'] ) ) { + self::addLcp( $config['atf']['row'] ); + } + if ( ! empty( $config['lrc']['row'] ) ) { + self::addLrc( $config['lrc']['row'] ); } if ( isset( $config['filter_delay'] ) ) { From ee4d993937b7626f4b8e1196f526d04c174c5488 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 22 Aug 2024 21:21:31 +0200 Subject: [PATCH 096/192] Make rollback version 3.16.4 --- wp-rocket.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wp-rocket.php b/wp-rocket.php index f2f778274c..a5ed5aa579 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -82,7 +82,7 @@ define( 'CHMOD_WP_ROCKET_CACHE_DIRS', 0755 ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals } if ( ! defined( 'WP_ROCKET_LASTVERSION' ) ) { - define( 'WP_ROCKET_LASTVERSION', '3.15.10' ); + define( 'WP_ROCKET_LASTVERSION', '3.16.4' ); } /** From cae789f8a6242e9ea074001d58cb61afeb28d199 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Fri, 23 Aug 2024 10:54:47 +0200 Subject: [PATCH 097/192] Bump version to 3.17-alpha1 --- wp-rocket.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp-rocket.php b/wp-rocket.php index f2f778274c..7a9790c5a5 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.16.4 + * Version: 3.17-alpha1 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.16.4' ); +define( 'WP_ROCKET_VERSION', '3.17-alpha1' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' ); From 58be56f07c6f3b22fa12aae636f5e9826fe9c0d2 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 23 Aug 2024 10:10:51 +0100 Subject: [PATCH 098/192] Changed method name --- inc/Engine/Common/PerformanceHints/WarmUp/Controller.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php index fd77f7dd62..57c23d34c4 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php @@ -65,7 +65,7 @@ public function __construct( array $factories, Options_Data $options, APIClient * * @return bool */ - private function should_terminate_early(): bool { + private function is_allowed(): bool { return ( 'local' === wp_get_environment_type() || $this->user->is_license_expired_grace_period() || @@ -79,7 +79,7 @@ private function should_terminate_early(): bool { * @return void */ public function warm_up_home(): void { - if ( $this->should_terminate_early() ) { + if ( $this->is_allowed() ) { return; } @@ -97,7 +97,7 @@ public function warm_up_home(): void { * @return void */ public function warm_up(): void { - if ( $this->should_terminate_early() ) { + if ( $this->is_allowed() ) { return; } From f3e2f16dcab2a0cab8ff2de040211ac238f48b25 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 23 Aug 2024 10:48:01 +0100 Subject: [PATCH 099/192] invert method return for clear understanding --- inc/Engine/Common/PerformanceHints/WarmUp/Controller.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php index 57c23d34c4..1e22faee92 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php @@ -66,7 +66,7 @@ public function __construct( array $factories, Options_Data $options, APIClient * @return bool */ private function is_allowed(): bool { - return ( + return !( 'local' === wp_get_environment_type() || $this->user->is_license_expired_grace_period() || (bool) $this->options->get( 'remove_unused_css', 0 ) @@ -79,7 +79,7 @@ private function is_allowed(): bool { * @return void */ public function warm_up_home(): void { - if ( $this->is_allowed() ) { + if ( ! $this->is_allowed() ) { return; } @@ -97,7 +97,7 @@ public function warm_up_home(): void { * @return void */ public function warm_up(): void { - if ( $this->is_allowed() ) { + if ( ! $this->is_allowed() ) { return; } From 13417d7add58edce2277a58de3587ae0d26b5a62 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 23 Aug 2024 10:50:36 +0100 Subject: [PATCH 100/192] fix lint error --- inc/Engine/Common/PerformanceHints/WarmUp/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php index 1e22faee92..73019b2517 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Controller.php @@ -66,7 +66,7 @@ public function __construct( array $factories, Options_Data $options, APIClient * @return bool */ private function is_allowed(): bool { - return !( + return ! ( 'local' === wp_get_environment_type() || $this->user->is_license_expired_grace_period() || (bool) $this->options->get( 'remove_unused_css', 0 ) From 444d6f9b5b848005ccb60766157b24a3276bc091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Fri, 23 Aug 2024 10:09:09 -0400 Subject: [PATCH 101/192] Closes #6840 LRC frontend sub-task (#6884) Co-authored-by: Mathieu Lamiot --- .../LazyRenderContent/Frontend/Controller.php | 147 ++++++++++++------ .../LazyRenderContent/ServiceProvider.php | 8 - .../Subscriber/HTML/output_w_beacon.html | 2 +- .../HTML/output_with_beacon_and_atf_opt.html | 2 +- .../Frontend/Controller/addCustomData.php | 30 ++++ .../Frontend/Controller/expected.html | 25 +++ .../Frontend/Controller/hashed.html | 24 +++ .../Frontend/Controller/optimize.php | 39 +++++ tests/Integration/DBTrait.php | 35 +++-- tests/Integration/bootstrap.php | 4 +- .../Admin/Controller/truncateFromAdmin.php | 4 +- .../Cron/Subscriber/cleanup.php | 2 + .../Frontend/Controller/addCustomData.php | 40 +++++ .../Frontend/Controller/optimize.php | 44 ++++++ 14 files changed, 330 insertions(+), 76 deletions(-) create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/hashed.html create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php create mode 100644 tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index 3b1abe5045..16fca2b18a 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -3,11 +3,9 @@ namespace WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend; -use WP_Rocket\Admin\Options_Data; use WP_Rocket\Engine\Common\Context\ContextInterface; -use WP_Rocket\Engine\Optimization\LazyRenderContent\Database\Queries\LazyRenderContent as LRCQuery; -use WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Processor\Processor; use WP_Rocket\Engine\Common\PerformanceHints\Frontend\ControllerInterface; +use WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Processor\Processor; class Controller implements ControllerInterface { /** @@ -25,52 +23,96 @@ class Controller implements ControllerInterface { private $context; /** - * LRCQuery instance + * Constructor * - * @var LRCQuery + * @param Processor $processor Processor instance. + * @param ContextInterface $context Context instance. */ - private $query; + public function __construct( Processor $processor, ContextInterface $context ) { + $this->processor = $processor; + $this->context = $context; + } /** - * Options instance + * Applies optimization. + * + * @param string $html HTML content. + * @param object $row Database Row. * - * @var Options_Data + * @return string */ - private $options; + public function optimize( string $html, $row ): string { + if ( ! $row->has_lrc() ) { + return $html; + } + + $hashes = json_decode( $row->below_the_fold ); + + if ( null === $hashes || ! is_array( $hashes ) ) { + return $html; + } + + $result = preg_replace( '/data-rocket-location-hash="(?:' . implode( '|', $hashes ) . ')"/i', 'data-wpr-lazyrender="1"', $html, -1, $count ); + + if ( + null === $result + || + 0 === $count + ) { + return $html; + } + + $html = $result; + $html = $this->remove_hashes( $html ); + + return $this->add_css( $html ); + } /** - * Constructor + * Remove hashes from the HTML content. * - * @param Processor $processor Processor instance. - * @param ContextInterface $context Context instance. - * @param LRCQuery $query Query instance. - * @param Options_Data $options Options instance. + * @param string $html The HTML content. + * + * @return string */ - public function __construct( Processor $processor, ContextInterface $context, LRCQuery $query, Options_Data $options ) { - $this->processor = $processor; - $this->context = $context; - $this->query = $query; - $this->options = $options; + private function remove_hashes( $html ) { + $result = preg_replace( '/data-rocket-location-hash="(?:.*)"/i', '', $html ); + + if ( null === $result ) { + return $html; + } + + return $result; } /** - * Add hashes to the HTML elements + * Add CSS to the HTML content. * * @param string $html The HTML content. * * @return string */ - public function add_hashes( $html ) { - global $wp; + private function add_css( $html ) { + $css = ''; - if ( ! $this->context->is_allowed() ) { + $result = preg_replace( '/<\/head>/i', $css . '', $html, 1 ); + + if ( null === $result ) { return $html; } - $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); - $is_mobile = $this->is_mobile(); + return $result; + } - if ( $this->query->get_row( $url, $is_mobile ) ) { + /** + * Add hashes to the HTML elements + * + * @param string $html The HTML content. + * + * @return string + */ + public function add_hashes( $html ) { + if ( ! $this->context->is_allowed() ) { return $html; } @@ -89,38 +131,43 @@ public function add_hashes( $html ) { } /** - * Apply LRC Optimzation to content. - * - * @param string $html HTML content. - * @param object $row Database Row. - * - * @return string - */ - public function optimize( string $html, $row ): string { - return $html; - } - - /** - * Add custom data for the LRC optimization. + * Add custom data like the List of elements to be considered for optimization. * * @param array $data Array of data passed in beacon. * * @return array */ public function add_custom_data( array $data ): array { + $elements = [ + 'div', + 'main', + 'footer', + 'section', + 'article', + 'header', + ]; + + /** + * Filters the array of elements + * + * @since 3.17 + * + * @param array $formats Array of elements + */ + $elements = wpm_apply_filters_typed( 'array', 'rocket_lrc_elements', $elements ); + + $data['lrc_elements'] = implode( ', ', $elements ); $data['status']['lrc'] = $this->context->is_allowed(); - return $data; - } + /** + * Filters the LRC threshold + * + * @since 3.17 + * + * @param int $threshold The LRC threshold value. + */ + $data['lrc_threshold'] = wpm_apply_filters_typed( 'integer', 'rocket_lrc_threshold', 1800 ); - /** - * Determines if the page is mobile and separate cache for mobile files is enabled. - * - * @return bool - */ - private function is_mobile(): bool { - return $this->options->get( 'cache_mobile', 0 ) - && $this->options->get( 'do_caching_mobile_files', 0 ) - && wp_is_mobile(); + return $data; } } diff --git a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php index 6d7d0fea69..023710553e 100644 --- a/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php +++ b/inc/Engine/Optimization/LazyRenderContent/ServiceProvider.php @@ -50,13 +50,7 @@ public function provides( string $id ): bool { */ public function register(): void { $this->getContainer()->add( 'lrc_context', Context::class ); - $this->getContainer()->addShared( 'lrc_table', LRCTable::class ); - - $this->getContainer()->add( 'lrc_query', LRCQuery::class ); - - $this->getContainer()->addShared( 'lrc_table', LRCTable::class ); - $this->getContainer()->add( 'lrc_query', LRCQuery::class ); $this->getContainer()->add( 'lrc_ajax_controller', AJAXController::class ) @@ -72,8 +66,6 @@ public function register(): void { [ $this->getContainer()->get( 'lrc_frontend_processor' ), $this->getContainer()->get( 'lrc_context' ), - $this->getContainer()->get( 'lrc_query' ), - $this->getContainer()->get( 'options' ), ] ); $this->getContainer()->addShared( 'lrc_frontend_subscriber', FrontSubscriber::class ) diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html index 9d022667c7..1fc89a476a 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html @@ -3,5 +3,5 @@ Test - + diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html index 0dc1d66103..7d77c7ec39 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html @@ -4,5 +4,5 @@ Sample alt - + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php new file mode 100644 index 0000000000..2af6415657 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php @@ -0,0 +1,30 @@ + [ + 'config' => [ + 'is_allowed' => true, + ], + 'data' => [], + 'expected' => [ + 'lrc_elements' => 'div, main, footer, section, article, header', + 'status' => [ + 'lrc' => true, + ], + 'lrc_threshold' => 1800 + ], + ], + 'testShouldReturnDataWithNotAllowed' => [ + 'config' => [ + 'is_allowed' => false, + ], + 'data' => [], + 'expected' => [ + 'lrc_elements' => 'div, main, footer, section, article, header', + 'status' => [ + 'lrc' => false, + ], + 'lrc_threshold' => 1800, + ], + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html new file mode 100644 index 0000000000..3e0536e19e --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html @@ -0,0 +1,25 @@ + + + Original + + + +
+
+
+

Original

+
+
+
+

Text

+

Original content

+
+
+
+
+
+

Original footer

+
+
+ + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/hashed.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/hashed.html new file mode 100644 index 0000000000..c29f6f1a60 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/hashed.html @@ -0,0 +1,24 @@ + + + Original + + +
+
+
+

Original

+
+
+
+

Text

+

Original content

+
+
+
+
+
+

Original footer

+
+
+ + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php new file mode 100644 index 0000000000..796c87a39c --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php @@ -0,0 +1,39 @@ + [ + 'config' => [ + 'has_lrc' => false, + 'below_the_fold' => '', + ], + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnEarlyWhenHashesNull' => [ + 'config' => [ + 'has_lrc' => true, + 'below_the_fold' => '{ bar: "baz" }', + ], + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnEarlyWhenHashesNotArray' => [ + 'config' => [ + 'has_lrc' => true, + 'below_the_fold' => json_encode( '123' ), + ], + 'html' => '', + 'expected' => '', + ], + 'testShouldReturnUpdatedHtml' => [ + 'config' => [ + 'has_lrc' => true, + 'below_the_fold' => json_encode( [ 'adc285f638b63c4110da1d803b711c40', 'd1f41b6001aa95d1577259dd681a9b19', 'fbfcccd11db41b93d3d0676c9e14fdc8' ] ), + ], + 'html' => $hashed, + 'expected' => $expected, + ], +]; diff --git a/tests/Integration/DBTrait.php b/tests/Integration/DBTrait.php index ee3b3e6292..20c80aed50 100644 --- a/tests/Integration/DBTrait.php +++ b/tests/Integration/DBTrait.php @@ -55,6 +55,7 @@ public static function addLcp( array $resource ) { public static function addLrc( array $resource ) { $container = apply_filters( 'rocket_container', null ); $lrc_query = $container->get( 'lrc_query' ); + return $lrc_query->add_item( $resource ); } @@ -72,6 +73,9 @@ public static function installFresh() { $atf_table = $container->get( 'atf_table' ); $atf_table->install(); + + $lrc_table = $container->get( 'lrc_table' ); + $lrc_table->install(); } public static function installUsedCssTable() { @@ -127,6 +131,11 @@ public static function uninstallAll() { if ( $atf_table->exists() ) { $atf_table->uninstall(); } + + $lrc_table = $container->get( 'lrc_table' ); + if ( $lrc_table->exists() ) { + $lrc_table->uninstall(); + } } public static function uninstallUsedCssTable() { @@ -163,19 +172,19 @@ public static function uninstallLrcTable() { public static function removeDBHooks() { $container = apply_filters( 'rocket_container', null ); - $rucss_usedcss_table = $container->get( 'rucss_usedcss_table' ); - $preload_table = $container->get( 'preload_caches_table' ); - $atf_table = $container->get( 'atf_table' ); - - self::forceRemoveTableAdminInitHooks( 'init', get_class( $rucss_usedcss_table ), 'maybe_upgrade', 10 ); - self::forceRemoveTableAdminInitHooks( 'admin_init', get_class( $rucss_usedcss_table ), 'maybe_upgrade', 10 ); - self::forceRemoveTableAdminInitHooks( 'switch_blog', get_class( $rucss_usedcss_table ), 'switch_blog', 10 ); - self::forceRemoveTableAdminInitHooks( 'init', get_class( $preload_table ), 'maybe_upgrade', 10 ); - self::forceRemoveTableAdminInitHooks( 'admin_init', get_class( $preload_table ), 'maybe_upgrade', 10 ); - self::forceRemoveTableAdminInitHooks( 'switch_blog', get_class( $preload_table ), 'switch_blog', 10 ); - self::forceRemoveTableAdminInitHooks( 'init', get_class( $atf_table ), 'maybe_upgrade', 10 ); - self::forceRemoveTableAdminInitHooks( 'admin_init', get_class( $atf_table ), 'maybe_upgrade', 10 ); - self::forceRemoveTableAdminInitHooks( 'switch_blog', get_class( $atf_table ), 'switch_blog', 10 ); + + $tables = [ + $container->get( 'rucss_usedcss_table' ), + $container->get( 'preload_caches_table' ), + $container->get( 'atf_table' ), + $container->get( 'lrc_table' ), + ]; + + foreach ( $tables as $table ) { + self::forceRemoveTableAdminInitHooks( 'init', get_class( $table ), 'maybe_upgrade', 10 ); + self::forceRemoveTableAdminInitHooks( 'admin_init', get_class( $table ), 'maybe_upgrade', 10 ); + self::forceRemoveTableAdminInitHooks( 'switch_blog', get_class( $table ), 'switch_blog', 10 ); + } } public static function forceRemoveTableAdminInitHooks( $hook_name = '', $class_name = '', $method_name = '', $priority = 0 ) { diff --git a/tests/Integration/bootstrap.php b/tests/Integration/bootstrap.php index 07081aae87..018006ebab 100644 --- a/tests/Integration/bootstrap.php +++ b/tests/Integration/bootstrap.php @@ -15,13 +15,13 @@ // Manually load the plugin being tested. tests_add_filter( 'muplugins_loaded', - function() { + function () { // Disable ATF & LRC optimizations to prevent DB requests (unrelated to other tests). add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); add_filter( 'rocket_lazy_render_content_optimization', '__return_false' ); - if ( BootstrapManager::isGroup( 'TranslatePress' ) ) { + if ( BootstrapManager::isGroup( 'TranslatePress' ) ) { require WP_ROCKET_TESTS_FIXTURES_DIR . '/classes/TRP_Translate_Press.php'; require WP_ROCKET_TESTS_FIXTURES_DIR . '/classes/TRP_Url_Converter.php'; require WP_ROCKET_TESTS_FIXTURES_DIR . '/classes/TRP_Settings.php'; diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php index aa8cfe6d71..fba055a4a9 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateFromAdmin.php @@ -24,10 +24,12 @@ public static function set_up_before_class() { // Install in set_up_before_class because of exists() requiring not temporary table. self::installAtfTable(); + self::installLrcTable(); } public static function tear_down_after_class() { - self::installAtfTable(); + self::uninstallAtfTable(); + self::uninstallLrcTable(); parent::tear_down_after_class(); } diff --git a/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php index e1e7cf8f8f..27b103d82a 100644 --- a/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php +++ b/tests/Integration/inc/Engine/Common/PerformanceHints/Cron/Subscriber/cleanup.php @@ -23,10 +23,12 @@ public static function set_up_before_class() { // Install in set_up_before_class because of exists(). self::installAtfTable(); + self::installLrcTable(); } public static function tear_down_after_class() { self::uninstallAtfTable(); + self::uninstallLrcTable(); parent::tear_down_after_class(); } diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php new file mode 100644 index 0000000000..5fa93c18c2 --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php @@ -0,0 +1,40 @@ +context = Mockery::mock( Context::class ); + + $this->controller = new Controller( Mockery::mock( Processor::class ), $this->context ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $data, $expected ) { + $this->context->shouldReceive( 'is_allowed' ) + ->once() + ->andReturn( $config['is_allowed'] ); + + $this->assertSame( + $expected, + $this->controller->add_custom_data( $data ) + ); + } +} diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php new file mode 100644 index 0000000000..30575b979d --- /dev/null +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php @@ -0,0 +1,44 @@ +controller = new Controller( Mockery::mock( Processor::class ), Mockery::mock( Context::class ) ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $html, $expected ) { + $row = $this->getMockBuilder( LRCRow::class ) + ->disableOriginalConstructor() + ->getMock(); + + $row->expects( $this->once() ) + ->method( 'has_lrc' ) + ->willReturn( $config['has_lrc'] ); + + $row->below_the_fold = $config['below_the_fold']; + + $this->assertSame( + $this->format_the_html( $expected ), + $this->format_the_html( $this->controller->optimize( $html, $row ) ) + ); + } +} From 293c58bdbb7ea564029e8523ebf34b2e963b7453 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 23 Aug 2024 16:08:41 +0100 Subject: [PATCH 102/192] Fixes #6898 'Clear performance Hints data' in the WPR admin dropdown menu when env is set to local (#6899) --- inc/Engine/Admin/Settings/AdminBarMenuTrait.php | 15 --------------- inc/Engine/Saas/Admin/AdminBar.php | 16 ++++++++++++++++ .../AdminBar/addCleanPerformanceHintsItem.php | 11 ----------- .../addPerformanceHintsClearUrlMenuItem.php | 7 +++++-- .../AdminBar/addCleanPerformanceHintsItem.php | 2 -- 5 files changed, 21 insertions(+), 30 deletions(-) diff --git a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php index 38454038d3..f13127b2fe 100644 --- a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php @@ -24,10 +24,6 @@ protected function add_menu_to_admin_bar( return; } - if ( 'local' === wp_get_environment_type() ) { - return; - } - if ( ! is_admin() ) { return; } @@ -67,9 +63,6 @@ protected function add_url_menu_item_to_admin_bar( bool $context ) { global $post; - if ( 'local' === wp_get_environment_type() && $context ) { - return; - } if ( is_admin() ) { return; @@ -123,14 +116,6 @@ protected function add_url_menu_item_to_admin_bar( * @return void */ public function dashboard_button( bool $context, string $title, string $label, string $action, string $hover_text = '' ): void { - if ( - 'local' === wp_get_environment_type() - && - $context - ) { - return; - } - if ( ! $context ) { return; } diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index b078bb684f..86c53a62ef 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -51,6 +51,10 @@ public function add_clean_saas_menu_item( $wp_admin_bar ) { $title = __( 'Clear RUCSS optimizations', 'rocket' ); $action = 'rocket_clean_saas'; + if ( 'local' === wp_get_environment_type() ) { + return; + } + if ( 'local' === wp_get_environment_type() && @@ -79,6 +83,10 @@ public function add_clean_saas_menu_item( $wp_admin_bar ) { * @return void */ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { + if ( 'local' === wp_get_environment_type() && $this->rucss_url_context->is_allowed() ) { + return; + } + global $post; /** @@ -112,6 +120,14 @@ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { * @return void */ public function display_dashboard_button() { + if ( + 'local' === wp_get_environment_type() + && + $this->rucss_url_context->is_allowed() + ) { + return; + } + $this->dashboard_button( $this->rucss_url_context->is_allowed(), __( 'Remove Unused CSS', 'rocket' ), diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php index 9af0871f87..23e2859ace 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -54,17 +54,6 @@ 'title' => 'Clear Performance Hints data', ], ], - 'testShouldReturnNullWhenLocalEnvironment' => [ - 'config' => [ - 'rocket_valid_key' => true, - 'environment' => 'local', - 'is_admin' => false, - 'atf_context' => false, - 'lrc_context' => false, - 'current_user_can' => true, - ], - 'expected' => null, - ], 'testShouldReturnNullWhenNotAdmin' => [ 'config' => [ 'rocket_valid_key' => true, diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php index 360be8484d..704cb02e83 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addPerformanceHintsClearUrlMenuItem.php @@ -1,7 +1,7 @@ [ + 'testShouldReturnMenuWhenLocalEnvironment' => [ 'config' => [ 'environment' => 'local', 'is_admin' => false, @@ -12,7 +12,10 @@ 'can_display_options' => true, 'factories' => true, ], - 'expected' => null, + 'expected' => [ + 'id' => 'clear-performance-hints-data-url', + 'title' => 'Clear Performance Hints data of this URL', + ], ], 'testShouldReturnNullWhenAdmin' => [ 'config' => [ diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php index 7e0eeccb54..55784aa6e1 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/AdminBar/addCleanPerformanceHintsItem.php @@ -51,8 +51,6 @@ protected function setUp(): void { public function testShouldDoExpected( $config, $expected ) { Functions\when( 'rocket_valid_key' ) ->justReturn( $config['rocket_valid_key'] ); - Functions\when( 'wp_get_environment_type' ) - ->justReturn( $config['environment'] ); Functions\when( 'is_admin' ) ->justReturn( $config['is_admin'] ); From 21261f3563744b2aec34542460ccf23c24f95b4a Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Fri, 23 Aug 2024 18:01:23 +0100 Subject: [PATCH 103/192] Closes #6891: 3.17: All hashes are saved to DB for LRC (#6900) Co-authored-by: WordPressFan --- assets/js/wpr-beacon.js | 31 ++++++++++++++++++++++--------- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 10 +++------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index ae0eeaf2dd..94d3d21198 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -209,7 +209,7 @@ } } _getLazyRenderElements() { - const elements = document.querySelectorAll(this.config.elements); + const elements = document.querySelectorAll(this.config.lrc_elements); if (elements.length <= 0) { return []; } @@ -233,7 +233,7 @@ _getElementDistance(element) { const rect = element.getBoundingClientRect(); const scrollTop = window.pageYOffset || document.documentElement.scrollTop; - return rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight); + return Math.max(0, rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight)); } _skipElement(element) { const skipStrings = this.config.skipStrings || ["memex"]; @@ -256,15 +256,22 @@ if (this._shouldSkipElement(element, this.config.exclusions || [])) { return; } - if ("No hash detected" !== hash) { + if ("No hash detected" === hash) { + return; + } + const color = depth === 2 && distance >= this.config.lrc_threshold || element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold ? "green" : distance === 0 ? "red" : ""; + this.logger.logColoredMessage(`${" ".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color); + this.logger.logColoredMessage(`${" ".repeat(depth)}Location hash: ${hash}`, color); + this.logger.logColoredMessage(`${" ".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color); + if (depth === 2 && distance >= this.config.lrc_threshold) { + this.lazyRenderElements.push(hash); + this.logger.logMessage(`Parent element at depth 2 with distance >= this.config.lrc_threshold pushed with hash: ${hash}`); + return; + } + if (element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold) { this.lazyRenderElements.push(hash); + this.logger.logMessage(`Child element pushed with hash: ${hash}`); } - const style = distance > 1800 ? "color: green;" : distance === 0 ? "color: red;" : ""; - console.log(`%c${" ".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, style); - const xpath = this._getXPath(element); - console.log(`%c${" ".repeat(depth)}Xpath: ${xpath}`, style); - console.log(`%c${" ".repeat(depth)}Location hash: ${hash}`, style); - console.log(`%c${" ".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, style); }); } _getXPath(element) { @@ -311,6 +318,12 @@ } console.log(msg); } + logColoredMessage(msg, color = "green") { + if (!this.enabled) { + return; + } + console.log(`%c${msg}`, `color: ${color};`); + } }; var Logger_default = Logger; diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index 834eb5abb6..abfac1251e 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var u=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||r>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=u,h=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const a=n.querySelector("img");if(a)s=a.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&c.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(o=>o!=="none");if(s.length===0)return null;const a=s[0];if(t.type="bg-img",a.includes("image-set(")&&(t.type="bg-img-set"),!a||a===""||a.includes("data:image"))return null;const g=[...a.matchAll(r)];t.bg_set=g.map(o=>o[1]?{src:o[1].trim()+(o[2]?" "+o[2].trim():"")}:{}),t.bg_set.every(o=>o.src==="")&&(t.bg_set=g.map(o=>o[1]?{src:o[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=h,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll(this.config.elements);return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return i.top+t-(window.innerHeight||document.documentElement.clientHeight)}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[]))return;n!=="No hash detected"&&this.lazyRenderElements.push(n);const s=r>1800?"color: green;":r===0?"color: red;":"";console.log(`%c${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,s);const a=this._getXPath(i);console.log(`%c${" ".repeat(t)}Xpath: ${a}`,s),console.log(`%c${" ".repeat(t)}Location hash: ${n}`,s),console.log(`%c${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,s)})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); +(()=>{var h=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||r>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=h,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const a=n.querySelector("img");if(a)s=a.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&c.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(o=>o!=="none");if(s.length===0)return null;const a=s[0];if(t.type="bg-img",a.includes("image-set(")&&(t.type="bg-img-set"),!a||a===""||a.includes("data:image"))return null;const g=[...a.matchAll(r)];t.bg_set=g.map(o=>o[1]?{src:o[1].trim()+(o[2]?" "+o[2].trim():"")}:{}),t.bg_set.every(o=>o.src==="")&&(t.bg_set=g.map(o=>o[1]?{src:o[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,m=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll(this.config.lrc_elements);return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return Math.max(0,i.top+t-(window.innerHeight||document.documentElement.clientHeight))}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[])||n==="No hash detected")return;const s=t===2&&r>=this.config.lrc_threshold||i.parentElement&&this._getElementDistance(i.parentElement)===0&&r>=this.config.lrc_threshold?"green":r===0?"red":"";if(this.logger.logColoredMessage(`${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,s),this.logger.logColoredMessage(`${" ".repeat(t)}Location hash: ${n}`,s),this.logger.logColoredMessage(`${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,s),t===2&&r>=this.config.lrc_threshold){this.lazyRenderElements.push(n),this.logger.logMessage(`Parent element at depth 2 with distance >= this.config.lrc_threshold pushed with hash: ${n}`);return}i.parentElement&&this._getElementDistance(i.parentElement)===0&&r>=this.config.lrc_threshold&&(this.lazyRenderElements.push(n),this.logger.logMessage(`Child element pushed with hash: ${n}`))})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},p=m,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}logColoredMessage(e,i="green"){this.enabled&&console.log(`%c${e}`,`color: ${i};`)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new p(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 3dd61b821f..2972a939f5 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,11 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(this.config.elements);\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight);\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" !== hash) {\n this.lazyRenderElements.push(hash);\n }\n const style = distance > 1800 ? \"color: green;\" : distance === 0 ? \"color: red;\" : \"\";\n console.log(`%c${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, style);\n const xpath = this._getXPath(element);\n console.log(`%c${\"\t\".repeat(depth)}Xpath: ${xpath}`, style);\n console.log(`%c${\"\t\".repeat(depth)}Location hash: ${hash}`, style);\n console.log(`%c${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, style);\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], - "mappings": "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", - "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "style", "xpath", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] -<<<<<<< HEAD + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(this.config.lrc_elements);\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return Math.max(0, rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight));\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" === hash) {\n return;\n }\n const color = depth === 2 && distance >= this.config.lrc_threshold || element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold ? \"green\" : distance === 0 ? \"red\" : \"\";\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Location hash: ${hash}`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color);\n if (depth === 2 && distance >= this.config.lrc_threshold) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Parent element at depth 2 with distance >= this.config.lrc_threshold pushed with hash: ${hash}`);\n return;\n }\n if (element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Child element pushed with hash: ${hash}`);\n }\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n logColoredMessage(msg, color = \"green\") {\n if (!this.enabled) {\n return;\n }\n console.log(`%c${msg}`, `color: ${color};`);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], + "mappings": "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", + "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "color", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] } -======= -} ->>>>>>> feature/lrc From d17db72e2be0e40b11a88bc8ea9027f7f38b7061 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Tue, 27 Aug 2024 04:52:05 +0200 Subject: [PATCH 104/192] Closes #6901: Add ID attribute to style LRC --- .../Optimization/LazyRenderContent/Frontend/Controller.php | 2 +- .../LazyRenderContent/Frontend/Controller/expected.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index 16fca2b18a..871a6e0827 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -93,7 +93,7 @@ private function remove_hashes( $html ) { * @return string */ private function add_css( $html ) { - $css = ''; + $css = ''; $result = preg_replace( '/<\/head>/i', $css . '', $html, 1 ); diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html index 3e0536e19e..964e6e772d 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html @@ -1,7 +1,7 @@ Original - +
From 005941b07e3a6c6b86f80b3da7e76481c892d857 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Wed, 28 Aug 2024 04:56:59 +0200 Subject: [PATCH 105/192] Closes #6909: Add lrc hashes when saas visit --- .../Optimization/LazyRenderContent/Frontend/Subscriber.php | 1 + 1 file changed, 1 insertion(+) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php index cbc2dc2bc4..bac7eb1a29 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -30,6 +30,7 @@ public function __construct( Controller $controller ) { public static function get_subscribed_events(): array { return [ 'rocket_buffer' => [ 'add_hashes', 16 ], + 'rocket_critical_image_saas_visit_buffer' => [ 'add_hashes', 16 ], ]; } From 22fb84248d29570ace9d78d274cc53bf21865204 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Wed, 28 Aug 2024 05:14:11 +0200 Subject: [PATCH 106/192] Apply phpcs --- .../Optimization/LazyRenderContent/Frontend/Subscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php index bac7eb1a29..c8c88fe4ca 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -29,7 +29,7 @@ public function __construct( Controller $controller ) { */ public static function get_subscribed_events(): array { return [ - 'rocket_buffer' => [ 'add_hashes', 16 ], + 'rocket_buffer' => [ 'add_hashes', 16 ], 'rocket_critical_image_saas_visit_buffer' => [ 'add_hashes', 16 ], ]; } From 30fb031bdec014b237db7d0fcd6ec35090fbf7b4 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Wed, 28 Aug 2024 18:49:58 +0200 Subject: [PATCH 107/192] change name of reports for performancehints and adminonly coverage --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 0f25736e69..5f8204fcdd 100644 --- a/composer.json +++ b/composer.json @@ -129,9 +129,9 @@ "test-integration": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --exclude-group AdminOnly,BeaverBuilder,Elementor,Hummingbird,WithSmush,WithWoo,WithAmp,WithAmpAndCloudflare,WithSCCSS,Cloudways,Dreampress,Cloudflare,CloudflareAdmin,Multisite,WPEngine,SpinUpWP,WordPressCom,O2Switch,PDFEmbedder,PDFEmbedderPremium,PDFEmbedderSecure,Godaddy,LiteSpeed,RevolutionSlider,WordFence,ConvertPlug,Kinsta,Jetpack,RankMathSEO,AllInOneSeoPack,SEOPress,TheSEOFramework,OneCom,RocketLazyLoad,WPXCloud,TheEventsCalendar,Perfmatters,RapidLoad,ProIsp,TranslatePress,WPGeotargeting,Weglot,Pressidium,PerformanceHints", "test-integration-coverage": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --exclude-group AdminOnly,BeaverBuilder,Elementor,Hummingbird,WithSmush,WithWoo,WithAmp,WithAmpAndCloudflare,WithSCCSS,Cloudways,Dreampress,Cloudflare,CloudflareAdmin,Multisite,WPEngine,SpinUpWP,WordPressCom,O2Switch,PDFEmbedder,PDFEmbedderPremium,PDFEmbedderSecure,Godaddy,LiteSpeed,RevolutionSlider,WordFence,ConvertPlug,Kinsta,Jetpack,RankMathSEO,AllInOneSeoPack,SEOPress,TheSEOFramework,OneCom,RocketLazyLoad,WPXCloud,TheEventsCalendar,Perfmatters,RapidLoad,ProIsp,TranslatePress,WPGeotargeting,Weglot,Pressidium,PerformanceHints --coverage-php tests/report/integration.cov", "test-integration-adminonly": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group AdminOnly", - "test-integration-adminonly-coverage": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group AdminOnly --coverage-php tests/report/unit.cov", + "test-integration-adminonly-coverage": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group AdminOnly --coverage-php tests/report/integration-adminonly.cov", "test-integration-performancehints": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group PerformanceHints", - "test-integration-performancehints-coverage": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group PerformanceHints --coverage-php tests/report/unit.cov", + "test-integration-performancehints-coverage": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group PerformanceHints --coverage-php tests/report/integration-performancehints.cov", "test-integration-bb": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group BeaverBuilder", "test-integration-cloudflare": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group Cloudflare", "test-integration-cloudflareadmin": "\"vendor/bin/phpunit\" --testsuite integration --colors=always --configuration tests/Integration/phpunit.xml.dist --group CloudflareAdmin", From c38ed94e7685742261537f8295ac1bfc993cb850 Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 29 Aug 2024 04:54:44 +0200 Subject: [PATCH 108/192] Integration tests - Beginning --- .../Frontend/Subscriber/add_hashes.php | 27 +++++++ .../Frontend/Subscriber/html/expected.php | 71 +++++++++++++++++++ .../Frontend/Subscriber/html/original.php | 71 +++++++++++++++++++ .../Frontend/Subscriber/add_hashes.php | 54 ++++++++++++++ 4 files changed, 223 insertions(+) create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php create mode 100644 tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php new file mode 100644 index 0000000000..6f6bd25f0c --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -0,0 +1,27 @@ + [ + 'shouldAddHashes' => [ + 'config' => [ + 'row' => [ + 'url' => 'http://example.org/', + 'is_mobile' => 0, + 'below_the_fold' => json_encode( + [ + "93548b90aa8f4989f7198144479055dc", + "7b16eca0652d4703f83ba63e304f2030", + "737184bbad8e65d0172a89cc68a46107", + "8a4ef50742cf3456f9db6425e16930dc" + ] + ), + 'status' => 'completed' + ], + 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php' ), + ], + 'expected' => [ + 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php' ), + ] + ] + ] +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php new file mode 100644 index 0000000000..881199a7f6 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php @@ -0,0 +1,71 @@ + + + + + + + + + + + + +
400px +
800 px +































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































+ 1800 px
Testing something
+
+
+ +
+
+
+
+ This is a class with margin-top set to 3000px +
+
+
+
+ +
+
+
+ This is a class with margin-top set to 1800px +
+
+
+ +
+ Somethign fishy going on. +
+ + + + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php new file mode 100644 index 0000000000..4c4601398e --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php @@ -0,0 +1,71 @@ + + + + + + + + + + + + +
400px +
800 px +































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































+ 1800 px
Testing something
+
+
+ +
+
+
+
+ This is a class with margin-top set to 3000px +
+
+
+
+ +
+
+
+ This is a class with margin-top set to 1800px +
+
+
+ +
+ Somethign fishy going on. +
+ + + + diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php new file mode 100644 index 0000000000..e337e37691 --- /dev/null +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -0,0 +1,54 @@ +unregisterAllCallbacksExcept('rocket_critical_image_saas_visit_buffer', 'add_hashes', 16); + } + + public function tear_down() + { + $this->restoreWpHook('rocket_critical_image_saas_visit_buffer'); + + parent::tear_down(); + } + + /** + * @dataProvider providerTestData + */ + public function testShouldWorkAsExpected( $config, $expected ) { + self::addLrc($config['row']); + + $this->assertSame( + $expected['html'], + apply_filters( 'rocket_critical_image_saas_visit_buffer', $config['html'] ) + ); + } +} From aeecd38744aacb77ffc6f114c9b7b318954bd478 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 29 Aug 2024 08:30:45 +0100 Subject: [PATCH 109/192] Add filter to integration test --- .../LazyRenderContent/Frontend/Subscriber/add_hashes.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php index e337e37691..84d1899765 100644 --- a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -36,6 +36,7 @@ public function set_up() public function tear_down() { $this->restoreWpHook('rocket_critical_image_saas_visit_buffer'); + remove_filter( 'rocket_lazy_render_content_optimization', '__return_false' ); parent::tear_down(); } @@ -46,6 +47,8 @@ public function tear_down() public function testShouldWorkAsExpected( $config, $expected ) { self::addLrc($config['row']); + add_filter( 'rocket_lazy_render_content_optimization', '__return_true' ); + $this->assertSame( $expected['html'], apply_filters( 'rocket_critical_image_saas_visit_buffer', $config['html'] ) From 17485cab8626b7143d3f38ebd3ddd5f3b14a0617 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 29 Aug 2024 10:16:33 +0100 Subject: [PATCH 110/192] Fixes #6910 regex to remove data mismatch (#6915) --- .../LazyRenderContent/Frontend/Controller.php | 2 +- .../Frontend/Controller/expected-single-line.html | 14 ++++++++++++++ .../Frontend/Controller/optimize.php | 10 ++++++++++ .../Frontend/Controller/single-line-hashed.html | 13 +++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected-single-line.html create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/single-line-hashed.html diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index 871a6e0827..8308990c49 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -76,7 +76,7 @@ public function optimize( string $html, $row ): string { * @return string */ private function remove_hashes( $html ) { - $result = preg_replace( '/data-rocket-location-hash="(?:.*)"/i', '', $html ); + $result = preg_replace( '/data-rocket-location-hash="[^"]*"/i', '', $html ); if ( null === $result ) { return $html; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected-single-line.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected-single-line.html new file mode 100644 index 0000000000..5bcd545efa --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected-single-line.html @@ -0,0 +1,14 @@ + + + Single line element + + + +
div in body
another div in body
header in div in div in body
another div in header in div in div in body
+
+
+

Original footer

+
+
+ + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php index 796c87a39c..c55eee95d8 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php @@ -2,6 +2,8 @@ $hashed = file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/hashed.html' ); $expected = file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected.html' ); +$single_line_hashed = file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/single-line-hashed.html' ); +$single_line_expected = file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/expected-single-line.html' ); return [ 'testShouldReturnEarlyWhenNoDbEntry' => [ @@ -36,4 +38,12 @@ 'html' => $hashed, 'expected' => $expected, ], + 'testShouldReturnUpdatedHtmlForSingleLine' => [ + 'config' => [ + 'has_lrc' => true, + 'below_the_fold' => json_encode( [ '7b16eca0652d4703f83ba63e304f2030', '30c5235261141d2450dc033e5c78bbcc', 'b42afa69f728fcc707157eb61efa53cc' ] ), + ], + 'html' => $single_line_hashed, + 'expected' => $single_line_expected, + ], ]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/single-line-hashed.html b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/single-line-hashed.html new file mode 100644 index 0000000000..3e3eae2c58 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/single-line-hashed.html @@ -0,0 +1,13 @@ + + + Single line element + + +
div in body
another div in body
header in div in div in body
another div in header in div in div in body
+
+
+

Original footer

+
+
+ + From d7a5719c9211d080f22af8594480b3f260219196 Mon Sep 17 00:00:00 2001 From: Michael Lee <38788055+jeawhanlee@users.noreply.github.com> Date: Thu, 29 Aug 2024 10:17:07 +0100 Subject: [PATCH 111/192] Closes #6890: 3.17: Beacon script isnot injected in the uncached page if URL have LRC and not have LCP (#6925) Co-authored-by: Mathieu Lamiot --- .../Common/PerformanceHints/Frontend/Processor.php | 7 ++++--- .../Subscriber/HTML/input_with_only_lrc_opt.html | 12 ++++++++++++ .../HTML/output_with_beacon_and_only_lrc_opt.html | 12 ++++++++++++ .../Subscriber/maybe_apply_optimizations.php | 14 +++++++++++++- 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_only_lrc_opt.html create mode 100644 tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php index 7566fd51c9..96b080dec9 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Processor.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Processor.php @@ -58,6 +58,9 @@ public function maybe_apply_optimizations( string $html ): string { $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); $is_mobile = $this->is_mobile(); + // Set flag as true by default. + $optimization_applied = true; + foreach ( $this->factories as $factory ) { $row = $factory->queries()->get_row( $url, $is_mobile ); @@ -68,11 +71,9 @@ public function maybe_apply_optimizations( string $html ): string { } $html = $factory->get_frontend_controller()->optimize( $html, $row ); - // Set flag as true since optimization has been applied. - $optimization_applied = true; } - // Check if any optimizations were applied, if not, inject beacon. + // Check if all optimizations were applied: if not, inject beacon. if ( ! $optimization_applied ) { $html = $this->inject_beacon( $html, $url, $is_mobile ); } diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_only_lrc_opt.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_only_lrc_opt.html new file mode 100644 index 0000000000..ec7f7eb878 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/input_with_only_lrc_opt.html @@ -0,0 +1,12 @@ + + + Test + + + +
+
+
+
+ + diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html new file mode 100644 index 0000000000..f391208329 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html @@ -0,0 +1,12 @@ + + + Test + + + +
+
+
+
+ + diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php index d7ad78532d..3715747404 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/maybe_apply_optimizations.php @@ -14,6 +14,8 @@ $html_input_with_absolute_img_lcp = file_get_contents(__DIR__ . '/HTML/input_with_absolute_img_lcp.html'); $html_input_with_domain_img_lcp = file_get_contents(__DIR__ . '/HTML/input_lcp_image.html'); $html_output_with_beacon_and_lcp_opt = file_get_contents(__DIR__ . '/HTML/output_with_beacon_and_atf_opt.html'); +$html_input_with_only_lrc_opt = file_get_contents(__DIR__ . '/HTML/input_with_only_lrc_opt.html'); +$html_output_with_beacon_and_only_lrc_opt = file_get_contents(__DIR__ . '/HTML/output_with_beacon_and_only_lrc_opt.html'); $lrc = [ 'row' => [ @@ -508,7 +510,7 @@ ], 'expected' => file_get_contents(__DIR__ . '/HTML/output_lcp_picture_4.php'), ], - 'ShouldAddBeaconToPageWhenOnlyOnePerformanceHintsFeatureIsNotInDB' => [ + 'ShouldAddBeaconToPageWhenOnlyLcpIsInDb' => [ 'config' => [ 'html' => $html_input_with_domain_img_lcp, 'atf' => [ @@ -528,5 +530,15 @@ ], 'expected' => $html_output_with_beacon_and_lcp_opt, ], + 'ShouldAddBeaconToPageWhenOnlyLrcIsInDb' => [ + 'config' => [ + 'html' => $html_input_with_only_lrc_opt, + 'atf' => [ + 'row' => null, + ], + 'lrc' => $lrc, + ], + 'expected' => $html_output_with_beacon_and_only_lrc_opt, + ], ], ]; From e913a7a813315a0c1bbe232dd8b3a8fdb7d19abc Mon Sep 17 00:00:00 2001 From: Gael Robin Date: Thu, 29 Aug 2024 12:44:24 +0200 Subject: [PATCH 112/192] Update expected result integration test --- .../Frontend/Subscriber/html/expected.php | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php index 881199a7f6..d6080e38f6 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php @@ -1,5 +1,5 @@ - + - - +?> @@ -37,16 +35,16 @@ -
400px -
800 px -































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































- 1800 px
Testing something
+
400px +
800 px +































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































+ 1800 px
Testing something
-
-
-
+
+
+
This is a class with margin-top set to 3000px
@@ -54,15 +52,15 @@
-
-
-
+
+
+
This is a class with margin-top set to 1800px
-
+
Somethign fishy going on.
From 807c4a5455373b119d48ea5a6ac25c1afb86cedf Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 29 Aug 2024 12:50:37 +0100 Subject: [PATCH 113/192] Use correct group --- .../LazyRenderContent/Frontend/Subscriber/add_hashes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php index 84d1899765..d390493cc2 100644 --- a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -8,7 +8,7 @@ * Test class covering \WP_Rocket\Engine\CDN\Subscriber::rewrite * * @uses \WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Subscriber::add_hashes() - * @group LazyRenderContent + * @group PerformanceHints */ class Test_add_hashes extends TestCase { From 5d971d4b34e90d0345e891dc9f8da1b7e5cb1100 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Thu, 29 Aug 2024 13:00:01 +0100 Subject: [PATCH 114/192] Updated doc block and test data --- .../LazyRenderContent/Frontend/Subscriber/add_hashes.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php index d390493cc2..104b2e74a2 100644 --- a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -2,18 +2,15 @@ namespace WP_Rocket\Tests\Integration\inc\Engine\Optimization\LazyRenderContent\Frontend\Subscriber; -use WP_Rocket\Tests\Integration\inc\Engine\Optimization\TestCase; +use WP_Rocket\Tests\Integration\TestCase; /** - * Test class covering \WP_Rocket\Engine\CDN\Subscriber::rewrite + * Test class covering \WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Subscriber::add_hashes() * - * @uses \WP_Rocket\Engine\Optimization\LazyRenderContent\Frontend\Subscriber::add_hashes() * @group PerformanceHints */ class Test_add_hashes extends TestCase { - protected $path_to_test_data = '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php'; - public static function set_up_before_class() { parent::set_up_before_class(); @@ -42,7 +39,7 @@ public function tear_down() } /** - * @dataProvider providerTestData + * @dataProvider configTestData */ public function testShouldWorkAsExpected( $config, $expected ) { self::addLrc($config['row']); From 750757806191c8b78345ad7612a0468de4ffa9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Robin?= Date: Fri, 30 Aug 2024 14:35:35 +0200 Subject: [PATCH 115/192] Closes #6914: URLs are not fetched when updating from 3.16+ to 3.17 (#6926) --- inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php index 2184c04b97..1e4d5a4b2c 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php @@ -75,7 +75,7 @@ public function send_to_saas( string $url ): void { * @return void */ public function warm_up_on_update( $new_version, $old_version ) { - if ( version_compare( $old_version, '3.16', '>=' ) ) { + if ( version_compare( $old_version, '3.17', '>=' ) ) { return; } $this->controller->warm_up(); From e57a54a307c76bd44a9602e7857e76db00d7eecd Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Fri, 30 Aug 2024 14:53:06 +0200 Subject: [PATCH 116/192] bump version to 3.17-alpha2 --- wp-rocket.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp-rocket.php b/wp-rocket.php index 5eb23a6f97..01064e7d28 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.17-alpha1 + * Version: 3.17-alpha2 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.17-alpha1' ); +define( 'WP_ROCKET_VERSION', '3.17-alpha2' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' ); From 7150c171cd845d9ea8d21e3a44c2b7f6b58855fa Mon Sep 17 00:00:00 2001 From: WordPress Fan <146129302+wordpressfan@users.noreply.github.com> Date: Fri, 30 Aug 2024 15:58:48 +0300 Subject: [PATCH 117/192] Depend on php to identify elements and depth (PR #6929) Co-authored-by: Mai <76941962+Mai-Saad@users.noreply.github.com> --- assets/js/wpr-beacon.js | 16 +++---- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 6 +-- .../LazyRenderContent/Frontend/Controller.php | 19 -------- .../Frontend/Processor/Dom.php | 16 +++---- .../Frontend/Processor/HelperTrait.php | 47 +++++++++++++++++++ .../Frontend/Processor/Regex.php | 16 +++---- .../Frontend/Processor/SimpleHtmlDom.php | 16 +++---- package.json | 2 +- .../Subscriber/HTML/output_w_beacon.html | 2 +- .../HTML/output_with_beacon_and_atf_opt.html | 2 +- .../output_with_beacon_and_only_lrc_opt.html | 2 +- .../Frontend/Controller/addCustomData.php | 2 - 13 files changed, 79 insertions(+), 69 deletions(-) create mode 100644 inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index 94d3d21198..1275eb3f64 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -209,7 +209,7 @@ } } _getLazyRenderElements() { - const elements = document.querySelectorAll(this.config.lrc_elements); + const elements = document.querySelectorAll("[data-rocket-location-hash]"); if (elements.length <= 0) { return []; } @@ -233,7 +233,7 @@ _getElementDistance(element) { const rect = element.getBoundingClientRect(); const scrollTop = window.pageYOffset || document.documentElement.scrollTop; - return Math.max(0, rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight)); + return Math.max(0, rect.top + scrollTop); } _skipElement(element) { const skipStrings = this.config.skipStrings || ["memex"]; @@ -259,18 +259,14 @@ if ("No hash detected" === hash) { return; } - const color = depth === 2 && distance >= this.config.lrc_threshold || element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold ? "green" : distance === 0 ? "red" : ""; + const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance > this.config.lrc_threshold; + const color = can_push_hash ? "green" : distance === 0 ? "red" : ""; this.logger.logColoredMessage(`${" ".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color); this.logger.logColoredMessage(`${" ".repeat(depth)}Location hash: ${hash}`, color); this.logger.logColoredMessage(`${" ".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color); - if (depth === 2 && distance >= this.config.lrc_threshold) { + if (can_push_hash) { this.lazyRenderElements.push(hash); - this.logger.logMessage(`Parent element at depth 2 with distance >= this.config.lrc_threshold pushed with hash: ${hash}`); - return; - } - if (element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold) { - this.lazyRenderElements.push(hash); - this.logger.logMessage(`Child element pushed with hash: ${hash}`); + this.logger.logMessage(`Element pushed with hash: ${hash}`); } }); } diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index abfac1251e..fba30fa208 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var h=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,n=e&&(t>i.width||r>i.height),s=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=h,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(n=>{if(n.nodeName.toLowerCase()==="img"&&n.parentElement.nodeName.toLowerCase()==="picture")return null;let s;if(n.nodeName.toLowerCase()==="picture"){const a=n.querySelector("img");if(a)s=a.getBoundingClientRect();else return null}else s=n.getBoundingClientRect();return{element:n,rect:s}}).filter(n=>n!==null).filter(n=>n.rect.width>0&&n.rect.height>0&&c.isIntersecting(n.rect)).map(n=>({item:n,area:this._getElementArea(n.rect),elementInfo:this._getElementInfo(n.element)})).sort((n,s)=>s.area-n.area).slice(0,e).map(n=>({element:n.item.element,elementInfo:n.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const n=e.querySelector("source");t.src=e.poster||(n?n.src:""),t.current_src=t.src}else if(i==="svg"){const n=e.querySelector("image");n&&(t.type="img",t.src=n.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const n=e.querySelector("img");t.src=n?n.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(s=>({srcset:s.srcset||"",media:s.media||"",type:s.type||"",sizes:s.sizes||""}))}else{const s=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(o=>o!=="none");if(s.length===0)return null;const a=s[0];if(t.type="bg-img",a.includes("image-set(")&&(t.type="bg-img-set"),!a||a===""||a.includes("data:image"))return null;const g=[...a.matchAll(r)];t.bg_set=g.map(o=>o[1]?{src:o[1].trim()+(o[2]?" "+o[2].trim():"")}:{}),t.bg_set.every(o=>o.src==="")&&(t.bg_set=g.map(o=>o[1]?{src:o[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(n=>n.src===i.src)}getResults(){return this.performanceImages}},d=u,m=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll(this.config.lrc_elements);return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return Math.max(0,i.top+t-(window.innerHeight||document.documentElement.clientHeight))}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[])||n==="No hash detected")return;const s=t===2&&r>=this.config.lrc_threshold||i.parentElement&&this._getElementDistance(i.parentElement)===0&&r>=this.config.lrc_threshold?"green":r===0?"red":"";if(this.logger.logColoredMessage(`${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,s),this.logger.logColoredMessage(`${" ".repeat(t)}Location hash: ${n}`,s),this.logger.logColoredMessage(`${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,s),t===2&&r>=this.config.lrc_threshold){this.lazyRenderElements.push(n),this.logger.logMessage(`Parent element at depth 2 with distance >= this.config.lrc_threshold pushed with hash: ${n}`);return}i.parentElement&&this._getElementDistance(i.parentElement)===0&&r>=this.config.lrc_threshold&&(this.lazyRenderElements.push(n),this.logger.logMessage(`Child element pushed with hash: ${n}`))})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},p=m,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}logColoredMessage(e,i="green"){this.enabled&&console.log(`%c${e}`,`color: ${i};`)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new p(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); +(()=>{var h=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,s=e&&(t>i.width||r>i.height),n=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=h,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(s=>{if(s.nodeName.toLowerCase()==="img"&&s.parentElement.nodeName.toLowerCase()==="picture")return null;let n;if(s.nodeName.toLowerCase()==="picture"){const o=s.querySelector("img");if(o)n=o.getBoundingClientRect();else return null}else n=s.getBoundingClientRect();return{element:s,rect:n}}).filter(s=>s!==null).filter(s=>s.rect.width>0&&s.rect.height>0&&c.isIntersecting(s.rect)).map(s=>({item:s,area:this._getElementArea(s.rect),elementInfo:this._getElementInfo(s.element)})).sort((s,n)=>n.area-s.area).slice(0,e).map(s=>({element:s.item.element,elementInfo:s.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const s=e.querySelector("source");t.src=e.poster||(s?s.src:""),t.current_src=t.src}else if(i==="svg"){const s=e.querySelector("image");s&&(t.type="img",t.src=s.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const s=e.querySelector("img");t.src=s?s.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(n=>({srcset:n.srcset||"",media:n.media||"",type:n.type||"",sizes:n.sizes||""}))}else{const n=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(a=>a!=="none");if(n.length===0)return null;const o=n[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const g=[...o.matchAll(r)];t.bg_set=g.map(a=>a[1]?{src:a[1].trim()+(a[2]?" "+a[2].trim():"")}:{}),t.bg_set.every(a=>a.src==="")&&(t.bg_set=g.map(a=>a[1]?{src:a[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(s=>s.src===i.src)}getResults(){return this.performanceImages}},d=u,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll("[data-rocket-location-hash]");return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return Math.max(0,i.top+t)}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[])||s==="No hash detected")return;const n=i.parentElement&&this._getElementDistance(i.parentElement)this.config.lrc_threshold,o=n?"green":r===0?"red":"";this.logger.logColoredMessage(`${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Location hash: ${s}`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,o),n&&(this.lazyRenderElements.push(s),this.logger.logMessage(`Element pushed with hash: ${s}`))})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}logColoredMessage(e,i="green"){this.enabled&&console.log(`%c${e}`,`color: ${i};`)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 2972a939f5..2c6e4c273c 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(this.config.lrc_elements);\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return Math.max(0, rect.top + scrollTop - (window.innerHeight || document.documentElement.clientHeight));\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" === hash) {\n return;\n }\n const color = depth === 2 && distance >= this.config.lrc_threshold || element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold ? \"green\" : distance === 0 ? \"red\" : \"\";\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Location hash: ${hash}`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color);\n if (depth === 2 && distance >= this.config.lrc_threshold) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Parent element at depth 2 with distance >= this.config.lrc_threshold pushed with hash: ${hash}`);\n return;\n }\n if (element.parentElement && this._getElementDistance(element.parentElement) === 0 && distance >= this.config.lrc_threshold) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Child element pushed with hash: ${hash}`);\n }\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n logColoredMessage(msg, color = \"green\") {\n if (!this.enabled) {\n return;\n }\n console.log(`%c${msg}`, `color: ${color};`);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], - "mappings": "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", - "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "color", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(\"[data-rocket-location-hash]\");\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return Math.max(0, rect.top + scrollTop);\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" === hash) {\n return;\n }\n const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance > this.config.lrc_threshold;\n const color = can_push_hash ? \"green\" : distance === 0 ? \"red\" : \"\";\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Location hash: ${hash}`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color);\n if (can_push_hash) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Element pushed with hash: ${hash}`);\n }\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n logColoredMessage(msg, color = \"green\") {\n if (!this.enabled) {\n return;\n }\n console.log(`%c${msg}`, `color: ${color};`);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], + "mappings": "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", + "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "can_push_hash", "color", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] } diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index 8308990c49..b1a473646e 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -138,25 +138,6 @@ public function add_hashes( $html ) { * @return array */ public function add_custom_data( array $data ): array { - $elements = [ - 'div', - 'main', - 'footer', - 'section', - 'article', - 'header', - ]; - - /** - * Filters the array of elements - * - * @since 3.17 - * - * @param array $formats Array of elements - */ - $elements = wpm_apply_filters_typed( 'array', 'rocket_lrc_elements', $elements ); - - $data['lrc_elements'] = implode( ', ', $elements ); $data['status']['lrc'] = $this->context->is_allowed(); /** diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php index 3ee5a3b45f..a96f2388c4 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/Dom.php @@ -7,6 +7,9 @@ use WP_Rocket\Logger\Logger; class Dom implements ProcessorInterface { + + use HelperTrait; + /** * Add hashes to the HTML elements * @@ -41,7 +44,7 @@ public function add_hashes( $html ) { return $html; } - $this->add_hash_to_element( $body, 2 ); + $this->add_hash_to_element( $body, $this->get_depth() ); return $dom->saveHTML(); } @@ -57,14 +60,7 @@ private function add_hash_to_element( $element, $depth ) { return; } - $skip_tags = [ - 'DIV', - 'MAIN', - 'FOOTER', - 'SECTION', - 'ARTICLE', - 'HEADER', - ]; + $processed_tags = $this->get_processed_tags(); static $count = 0; @@ -76,7 +72,7 @@ private function add_hash_to_element( $element, $depth ) { if ( XML_ELEMENT_NODE !== $child->nodeType // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase || - ! in_array( strtoupper( $child->tagName ), $skip_tags, true ) // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + ! in_array( strtoupper( $child->tagName ), $processed_tags, true ) // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase ) { continue; } diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php new file mode 100644 index 0000000000..8a91d3d97e --- /dev/null +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php @@ -0,0 +1,47 @@ +<(' . implode( '|', $skip_tags ) . ')[^>]*>)/is', $element, $matches, PREG_SET_ORDER ); + $processed_tags = $this->get_processed_tags(); + + $result = preg_match_all( '/(?><(' . implode( '|', $processed_tags ) . ')[^>]*>)/is', $element, $matches, PREG_SET_ORDER ); if ( ! $result ) { Logger::error( 'No elements found in the HTML content.', [ 'LazyRenderContent' ] ); diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php index 3c7f88a2d4..022f0f6ad3 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/SimpleHtmlDom.php @@ -9,6 +9,9 @@ use WP_Rocket\Logger\Logger; class SimpleHtmlDom implements ProcessorInterface { + + use HelperTrait; + /** * Add hashes to the HTML elements * @@ -27,7 +30,7 @@ public function add_hashes( $html ) { return $html; } - $this->add_hash_to_element( $body, 2 ); + $this->add_hash_to_element( $body, $this->get_depth() ); return $dom->save(); } @@ -43,19 +46,12 @@ private function add_hash_to_element( $element, $depth ) { return; } - $skip_tags = [ - 'DIV', - 'MAIN', - 'FOOTER', - 'SECTION', - 'ARTICLE', - 'HEADER', - ]; + $processed_tags = $this->get_processed_tags(); static $count = 0; foreach ( $element->childNodes() as $child ) { - if ( ! in_array( strtoupper( $child->getTag() ), $skip_tags, true ) ) { + if ( ! in_array( strtoupper( $child->getTag() ), $processed_tags, true ) ) { continue; } diff --git a/package.json b/package.json index de1c9e83d3..018b79d688 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "watchify": "^4.0.0", "webpack": "^5.76.0", "webpack-cli": "^4.9.1", - "wp-rocket-scripts": "^1.0.4", + "wp-rocket-scripts": "github:wp-media/rocket-scripts#enhancement/depend-on-php", "yargs": "^17.3.0" } } diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html index 1fc89a476a..a4fe6228a8 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_w_beacon.html @@ -3,5 +3,5 @@ Test - + diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html index 7d77c7ec39..8e8bf4b6da 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_atf_opt.html @@ -4,5 +4,5 @@ Sample alt - + diff --git a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html index f391208329..7016432590 100644 --- a/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html +++ b/tests/Fixtures/inc/Engine/Common/PerformanceHints/Frontend/Subscriber/HTML/output_with_beacon_and_only_lrc_opt.html @@ -8,5 +8,5 @@
- + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php index 2af6415657..82d36afecb 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/addCustomData.php @@ -7,7 +7,6 @@ ], 'data' => [], 'expected' => [ - 'lrc_elements' => 'div, main, footer, section, article, header', 'status' => [ 'lrc' => true, ], @@ -20,7 +19,6 @@ ], 'data' => [], 'expected' => [ - 'lrc_elements' => 'div, main, footer, section, article, header', 'status' => [ 'lrc' => false, ], From 88bfea5e42a77abc56e5b6766146e7dfc14e559e Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 30 Aug 2024 15:09:06 +0100 Subject: [PATCH 118/192] Fixes #6885 Hosting cache not cleared when clearing Performance Hints for current URL (PR #6921) Co-authored-by: WordPressFan --- inc/Addon/Varnish/Subscriber.php | 11 ++++++----- .../inc/Addon/Varnish/Subscriber/cleanFile.php | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/inc/Addon/Varnish/Subscriber.php b/inc/Addon/Varnish/Subscriber.php index 6b1e9fa1d8..fe5adbf213 100644 --- a/inc/Addon/Varnish/Subscriber.php +++ b/inc/Addon/Varnish/Subscriber.php @@ -40,11 +40,12 @@ public function __construct( Varnish $varnish, Options_Data $options ) { */ public static function get_subscribed_events() { return [ - 'before_rocket_clean_domain' => [ 'clean_domain', 10, 3 ], - 'before_rocket_clean_file' => [ 'clean_file' ], - 'rocket_rucss_after_clearing_usedcss' => [ 'clean_file' ], - 'before_rocket_clean_home' => [ 'clean_home', 10, 2 ], - 'rocket_saas_complete_job_status' => [ 'clean_file' ], + 'before_rocket_clean_domain' => [ 'clean_domain', 10, 3 ], + 'before_rocket_clean_file' => [ 'clean_file' ], + 'rocket_rucss_after_clearing_usedcss' => [ 'clean_file' ], + 'rocket_performance_hints_data_after_clearing' => [ 'clean_file' ], + 'before_rocket_clean_home' => [ 'clean_home', 10, 2 ], + 'rocket_saas_complete_job_status' => [ 'clean_file' ], ]; } diff --git a/tests/Fixtures/inc/Addon/Varnish/Subscriber/cleanFile.php b/tests/Fixtures/inc/Addon/Varnish/Subscriber/cleanFile.php index 8c32b2382f..aae721a1be 100644 --- a/tests/Fixtures/inc/Addon/Varnish/Subscriber/cleanFile.php +++ b/tests/Fixtures/inc/Addon/Varnish/Subscriber/cleanFile.php @@ -54,4 +54,22 @@ ], 'expected' => true, ], + 'testRocketPerformanceHintDataShouldPurgeOnceWhenVarnishEnabled' => [ + 'config' => [ + 'filter' => false, + 'hook' => 'rocket_performance_hints_data_after_clearing', + 'arg' => 'http://example.org/about/', + 'option' => 1, + ], + 'expected' => true, + ], + 'testRocketPerformanceHintDataShouldPurgeOnceWhenFilterEnabled' => [ + 'config' => [ + 'filter' => true, + 'hook' => 'rocket_performance_hints_data_after_clearing', + 'arg' => 'http://example.org/about/', + 'option' => 0, + ], + 'expected' => true, + ] ]; From 4d7b54b0796449ab88a10a756266faebf9c4c339 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Mon, 2 Sep 2024 14:42:24 +0100 Subject: [PATCH 119/192] Closes #6878 Activation and deactivation of Performance hints data filters (#6928) --- .../PerformanceHints/Admin/Controller.php | 36 ++++++++++++------- .../PerformanceHints/ServiceProvider.php | 2 +- tests/Integration/bootstrap.php | 16 +++++++++ .../Admin/Controller/truncateOnUpdate.php | 10 +++++- 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Admin/Controller.php b/inc/Engine/Common/PerformanceHints/Admin/Controller.php index 6ff7129a62..37d65ea64c 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/Controller.php +++ b/inc/Engine/Common/PerformanceHints/Admin/Controller.php @@ -27,10 +27,6 @@ public function __construct( array $factories ) { * @return void */ public function truncate_tables() { - if ( empty( $this->factories ) ) { - return; - } - $this->delete_rows(); } @@ -68,10 +64,6 @@ private function delete_rows() { * @return void */ public function delete_post( $post_id ) { - if ( empty( $this->factories ) ) { - return; - } - $url = get_permalink( $post_id ); if ( false === $url ) { @@ -89,10 +81,6 @@ public function delete_post( $post_id ) { * @return void */ public function delete_term( $term_id ) { - if ( empty( $this->factories ) ) { - return; - } - $url = get_term_link( (int) $term_id ); if ( is_wp_error( $url ) ) { @@ -102,6 +90,24 @@ public function delete_term( $term_id ) { $this->delete_by_url( $url ); } + /** + * Should allow early if true. + * + * @return bool + */ + private function is_allowed(): bool { + $allowed = false; + + foreach ( $this->factories as $factory ) { + if ( $factory->get_context()->is_allowed() ) { + $allowed = true; + break; + } + } + + return $allowed; + } + /** * Deletes rows when triggering clean from admin * @@ -110,7 +116,7 @@ public function delete_term( $term_id ) { * @return array */ public function truncate_from_admin( $clean ) { - if ( empty( $this->factories ) ) { + if ( ! $this->is_allowed() ) { return $clean; } @@ -172,6 +178,10 @@ public function truncate_on_update( $new_version, $old_version ) { return; } + if ( ! $this->is_allowed() ) { + return; + } + $this->truncate_tables(); } diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index cdf6011f2c..d3d711b5e5 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -110,7 +110,7 @@ public function register(): void { $this->getContainer()->add( 'performance_hints_admin_controller', AdminController::class ) ->addArguments( [ - $factories, + $factory_array, ] ); diff --git a/tests/Integration/bootstrap.php b/tests/Integration/bootstrap.php index 018006ebab..da5ab4adf9 100644 --- a/tests/Integration/bootstrap.php +++ b/tests/Integration/bootstrap.php @@ -273,6 +273,22 @@ function () { } ); +tests_add_filter( + 'wp_loaded', + function() { + + if ( BootstrapManager::isGroup( 'PerformanceHints' ) ) { + return; + } + $container = apply_filters( 'rocket_container', null ); + $atf_table = $container->get( 'atf_table' ); + $atf_table->uninstall(); + + $lrc_table = $container->get( 'lrc_table' ); + $lrc_table->uninstall(); + } +); + // install WC. tests_add_filter( 'setup_theme', diff --git a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php index 640353397a..265d38f404 100644 --- a/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php +++ b/tests/Unit/inc/Engine/Common/PerformanceHints/Admin/Controller/truncateOnUpdate.php @@ -4,6 +4,7 @@ namespace WP_Rocket\tests\Unit\inc\Engine\Common\PerformanceHints\Admin\Controller; use Mockery; +use WP_Rocket\Engine\Common\Context\ContextInterface; use WP_Rocket\Tests\Unit\TestCase; use WP_Rocket\Engine\Common\PerformanceHints\Admin\Controller; use WP_Rocket\Engine\Media\AboveTheFold\Factory as ATFFactory; @@ -15,10 +16,11 @@ * * @group PerformanceHints */ -class TestTruncateOnUpdate extends TestCase { +class Test_TruncateOnUpdate extends TestCase { private $factories; private $queries; private $table; + private $context; protected function setUp(): void { parent::setUp(); @@ -26,8 +28,10 @@ protected function setUp(): void { $this->queries = $this->createMock(AboveTheFold::class); $this->table = $this->createMock(ATFTable::class); $atf_factory = $this->createMock(ATFFactory::class); + $this->context = $this->createMock(ContextInterface::class); $atf_factory->method('queries')->willReturn($this->queries); $atf_factory->method('table')->willReturn($this->table); + $atf_factory->method('get_context')->willReturn($this->context); $this->factories = [ $atf_factory, @@ -44,6 +48,10 @@ public function testShouldDoExpected( $config, $expected ) { $this->queries->expects( $this->never() ) ->method( 'get_not_completed_count' ); } else { + $this->context->expects( $this->once() ) + ->method('is_allowed') + ->willReturn(true); + $this->queries->expects( $this->once() ) ->method( 'get_not_completed_count' ) ->willReturn( $config['not_completed'] ); From 93385c5ca3037d1fdebdf367156c99dca8d4f9b6 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Tue, 3 Sep 2024 13:50:14 +0300 Subject: [PATCH 120/192] consider viewport --- assets/js/wpr-beacon.js | 12 +++++++++--- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index 1275eb3f64..b5e4601664 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -1,9 +1,15 @@ (() => { // src/Utils.js var BeaconUtils = class { + static getScreenWidth() { + return window.innerWidth || document.documentElement.clientWidth; + } + static getScreenHeight() { + return window.innerHeight || document.documentElement.clientHeight; + } static isNotValidScreensize(is_mobile, threshold) { - const screenWidth = window.innerWidth || document.documentElement.clientWidth; - const screenHeight = window.innerHeight || document.documentElement.clientHeight; + const screenWidth = this.getScreenWidth(); + const screenHeight = this.getScreenHeight(); const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height); const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height); return isNotValidForMobile || isNotValidForDesktop; @@ -233,7 +239,7 @@ _getElementDistance(element) { const rect = element.getBoundingClientRect(); const scrollTop = window.pageYOffset || document.documentElement.scrollTop; - return Math.max(0, rect.top + scrollTop); + return Math.max(0, rect.top + scrollTop - Utils_default.getScreenHeight()); } _skipElement(element) { const skipStrings = this.config.skipStrings || ["memex"]; diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index fba30fa208..5982d56a28 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var h=class{static isNotValidScreensize(e,i){const t=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,s=e&&(t>i.width||r>i.height),n=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=h,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(s=>{if(s.nodeName.toLowerCase()==="img"&&s.parentElement.nodeName.toLowerCase()==="picture")return null;let n;if(s.nodeName.toLowerCase()==="picture"){const o=s.querySelector("img");if(o)n=o.getBoundingClientRect();else return null}else n=s.getBoundingClientRect();return{element:s,rect:n}}).filter(s=>s!==null).filter(s=>s.rect.width>0&&s.rect.height>0&&c.isIntersecting(s.rect)).map(s=>({item:s,area:this._getElementArea(s.rect),elementInfo:this._getElementInfo(s.element)})).sort((s,n)=>n.area-s.area).slice(0,e).map(s=>({element:s.item.element,elementInfo:s.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const s=e.querySelector("source");t.src=e.poster||(s?s.src:""),t.current_src=t.src}else if(i==="svg"){const s=e.querySelector("image");s&&(t.type="img",t.src=s.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const s=e.querySelector("img");t.src=s?s.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(n=>({srcset:n.srcset||"",media:n.media||"",type:n.type||"",sizes:n.sizes||""}))}else{const n=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(a=>a!=="none");if(n.length===0)return null;const o=n[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const g=[...o.matchAll(r)];t.bg_set=g.map(a=>a[1]?{src:a[1].trim()+(a[2]?" "+a[2].trim():"")}:{}),t.bg_set.every(a=>a.src==="")&&(t.bg_set=g.map(a=>a[1]?{src:a[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(s=>s.src===i.src)}getResults(){return this.performanceImages}},d=u,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll("[data-rocket-location-hash]");return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return Math.max(0,i.top+t)}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[])||s==="No hash detected")return;const n=i.parentElement&&this._getElementDistance(i.parentElement)this.config.lrc_threshold,o=n?"green":r===0?"red":"";this.logger.logColoredMessage(`${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Location hash: ${s}`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,o),n&&(this.lazyRenderElements.push(s),this.logger.logMessage(`Element pushed with hash: ${s}`))})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}logColoredMessage(e,i="green"){this.enabled&&console.log(`%c${e}`,`color: ${i};`)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); +(()=>{var h=class{static getScreenWidth(){return window.innerWidth||document.documentElement.clientWidth}static getScreenHeight(){return window.innerHeight||document.documentElement.clientHeight}static isNotValidScreensize(e,i){const t=this.getScreenWidth(),r=this.getScreenHeight(),s=e&&(t>i.width||r>i.height),n=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=h,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(s=>{if(s.nodeName.toLowerCase()==="img"&&s.parentElement.nodeName.toLowerCase()==="picture")return null;let n;if(s.nodeName.toLowerCase()==="picture"){const o=s.querySelector("img");if(o)n=o.getBoundingClientRect();else return null}else n=s.getBoundingClientRect();return{element:s,rect:n}}).filter(s=>s!==null).filter(s=>s.rect.width>0&&s.rect.height>0&&c.isIntersecting(s.rect)).map(s=>({item:s,area:this._getElementArea(s.rect),elementInfo:this._getElementInfo(s.element)})).sort((s,n)=>n.area-s.area).slice(0,e).map(s=>({element:s.item.element,elementInfo:s.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const s=e.querySelector("source");t.src=e.poster||(s?s.src:""),t.current_src=t.src}else if(i==="svg"){const s=e.querySelector("image");s&&(t.type="img",t.src=s.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const s=e.querySelector("img");t.src=s?s.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(n=>({srcset:n.srcset||"",media:n.media||"",type:n.type||"",sizes:n.sizes||""}))}else{const n=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(a=>a!=="none");if(n.length===0)return null;const o=n[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const g=[...o.matchAll(r)];t.bg_set=g.map(a=>a[1]?{src:a[1].trim()+(a[2]?" "+a[2].trim():"")}:{}),t.bg_set.every(a=>a.src==="")&&(t.bg_set=g.map(a=>a[1]?{src:a[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(s=>s.src===i.src)}getResults(){return this.performanceImages}},d=u,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll("[data-rocket-location-hash]");return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return Math.max(0,i.top+t-c.getScreenHeight())}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[])||s==="No hash detected")return;const n=i.parentElement&&this._getElementDistance(i.parentElement)this.config.lrc_threshold,o=n?"green":r===0?"red":"";this.logger.logColoredMessage(`${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Location hash: ${s}`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,o),n&&(this.lazyRenderElements.push(s),this.logger.logMessage(`Element pushed with hash: ${s}`))})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}logColoredMessage(e,i="green"){this.enabled&&console.log(`%c${e}`,`color: ${i};`)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 2c6e4c273c..6d8164d525 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = window.innerWidth || document.documentElement.clientWidth;\n const screenHeight = window.innerHeight || document.documentElement.clientHeight;\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(\"[data-rocket-location-hash]\");\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return Math.max(0, rect.top + scrollTop);\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" === hash) {\n return;\n }\n const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance > this.config.lrc_threshold;\n const color = can_push_hash ? \"green\" : distance === 0 ? \"red\" : \"\";\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Location hash: ${hash}`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color);\n if (can_push_hash) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Element pushed with hash: ${hash}`);\n }\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n logColoredMessage(msg, color = \"green\") {\n if (!this.enabled) {\n return;\n }\n console.log(`%c${msg}`, `color: ${color};`);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], - "mappings": "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", + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static getScreenWidth() {\n return window.innerWidth || document.documentElement.clientWidth;\n }\n static getScreenHeight() {\n return window.innerHeight || document.documentElement.clientHeight;\n }\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = this.getScreenWidth();\n const screenHeight = this.getScreenHeight();\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(\"[data-rocket-location-hash]\");\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return Math.max(0, rect.top + scrollTop - Utils_default.getScreenHeight());\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" === hash) {\n return;\n }\n const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance > this.config.lrc_threshold;\n const color = can_push_hash ? \"green\" : distance === 0 ? \"red\" : \"\";\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Location hash: ${hash}`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color);\n if (can_push_hash) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Element pushed with hash: ${hash}`);\n }\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n logColoredMessage(msg, color = \"green\") {\n if (!this.enabled) {\n return;\n }\n console.log(`%c${msg}`, `color: ${color};`);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], + "mappings": "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", "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "can_push_hash", "color", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] } From db1fecaeb078feba651a06cf00a2b6f273d29c6d Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Wed, 4 Sep 2024 12:02:47 +0300 Subject: [PATCH 121/192] adjust the log message --- assets/js/wpr-beacon.js | 4 ++-- assets/js/wpr-beacon.min.js | 2 +- assets/js/wpr-beacon.min.js.map | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/assets/js/wpr-beacon.js b/assets/js/wpr-beacon.js index b5e4601664..b796a202c5 100644 --- a/assets/js/wpr-beacon.js +++ b/assets/js/wpr-beacon.js @@ -265,9 +265,9 @@ if ("No hash detected" === hash) { return; } - const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance > this.config.lrc_threshold; + const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance >= this.config.lrc_threshold; const color = can_push_hash ? "green" : distance === 0 ? "red" : ""; - this.logger.logColoredMessage(`${" ".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color); + this.logger.logColoredMessage(`${" ".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport bottom: ${distance}px)`, color); this.logger.logColoredMessage(`${" ".repeat(depth)}Location hash: ${hash}`, color); this.logger.logColoredMessage(`${" ".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color); if (can_push_hash) { diff --git a/assets/js/wpr-beacon.min.js b/assets/js/wpr-beacon.min.js index 5982d56a28..612ca3f892 100644 --- a/assets/js/wpr-beacon.min.js +++ b/assets/js/wpr-beacon.min.js @@ -1,2 +1,2 @@ -(()=>{var h=class{static getScreenWidth(){return window.innerWidth||document.documentElement.clientWidth}static getScreenHeight(){return window.innerHeight||document.documentElement.clientHeight}static isNotValidScreensize(e,i){const t=this.getScreenWidth(),r=this.getScreenHeight(),s=e&&(t>i.width||r>i.height),n=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=h,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(s=>{if(s.nodeName.toLowerCase()==="img"&&s.parentElement.nodeName.toLowerCase()==="picture")return null;let n;if(s.nodeName.toLowerCase()==="picture"){const o=s.querySelector("img");if(o)n=o.getBoundingClientRect();else return null}else n=s.getBoundingClientRect();return{element:s,rect:n}}).filter(s=>s!==null).filter(s=>s.rect.width>0&&s.rect.height>0&&c.isIntersecting(s.rect)).map(s=>({item:s,area:this._getElementArea(s.rect),elementInfo:this._getElementInfo(s.element)})).sort((s,n)=>n.area-s.area).slice(0,e).map(s=>({element:s.item.element,elementInfo:s.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const s=e.querySelector("source");t.src=e.poster||(s?s.src:""),t.current_src=t.src}else if(i==="svg"){const s=e.querySelector("image");s&&(t.type="img",t.src=s.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const s=e.querySelector("img");t.src=s?s.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(n=>({srcset:n.srcset||"",media:n.media||"",type:n.type||"",sizes:n.sizes||""}))}else{const n=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(a=>a!=="none");if(n.length===0)return null;const o=n[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const g=[...o.matchAll(r)];t.bg_set=g.map(a=>a[1]?{src:a[1].trim()+(a[2]?" "+a[2].trim():"")}:{}),t.bg_set.every(a=>a.src==="")&&(t.bg_set=g.map(a=>a[1]?{src:a[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(s=>s.src===i.src)}getResults(){return this.performanceImages}},d=u,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll("[data-rocket-location-hash]");return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return Math.max(0,i.top+t-c.getScreenHeight())}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[])||s==="No hash detected")return;const n=i.parentElement&&this._getElementDistance(i.parentElement)this.config.lrc_threshold,o=n?"green":r===0?"red":"";this.logger.logColoredMessage(`${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport top: ${r}px)`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Location hash: ${s}`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,o),n&&(this.lazyRenderElements.push(s),this.logger.logMessage(`Element pushed with hash: ${s}`))})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}logColoredMessage(e,i="green"){this.enabled&&console.log(`%c${e}`,`color: ${i};`)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); +(()=>{var h=class{static getScreenWidth(){return window.innerWidth||document.documentElement.clientWidth}static getScreenHeight(){return window.innerHeight||document.documentElement.clientHeight}static isNotValidScreensize(e,i){const t=this.getScreenWidth(),r=this.getScreenHeight(),s=e&&(t>i.width||r>i.height),n=!e&&(t=0&&e.right>=0&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}},c=h,u=class{constructor(e,i){this.config=e,this.performanceImages=[],this.logger=i}async run(){try{const e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_generateLcpCandidates(e){const i=document.querySelectorAll(this.config.elements);return i.length<=0?[]:Array.from(i).map(s=>{if(s.nodeName.toLowerCase()==="img"&&s.parentElement.nodeName.toLowerCase()==="picture")return null;let n;if(s.nodeName.toLowerCase()==="picture"){const o=s.querySelector("img");if(o)n=o.getBoundingClientRect();else return null}else n=s.getBoundingClientRect();return{element:s,rect:n}}).filter(s=>s!==null).filter(s=>s.rect.width>0&&s.rect.height>0&&c.isIntersecting(s.rect)).map(s=>({item:s,area:this._getElementArea(s.rect),elementInfo:this._getElementInfo(s.element)})).sort((s,n)=>n.area-s.area).slice(0,e).map(s=>({element:s.item.element,elementInfo:s.elementInfo}))}_getElementArea(e){const i=Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left),t=Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top);return i*t}_getElementInfo(e){const i=e.nodeName.toLowerCase(),t={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""},r=/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/ig;if(i==="img"&&e.srcset)t.type="img-srcset",t.src=e.src,t.srcset=e.srcset,t.sizes=e.sizes,t.current_src=e.currentSrc;else if(i==="img")t.type="img",t.src=e.src,t.current_src=e.currentSrc;else if(i==="video"){t.type="img";const s=e.querySelector("source");t.src=e.poster||(s?s.src:""),t.current_src=t.src}else if(i==="svg"){const s=e.querySelector("image");s&&(t.type="img",t.src=s.getAttribute("href")||"",t.current_src=t.src)}else if(i==="picture"){t.type="picture";const s=e.querySelector("img");t.src=s?s.src:"",t.sources=Array.from(e.querySelectorAll("source")).map(n=>({srcset:n.srcset||"",media:n.media||"",type:n.type||"",sizes:n.sizes||""}))}else{const n=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(a=>a!=="none");if(n.length===0)return null;const o=n[0];if(t.type="bg-img",o.includes("image-set(")&&(t.type="bg-img-set"),!o||o===""||o.includes("data:image"))return null;const g=[...o.matchAll(r)];t.bg_set=g.map(a=>a[1]?{src:a[1].trim()+(a[2]?" "+a[2].trim():"")}:{}),t.bg_set.every(a=>a.src==="")&&(t.bg_set=g.map(a=>a[1]?{src:a[1].trim()}:{})),t.bg_set.length>0&&(t.src=t.bg_set[0].src,t.type==="bg-img-set"&&(t.src=t.bg_set))}return t}_initWithFirstElementWithInfo(e){const i=e.find(t=>t.elementInfo!==null);if(!i){this.logger.logMessage("No LCP candidate found."),this.performanceImages=[];return}this.performanceImages=[{...i.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(({element:i,elementInfo:t})=>{this._isDuplicateImage(i)||!t||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const i=this._getElementInfo(e);if(i===null)return!1;const t=i.type==="img"||i.type==="img-srcset"||i.type==="video",r=i.type==="bg-img"||i.type==="bg-img-set"||i.type==="picture";return(t||r)&&this.performanceImages.some(s=>s.src===i.src)}getResults(){return this.performanceImages}},d=u,p=class{constructor(e,i){this.config=e,this.logger=i,this.lazyRenderElements=[]}async run(){try{const e=this._getLazyRenderElements();e&&this._processElements(e)}catch(e){this.errorCode="script_error",this.logger.logMessage("Script Error: "+e)}}_getLazyRenderElements(){const e=document.querySelectorAll("[data-rocket-location-hash]");return e.length<=0?[]:Array.from(e).filter(t=>!this._skipElement(t)).map(t=>({element:t,depth:this._getElementDepth(t),distance:this._getElementDistance(t),hash:this._getLocationHash(t)}))}_getElementDepth(e){let i=0,t=e.parentElement;for(;t;)i++,t=t.parentElement;return i}_getElementDistance(e){const i=e.getBoundingClientRect(),t=window.pageYOffset||document.documentElement.scrollTop;return Math.max(0,i.top+t-c.getScreenHeight())}_skipElement(e){const i=this.config.skipStrings||["memex"];return!e||!e.id?!1:i.some(t=>e.id.toLowerCase().includes(t))}_shouldSkipElement(e,i){if(!e)return!1;for(let t=0;t{if(this._shouldSkipElement(i,this.config.exclusions||[])||s==="No hash detected")return;const n=i.parentElement&&this._getElementDistance(i.parentElement)=this.config.lrc_threshold,o=n?"green":r===0?"red":"";this.logger.logColoredMessage(`${" ".repeat(t)}${i.tagName} (Depth: ${t}, Distance from viewport bottom: ${r}px)`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Location hash: ${s}`,o),this.logger.logColoredMessage(`${" ".repeat(t)}Dimensions Client Height: ${i.clientHeight}`,o),n&&(this.lazyRenderElements.push(s),this.logger.logMessage(`Element pushed with hash: ${s}`))})}_getXPath(e){return e.id!==""?`//*[@id="${e.id}"]`:this._getElementXPath(e)}_getElementXPath(e){if(e===document.body)return"/html/body";const i=this._getElementPosition(e);return`${this._getElementXPath(e.parentNode)}/${e.nodeName.toLowerCase()}[${i}]`}_getElementPosition(e){let i=1,t=e.previousElementSibling;for(;t;)t.nodeName===e.nodeName&&i++,t=t.previousElementSibling;return i}_getLocationHash(e){return e.hasAttribute("data-rocket-location-hash")?e.getAttribute("data-rocket-location-hash"):"No hash detected"}getResults(){return this.lazyRenderElements}},m=p,f=class{constructor(e){this.enabled=e}logMessage(e){this.enabled&&console.log(e)}logColoredMessage(e,i="green"){this.enabled&&console.log(`%c${e}`,`color: ${i};`)}},_=f,b=class{constructor(e){this.config=e,this.lcpBeacon=null,this.lrcBeacon=null,this.infiniteLoopId=null,this.errorCode="",this.logger=new _(this.config.debug)}async init(){if(this.scriptTimer=new Date,!await this._isValidPreconditions()){this._finalize();return}this.infiniteLoopId=setTimeout(()=>{this._handleInfiniteLoop()},1e4);const e=await this._getGeneratedBefore(),i=this.config.status.atf&&(e===!1||e.lcp===!1),t=this.config.status.lrc&&(e===!1||e.lrc===!1);i?(this.lcpBeacon=new d(this.config,this.logger),await this.lcpBeacon.run()):this.logger.logMessage("Not running BeaconLcp because data is already available or feature is disabled"),t?(this.lrcBeacon=new m(this.config,this.logger),await this.lrcBeacon.run()):this.logger.logMessage("Not running BeaconLrc because data is already available or feature is disabled"),i||t?this._saveFinalResultIntoDB():(this.logger.logMessage("Not saving results into DB as no beacon features ran."),this._finalize())}async _isValidPreconditions(){const e={width:this.config.width_threshold,height:this.config.height_threshold};return c.isNotValidScreensize(this.config.is_mobile,e)?(this.logger.logMessage("Bailing out because screen size is not acceptable"),!1):!0}async _getGeneratedBefore(){if(!c.isPageCached())return!1;let e=new FormData;return e.append("action","rocket_check_beacon"),e.append("rocket_beacon_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(t=>t.json())).data}_saveFinalResultIntoDB(){const e={lcp:this.lcpBeacon?this.lcpBeacon.getResults():null,lrc:this.lrcBeacon?this.lrcBeacon.getResults():null},i=new FormData;i.append("action","rocket_beacon"),i.append("rocket_beacon_nonce",this.config.nonce),i.append("url",this.config.url),i.append("is_mobile",this.config.is_mobile),i.append("status",this._getFinalStatus()),i.append("results",JSON.stringify(e)),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:i,headers:{"wpr-saas-no-intercept":!0}}).then(t=>t.json()).then(t=>{this.logger.logMessage(t.data.lcp)}).catch(t=>{this.logger.logMessage(t)}).finally(()=>{this._finalize()})}_getFinalStatus(){return this.errorCode!==""?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-wpr-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}},l=b;(e=>{if(!e)return;const i=new l(e);if(document.readyState!=="loading"){setTimeout(()=>{i.init()},e.delay);return}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{i.init()},e.delay)})})(window.rocket_beacon_data);var y=l})(); //# sourceMappingURL=wpr-beacon.min.js.map diff --git a/assets/js/wpr-beacon.min.js.map b/assets/js/wpr-beacon.min.js.map index 6d8164d525..b70f717aa2 100644 --- a/assets/js/wpr-beacon.min.js.map +++ b/assets/js/wpr-beacon.min.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["wpr-beacon.js"], - "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static getScreenWidth() {\n return window.innerWidth || document.documentElement.clientWidth;\n }\n static getScreenHeight() {\n return window.innerHeight || document.documentElement.clientHeight;\n }\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = this.getScreenWidth();\n const screenHeight = this.getScreenHeight();\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(\"[data-rocket-location-hash]\");\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return Math.max(0, rect.top + scrollTop - Utils_default.getScreenHeight());\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" === hash) {\n return;\n }\n const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance > this.config.lrc_threshold;\n const color = can_push_hash ? \"green\" : distance === 0 ? \"red\" : \"\";\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport top: ${distance}px)`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Location hash: ${hash}`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color);\n if (can_push_hash) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Element pushed with hash: ${hash}`);\n }\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n logColoredMessage(msg, color = \"green\") {\n if (!this.enabled) {\n return;\n }\n console.log(`%c${msg}`, `color: ${color};`);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], - "mappings": "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", + "sourcesContent": ["(() => {\n // src/Utils.js\n var BeaconUtils = class {\n static getScreenWidth() {\n return window.innerWidth || document.documentElement.clientWidth;\n }\n static getScreenHeight() {\n return window.innerHeight || document.documentElement.clientHeight;\n }\n static isNotValidScreensize(is_mobile, threshold) {\n const screenWidth = this.getScreenWidth();\n const screenHeight = this.getScreenHeight();\n const isNotValidForMobile = is_mobile && (screenWidth > threshold.width || screenHeight > threshold.height);\n const isNotValidForDesktop = !is_mobile && (screenWidth < threshold.width || screenHeight < threshold.height);\n return isNotValidForMobile || isNotValidForDesktop;\n }\n static isPageCached() {\n const signature = document.documentElement.nextSibling && document.documentElement.nextSibling.data ? document.documentElement.nextSibling.data : \"\";\n return signature && signature.includes(\"Debug: cached\");\n }\n static isIntersecting(rect) {\n return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth);\n }\n };\n var Utils_default = BeaconUtils;\n\n // src/BeaconLcp.js\n var BeaconLcp = class {\n constructor(config, logger) {\n this.config = config;\n this.performanceImages = [];\n this.logger = logger;\n }\n async run() {\n try {\n const above_the_fold_images = this._generateLcpCandidates(Infinity);\n if (above_the_fold_images) {\n this._initWithFirstElementWithInfo(above_the_fold_images);\n this._fillATFWithoutDuplications(above_the_fold_images);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _generateLcpCandidates(count) {\n const lcpElements = document.querySelectorAll(this.config.elements);\n if (lcpElements.length <= 0) {\n return [];\n }\n const potentialCandidates = Array.from(lcpElements);\n const topCandidates = potentialCandidates.map((element) => {\n if (\"img\" === element.nodeName.toLowerCase() && \"picture\" === element.parentElement.nodeName.toLowerCase()) {\n return null;\n }\n let rect;\n if (\"picture\" === element.nodeName.toLowerCase()) {\n const imgElement = element.querySelector(\"img\");\n if (imgElement) {\n rect = imgElement.getBoundingClientRect();\n } else {\n return null;\n }\n } else {\n rect = element.getBoundingClientRect();\n }\n return {\n element,\n rect\n };\n }).filter((item) => item !== null).filter((item) => {\n return item.rect.width > 0 && item.rect.height > 0 && Utils_default.isIntersecting(item.rect);\n }).map((item) => ({\n item,\n area: this._getElementArea(item.rect),\n elementInfo: this._getElementInfo(item.element)\n })).sort((a, b) => b.area - a.area).slice(0, count);\n return topCandidates.map((candidate) => ({\n element: candidate.item.element,\n elementInfo: candidate.elementInfo\n }));\n }\n _getElementArea(rect) {\n const visibleWidth = Math.min(rect.width, (window.innerWidth || document.documentElement.clientWidth) - rect.left);\n const visibleHeight = Math.min(rect.height, (window.innerHeight || document.documentElement.clientHeight) - rect.top);\n return visibleWidth * visibleHeight;\n }\n _getElementInfo(element) {\n const nodeName = element.nodeName.toLowerCase();\n const element_info = {\n type: \"\",\n src: \"\",\n srcset: \"\",\n sizes: \"\",\n sources: [],\n bg_set: [],\n current_src: \"\"\n };\n const css_bg_url_rgx = /url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/ig;\n if (nodeName === \"img\" && element.srcset) {\n element_info.type = \"img-srcset\";\n element_info.src = element.src;\n element_info.srcset = element.srcset;\n element_info.sizes = element.sizes;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"img\") {\n element_info.type = \"img\";\n element_info.src = element.src;\n element_info.current_src = element.currentSrc;\n } else if (nodeName === \"video\") {\n element_info.type = \"img\";\n const source = element.querySelector(\"source\");\n element_info.src = element.poster || (source ? source.src : \"\");\n element_info.current_src = element_info.src;\n } else if (nodeName === \"svg\") {\n const imageElement = element.querySelector(\"image\");\n if (imageElement) {\n element_info.type = \"img\";\n element_info.src = imageElement.getAttribute(\"href\") || \"\";\n element_info.current_src = element_info.src;\n }\n } else if (nodeName === \"picture\") {\n element_info.type = \"picture\";\n const img = element.querySelector(\"img\");\n element_info.src = img ? img.src : \"\";\n element_info.sources = Array.from(element.querySelectorAll(\"source\")).map((source) => ({\n srcset: source.srcset || \"\",\n media: source.media || \"\",\n type: source.type || \"\",\n sizes: source.sizes || \"\"\n }));\n } else {\n const computed_style = window.getComputedStyle(element, null);\n const bg_props = [\n computed_style.getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":after\").getPropertyValue(\"background-image\"),\n getComputedStyle(element, \":before\").getPropertyValue(\"background-image\")\n ].filter((prop) => prop !== \"none\");\n if (bg_props.length === 0) {\n return null;\n }\n const full_bg_prop = bg_props[0];\n element_info.type = \"bg-img\";\n if (full_bg_prop.includes(\"image-set(\")) {\n element_info.type = \"bg-img-set\";\n }\n if (!full_bg_prop || full_bg_prop === \"\" || full_bg_prop.includes(\"data:image\")) {\n return null;\n }\n const matches = [...full_bg_prop.matchAll(css_bg_url_rgx)];\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() + (m[2] ? \" \" + m[2].trim() : \"\") } : {});\n if (element_info.bg_set.every((item) => item.src === \"\")) {\n element_info.bg_set = matches.map((m) => m[1] ? { src: m[1].trim() } : {});\n }\n if (element_info.bg_set.length > 0) {\n element_info.src = element_info.bg_set[0].src;\n if (element_info.type === \"bg-img-set\") {\n element_info.src = element_info.bg_set;\n }\n }\n }\n return element_info;\n }\n _initWithFirstElementWithInfo(elements) {\n const firstElementWithInfo = elements.find((item) => item.elementInfo !== null);\n if (!firstElementWithInfo) {\n this.logger.logMessage(\"No LCP candidate found.\");\n this.performanceImages = [];\n return;\n }\n this.performanceImages = [{\n ...firstElementWithInfo.elementInfo,\n label: \"lcp\"\n }];\n }\n _fillATFWithoutDuplications(elements) {\n elements.forEach(({ element, elementInfo }) => {\n if (this._isDuplicateImage(element) || !elementInfo) {\n return;\n }\n this.performanceImages.push({ ...elementInfo, label: \"above-the-fold\" });\n });\n }\n _isDuplicateImage(image) {\n const elementInfo = this._getElementInfo(image);\n if (elementInfo === null) {\n return false;\n }\n const isImageOrVideo = elementInfo.type === \"img\" || elementInfo.type === \"img-srcset\" || elementInfo.type === \"video\";\n const isBgImageOrPicture = elementInfo.type === \"bg-img\" || elementInfo.type === \"bg-img-set\" || elementInfo.type === \"picture\";\n return (isImageOrVideo || isBgImageOrPicture) && this.performanceImages.some((item) => item.src === elementInfo.src);\n }\n getResults() {\n return this.performanceImages;\n }\n };\n var BeaconLcp_default = BeaconLcp;\n\n // src/BeaconLrc.js\n var BeaconLrc = class {\n constructor(config, logger) {\n this.config = config;\n this.logger = logger;\n this.lazyRenderElements = [];\n }\n async run() {\n try {\n const elementsInView = this._getLazyRenderElements();\n if (elementsInView) {\n this._processElements(elementsInView);\n }\n } catch (err) {\n this.errorCode = \"script_error\";\n this.logger.logMessage(\"Script Error: \" + err);\n }\n }\n _getLazyRenderElements() {\n const elements = document.querySelectorAll(\"[data-rocket-location-hash]\");\n if (elements.length <= 0) {\n return [];\n }\n const validElements = Array.from(elements).filter((element) => !this._skipElement(element));\n return validElements.map((element) => ({\n element,\n depth: this._getElementDepth(element),\n distance: this._getElementDistance(element),\n hash: this._getLocationHash(element)\n }));\n }\n _getElementDepth(element) {\n let depth = 0;\n let parent = element.parentElement;\n while (parent) {\n depth++;\n parent = parent.parentElement;\n }\n return depth;\n }\n _getElementDistance(element) {\n const rect = element.getBoundingClientRect();\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return Math.max(0, rect.top + scrollTop - Utils_default.getScreenHeight());\n }\n _skipElement(element) {\n const skipStrings = this.config.skipStrings || [\"memex\"];\n if (!element || !element.id) return false;\n return skipStrings.some((str) => element.id.toLowerCase().includes(str));\n }\n _shouldSkipElement(element, exclusions) {\n if (!element) return false;\n for (let i = 0; i < exclusions.length; i++) {\n const [attribute, pattern] = exclusions[i];\n const attributeValue = element.getAttribute(attribute);\n if (attributeValue && new RegExp(pattern, \"i\").test(attributeValue)) {\n return true;\n }\n }\n return false;\n }\n _processElements(elements) {\n elements.forEach(({ element, depth, distance, hash }) => {\n if (this._shouldSkipElement(element, this.config.exclusions || [])) {\n return;\n }\n if (\"No hash detected\" === hash) {\n return;\n }\n const can_push_hash = element.parentElement && this._getElementDistance(element.parentElement) < this.config.lrc_threshold && distance >= this.config.lrc_threshold;\n const color = can_push_hash ? \"green\" : distance === 0 ? \"red\" : \"\";\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}${element.tagName} (Depth: ${depth}, Distance from viewport bottom: ${distance}px)`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Location hash: ${hash}`, color);\n this.logger.logColoredMessage(`${\"\t\".repeat(depth)}Dimensions Client Height: ${element.clientHeight}`, color);\n if (can_push_hash) {\n this.lazyRenderElements.push(hash);\n this.logger.logMessage(`Element pushed with hash: ${hash}`);\n }\n });\n }\n _getXPath(element) {\n if (element.id !== \"\") {\n return `//*[@id=\"${element.id}\"]`;\n }\n return this._getElementXPath(element);\n }\n _getElementXPath(element) {\n if (element === document.body) {\n return \"/html/body\";\n }\n const position = this._getElementPosition(element);\n return `${this._getElementXPath(element.parentNode)}/${element.nodeName.toLowerCase()}[${position}]`;\n }\n _getElementPosition(element) {\n let pos = 1;\n let sibling = element.previousElementSibling;\n while (sibling) {\n if (sibling.nodeName === element.nodeName) {\n pos++;\n }\n sibling = sibling.previousElementSibling;\n }\n return pos;\n }\n _getLocationHash(element) {\n return element.hasAttribute(\"data-rocket-location-hash\") ? element.getAttribute(\"data-rocket-location-hash\") : \"No hash detected\";\n }\n getResults() {\n return this.lazyRenderElements;\n }\n };\n var BeaconLrc_default = BeaconLrc;\n\n // src/Logger.js\n var Logger = class {\n constructor(enabled) {\n this.enabled = enabled;\n }\n logMessage(msg) {\n if (!this.enabled) {\n return;\n }\n console.log(msg);\n }\n logColoredMessage(msg, color = \"green\") {\n if (!this.enabled) {\n return;\n }\n console.log(`%c${msg}`, `color: ${color};`);\n }\n };\n var Logger_default = Logger;\n\n // src/BeaconManager.js\n var BeaconManager = class {\n constructor(config) {\n this.config = config;\n this.lcpBeacon = null;\n this.lrcBeacon = null;\n this.infiniteLoopId = null;\n this.errorCode = \"\";\n this.logger = new Logger_default(this.config.debug);\n }\n async init() {\n this.scriptTimer = /* @__PURE__ */ new Date();\n if (!await this._isValidPreconditions()) {\n this._finalize();\n return;\n }\n this.infiniteLoopId = setTimeout(() => {\n this._handleInfiniteLoop();\n }, 1e4);\n const isGeneratedBefore = await this._getGeneratedBefore();\n const shouldGenerateLcp = this.config.status.atf && (isGeneratedBefore === false || isGeneratedBefore.lcp === false);\n const shouldGeneratelrc = this.config.status.lrc && (isGeneratedBefore === false || isGeneratedBefore.lrc === false);\n if (shouldGenerateLcp) {\n this.lcpBeacon = new BeaconLcp_default(this.config, this.logger);\n await this.lcpBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLcp because data is already available or feature is disabled\");\n }\n if (shouldGeneratelrc) {\n this.lrcBeacon = new BeaconLrc_default(this.config, this.logger);\n await this.lrcBeacon.run();\n } else {\n this.logger.logMessage(\"Not running BeaconLrc because data is already available or feature is disabled\");\n }\n if (shouldGenerateLcp || shouldGeneratelrc) {\n this._saveFinalResultIntoDB();\n } else {\n this.logger.logMessage(\"Not saving results into DB as no beacon features ran.\");\n this._finalize();\n }\n }\n async _isValidPreconditions() {\n const threshold = {\n width: this.config.width_threshold,\n height: this.config.height_threshold\n };\n if (Utils_default.isNotValidScreensize(this.config.is_mobile, threshold)) {\n this.logger.logMessage(\"Bailing out because screen size is not acceptable\");\n return false;\n }\n return true;\n }\n async _getGeneratedBefore() {\n if (!Utils_default.isPageCached()) {\n return false;\n }\n let data_check = new FormData();\n data_check.append(\"action\", \"rocket_check_beacon\");\n data_check.append(\"rocket_beacon_nonce\", this.config.nonce);\n data_check.append(\"url\", this.config.url);\n data_check.append(\"is_mobile\", this.config.is_mobile);\n const beacon_data_response = await fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data_check\n }).then((data) => data.json());\n return beacon_data_response.data;\n }\n _saveFinalResultIntoDB() {\n const results = {\n lcp: this.lcpBeacon ? this.lcpBeacon.getResults() : null,\n lrc: this.lrcBeacon ? this.lrcBeacon.getResults() : null\n };\n const data = new FormData();\n data.append(\"action\", \"rocket_beacon\");\n data.append(\"rocket_beacon_nonce\", this.config.nonce);\n data.append(\"url\", this.config.url);\n data.append(\"is_mobile\", this.config.is_mobile);\n data.append(\"status\", this._getFinalStatus());\n data.append(\"results\", JSON.stringify(results));\n fetch(this.config.ajax_url, {\n method: \"POST\",\n credentials: \"same-origin\",\n body: data,\n headers: {\n \"wpr-saas-no-intercept\": true\n }\n }).then((response) => response.json()).then((data2) => {\n this.logger.logMessage(data2.data.lcp);\n }).catch((error) => {\n this.logger.logMessage(error);\n }).finally(() => {\n this._finalize();\n });\n }\n _getFinalStatus() {\n if (\"\" !== this.errorCode) {\n return this.errorCode;\n }\n const scriptTime = (/* @__PURE__ */ new Date() - this.scriptTimer) / 1e3;\n if (10 <= scriptTime) {\n return \"timeout\";\n }\n return \"success\";\n }\n _handleInfiniteLoop() {\n this._saveFinalResultIntoDB();\n }\n _finalize() {\n const beaconscript = document.querySelector('[data-name=\"wpr-wpr-beacon\"]');\n beaconscript.setAttribute(\"beacon-completed\", \"true\");\n clearTimeout(this.infiniteLoopId);\n }\n };\n var BeaconManager_default = BeaconManager;\n\n // src/BeaconEntryPoint.js\n ((rocket_beacon_data) => {\n if (!rocket_beacon_data) {\n return;\n }\n const instance = new BeaconManager_default(rocket_beacon_data);\n if (document.readyState !== \"loading\") {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n return;\n }\n document.addEventListener(\"DOMContentLoaded\", () => {\n setTimeout(() => {\n instance.init();\n }, rocket_beacon_data.delay);\n });\n })(window.rocket_beacon_data);\n var BeaconEntryPoint_default = BeaconManager_default;\n})();\n"], + "mappings": "CAAC,IAAM,CAEL,IAAIA,EAAc,KAAM,CACtB,OAAO,gBAAiB,CACtB,OAAO,OAAO,YAAc,SAAS,gBAAgB,WACvD,CACA,OAAO,iBAAkB,CACvB,OAAO,OAAO,aAAe,SAAS,gBAAgB,YACxD,CACA,OAAO,qBAAqBC,EAAWC,EAAW,CAChD,MAAMC,EAAc,KAAK,eAAe,EAClCC,EAAe,KAAK,gBAAgB,EACpCC,EAAsBJ,IAAcE,EAAcD,EAAU,OAASE,EAAeF,EAAU,QAC9FI,EAAuB,CAACL,IAAcE,EAAcD,EAAU,OAASE,EAAeF,EAAU,QACtG,OAAOG,GAAuBC,CAChC,CACA,OAAO,cAAe,CACpB,MAAMC,EAAY,SAAS,gBAAgB,aAAe,SAAS,gBAAgB,YAAY,KAAO,SAAS,gBAAgB,YAAY,KAAO,GAClJ,OAAOA,GAAaA,EAAU,SAAS,eAAe,CACxD,CACA,OAAO,eAAeC,EAAM,CAC1B,OAAOA,EAAK,QAAU,GAAKA,EAAK,OAAS,GAAKA,EAAK,MAAQ,OAAO,aAAe,SAAS,gBAAgB,eAAiBA,EAAK,OAAS,OAAO,YAAc,SAAS,gBAAgB,YACzL,CACF,EACIC,EAAgBT,EAGhBU,EAAY,KAAM,CACpB,YAAYC,EAAQC,EAAQ,CAC1B,KAAK,OAASD,EACd,KAAK,kBAAoB,CAAC,EAC1B,KAAK,OAASC,CAChB,CACA,MAAM,KAAM,CACV,GAAI,CACF,MAAMC,EAAwB,KAAK,uBAAuB,GAAQ,EAC9DA,IACF,KAAK,8BAA8BA,CAAqB,EACxD,KAAK,4BAA4BA,CAAqB,EAE1D,OAASC,EAAK,CACZ,KAAK,UAAY,eACjB,KAAK,OAAO,WAAW,iBAAmBA,CAAG,CAC/C,CACF,CACA,uBAAuBC,EAAO,CAC5B,MAAMC,EAAc,SAAS,iBAAiB,KAAK,OAAO,QAAQ,EAClE,OAAIA,EAAY,QAAU,EACjB,CAAC,EAEkB,MAAM,KAAKA,CAAW,EACR,IAAKC,GAAY,CACzD,GAAcA,EAAQ,SAAS,YAAY,IAAvC,OAA0DA,EAAQ,cAAc,SAAS,YAAY,IAAzD,UAC9C,OAAO,KAET,IAAIT,EACJ,GAAkBS,EAAQ,SAAS,YAAY,IAA3C,UAA8C,CAChD,MAAMC,EAAaD,EAAQ,cAAc,KAAK,EAC9C,GAAIC,EACFV,EAAOU,EAAW,sBAAsB,MAExC,QAAO,IAEX,MACEV,EAAOS,EAAQ,sBAAsB,EAEvC,MAAO,CACL,QAAAA,EACA,KAAAT,CACF,CACF,CAAC,EAAE,OAAQW,GAASA,IAAS,IAAI,EAAE,OAAQA,GAClCA,EAAK,KAAK,MAAQ,GAAKA,EAAK,KAAK,OAAS,GAAKV,EAAc,eAAeU,EAAK,IAAI,CAC7F,EAAE,IAAKA,IAAU,CAChB,KAAAA,EACA,KAAM,KAAK,gBAAgBA,EAAK,IAAI,EACpC,YAAa,KAAK,gBAAgBA,EAAK,OAAO,CAChD,EAAE,EAAE,KAAK,CAACC,EAAGC,IAAMA,EAAE,KAAOD,EAAE,IAAI,EAAE,MAAM,EAAGL,CAAK,EAC7B,IAAKO,IAAe,CACvC,QAASA,EAAU,KAAK,QACxB,YAAaA,EAAU,WACzB,EAAE,CACJ,CACA,gBAAgBd,EAAM,CACpB,MAAMe,EAAe,KAAK,IAAIf,EAAK,OAAQ,OAAO,YAAc,SAAS,gBAAgB,aAAeA,EAAK,IAAI,EAC3GgB,EAAgB,KAAK,IAAIhB,EAAK,QAAS,OAAO,aAAe,SAAS,gBAAgB,cAAgBA,EAAK,GAAG,EACpH,OAAOe,EAAeC,CACxB,CACA,gBAAgBP,EAAS,CACvB,MAAMQ,EAAWR,EAAQ,SAAS,YAAY,EACxCS,EAAe,CACnB,KAAM,GACN,IAAK,GACL,OAAQ,GACR,MAAO,GACP,QAAS,CAAC,EACV,OAAQ,CAAC,EACT,YAAa,EACf,EACMC,EAAiB,2CACvB,GAAIF,IAAa,OAASR,EAAQ,OAChCS,EAAa,KAAO,aACpBA,EAAa,IAAMT,EAAQ,IAC3BS,EAAa,OAAST,EAAQ,OAC9BS,EAAa,MAAQT,EAAQ,MAC7BS,EAAa,YAAcT,EAAQ,mBAC1BQ,IAAa,MACtBC,EAAa,KAAO,MACpBA,EAAa,IAAMT,EAAQ,IAC3BS,EAAa,YAAcT,EAAQ,mBAC1BQ,IAAa,QAAS,CAC/BC,EAAa,KAAO,MACpB,MAAME,EAASX,EAAQ,cAAc,QAAQ,EAC7CS,EAAa,IAAMT,EAAQ,SAAWW,EAASA,EAAO,IAAM,IAC5DF,EAAa,YAAcA,EAAa,GAC1C,SAAWD,IAAa,MAAO,CAC7B,MAAMI,EAAeZ,EAAQ,cAAc,OAAO,EAC9CY,IACFH,EAAa,KAAO,MACpBA,EAAa,IAAMG,EAAa,aAAa,MAAM,GAAK,GACxDH,EAAa,YAAcA,EAAa,IAE5C,SAAWD,IAAa,UAAW,CACjCC,EAAa,KAAO,UACpB,MAAMI,EAAMb,EAAQ,cAAc,KAAK,EACvCS,EAAa,IAAMI,EAAMA,EAAI,IAAM,GACnCJ,EAAa,QAAU,MAAM,KAAKT,EAAQ,iBAAiB,QAAQ,CAAC,EAAE,IAAKW,IAAY,CACrF,OAAQA,EAAO,QAAU,GACzB,MAAOA,EAAO,OAAS,GACvB,KAAMA,EAAO,MAAQ,GACrB,MAAOA,EAAO,OAAS,EACzB,EAAE,CACJ,KAAO,CAEL,MAAMG,EAAW,CADM,OAAO,iBAAiBd,EAAS,IAAI,EAE3C,iBAAiB,kBAAkB,EAClD,iBAAiBA,EAAS,QAAQ,EAAE,iBAAiB,kBAAkB,EACvE,iBAAiBA,EAAS,SAAS,EAAE,iBAAiB,kBAAkB,CAC1E,EAAE,OAAQe,GAASA,IAAS,MAAM,EAClC,GAAID,EAAS,SAAW,EACtB,OAAO,KAET,MAAME,EAAeF,EAAS,CAAC,EAK/B,GAJAL,EAAa,KAAO,SAChBO,EAAa,SAAS,YAAY,IACpCP,EAAa,KAAO,cAElB,CAACO,GAAgBA,IAAiB,IAAMA,EAAa,SAAS,YAAY,EAC5E,OAAO,KAET,MAAMC,EAAU,CAAC,GAAGD,EAAa,SAASN,CAAc,CAAC,EACzDD,EAAa,OAASQ,EAAQ,IAAKC,GAAMA,EAAE,CAAC,EAAI,CAAE,IAAKA,EAAE,CAAC,EAAE,KAAK,GAAKA,EAAE,CAAC,EAAI,IAAMA,EAAE,CAAC,EAAE,KAAK,EAAI,GAAI,EAAI,CAAC,CAAC,EACvGT,EAAa,OAAO,MAAOP,GAASA,EAAK,MAAQ,EAAE,IACrDO,EAAa,OAASQ,EAAQ,IAAKC,GAAMA,EAAE,CAAC,EAAI,CAAE,IAAKA,EAAE,CAAC,EAAE,KAAK,CAAE,EAAI,CAAC,CAAC,GAEvET,EAAa,OAAO,OAAS,IAC/BA,EAAa,IAAMA,EAAa,OAAO,CAAC,EAAE,IACtCA,EAAa,OAAS,eACxBA,EAAa,IAAMA,EAAa,QAGtC,CACA,OAAOA,CACT,CACA,8BAA8BU,EAAU,CACtC,MAAMC,EAAuBD,EAAS,KAAMjB,GAASA,EAAK,cAAgB,IAAI,EAC9E,GAAI,CAACkB,EAAsB,CACzB,KAAK,OAAO,WAAW,yBAAyB,EAChD,KAAK,kBAAoB,CAAC,EAC1B,MACF,CACA,KAAK,kBAAoB,CAAC,CACxB,GAAGA,EAAqB,YACxB,MAAO,KACT,CAAC,CACH,CACA,4BAA4BD,EAAU,CACpCA,EAAS,QAAQ,CAAC,CAAE,QAAAnB,EAAS,YAAAqB,CAAY,IAAM,CACzC,KAAK,kBAAkBrB,CAAO,GAAK,CAACqB,GAGxC,KAAK,kBAAkB,KAAK,CAAE,GAAGA,EAAa,MAAO,gBAAiB,CAAC,CACzE,CAAC,CACH,CACA,kBAAkBC,EAAO,CACvB,MAAMD,EAAc,KAAK,gBAAgBC,CAAK,EAC9C,GAAID,IAAgB,KAClB,MAAO,GAET,MAAME,EAAiBF,EAAY,OAAS,OAASA,EAAY,OAAS,cAAgBA,EAAY,OAAS,QACzGG,EAAqBH,EAAY,OAAS,UAAYA,EAAY,OAAS,cAAgBA,EAAY,OAAS,UACtH,OAAQE,GAAkBC,IAAuB,KAAK,kBAAkB,KAAMtB,GAASA,EAAK,MAAQmB,EAAY,GAAG,CACrH,CACA,YAAa,CACX,OAAO,KAAK,iBACd,CACF,EACII,EAAoBhC,EAGpBiC,EAAY,KAAM,CACpB,YAAYhC,EAAQC,EAAQ,CAC1B,KAAK,OAASD,EACd,KAAK,OAASC,EACd,KAAK,mBAAqB,CAAC,CAC7B,CACA,MAAM,KAAM,CACV,GAAI,CACF,MAAMgC,EAAiB,KAAK,uBAAuB,EAC/CA,GACF,KAAK,iBAAiBA,CAAc,CAExC,OAAS9B,EAAK,CACZ,KAAK,UAAY,eACjB,KAAK,OAAO,WAAW,iBAAmBA,CAAG,CAC/C,CACF,CACA,wBAAyB,CACvB,MAAMsB,EAAW,SAAS,iBAAiB,6BAA6B,EACxE,OAAIA,EAAS,QAAU,EACd,CAAC,EAEY,MAAM,KAAKA,CAAQ,EAAE,OAAQnB,GAAY,CAAC,KAAK,aAAaA,CAAO,CAAC,EACrE,IAAKA,IAAa,CACrC,QAAAA,EACA,MAAO,KAAK,iBAAiBA,CAAO,EACpC,SAAU,KAAK,oBAAoBA,CAAO,EAC1C,KAAM,KAAK,iBAAiBA,CAAO,CACrC,EAAE,CACJ,CACA,iBAAiBA,EAAS,CACxB,IAAI4B,EAAQ,EACRC,EAAS7B,EAAQ,cACrB,KAAO6B,GACLD,IACAC,EAASA,EAAO,cAElB,OAAOD,CACT,CACA,oBAAoB5B,EAAS,CAC3B,MAAMT,EAAOS,EAAQ,sBAAsB,EACrC8B,EAAY,OAAO,aAAe,SAAS,gBAAgB,UACjE,OAAO,KAAK,IAAI,EAAGvC,EAAK,IAAMuC,EAAYtC,EAAc,gBAAgB,CAAC,CAC3E,CACA,aAAaQ,EAAS,CACpB,MAAM+B,EAAc,KAAK,OAAO,aAAe,CAAC,OAAO,EACvD,MAAI,CAAC/B,GAAW,CAACA,EAAQ,GAAW,GAC7B+B,EAAY,KAAMC,GAAQhC,EAAQ,GAAG,YAAY,EAAE,SAASgC,CAAG,CAAC,CACzE,CACA,mBAAmBhC,EAASiC,EAAY,CACtC,GAAI,CAACjC,EAAS,MAAO,GACrB,QAASkC,EAAI,EAAGA,EAAID,EAAW,OAAQC,IAAK,CAC1C,KAAM,CAACC,EAAWC,CAAO,EAAIH,EAAWC,CAAC,EACnCG,EAAiBrC,EAAQ,aAAamC,CAAS,EACrD,GAAIE,GAAkB,IAAI,OAAOD,EAAS,GAAG,EAAE,KAAKC,CAAc,EAChE,MAAO,EAEX,CACA,MAAO,EACT,CACA,iBAAiBlB,EAAU,CACzBA,EAAS,QAAQ,CAAC,CAAE,QAAAnB,EAAS,MAAA4B,EAAO,SAAAU,EAAU,KAAAC,CAAK,IAAM,CAIvD,GAHI,KAAK,mBAAmBvC,EAAS,KAAK,OAAO,YAAc,CAAC,CAAC,GAGtCuC,IAAvB,mBACF,OAEF,MAAMC,EAAgBxC,EAAQ,eAAiB,KAAK,oBAAoBA,EAAQ,aAAa,EAAI,KAAK,OAAO,eAAiBsC,GAAY,KAAK,OAAO,cAChJG,EAAQD,EAAgB,QAAUF,IAAa,EAAI,MAAQ,GACjE,KAAK,OAAO,kBAAkB,GAAG,IAAI,OAAOV,CAAK,CAAC,GAAG5B,EAAQ,OAAO,YAAY4B,CAAK,oCAAoCU,CAAQ,MAAOG,CAAK,EAC7I,KAAK,OAAO,kBAAkB,GAAG,IAAI,OAAOb,CAAK,CAAC,kBAAkBW,CAAI,GAAIE,CAAK,EACjF,KAAK,OAAO,kBAAkB,GAAG,IAAI,OAAOb,CAAK,CAAC,6BAA6B5B,EAAQ,YAAY,GAAIyC,CAAK,EACxGD,IACF,KAAK,mBAAmB,KAAKD,CAAI,EACjC,KAAK,OAAO,WAAW,6BAA6BA,CAAI,EAAE,EAE9D,CAAC,CACH,CACA,UAAUvC,EAAS,CACjB,OAAIA,EAAQ,KAAO,GACV,YAAYA,EAAQ,EAAE,KAExB,KAAK,iBAAiBA,CAAO,CACtC,CACA,iBAAiBA,EAAS,CACxB,GAAIA,IAAY,SAAS,KACvB,MAAO,aAET,MAAM0C,EAAW,KAAK,oBAAoB1C,CAAO,EACjD,MAAO,GAAG,KAAK,iBAAiBA,EAAQ,UAAU,CAAC,IAAIA,EAAQ,SAAS,YAAY,CAAC,IAAI0C,CAAQ,GACnG,CACA,oBAAoB1C,EAAS,CAC3B,IAAI2C,EAAM,EACNC,EAAU5C,EAAQ,uBACtB,KAAO4C,GACDA,EAAQ,WAAa5C,EAAQ,UAC/B2C,IAEFC,EAAUA,EAAQ,uBAEpB,OAAOD,CACT,CACA,iBAAiB3C,EAAS,CACxB,OAAOA,EAAQ,aAAa,2BAA2B,EAAIA,EAAQ,aAAa,2BAA2B,EAAI,kBACjH,CACA,YAAa,CACX,OAAO,KAAK,kBACd,CACF,EACI6C,EAAoBnB,EAGpBoB,EAAS,KAAM,CACjB,YAAYC,EAAS,CACnB,KAAK,QAAUA,CACjB,CACA,WAAWC,EAAK,CACT,KAAK,SAGV,QAAQ,IAAIA,CAAG,CACjB,CACA,kBAAkBA,EAAKP,EAAQ,QAAS,CACjC,KAAK,SAGV,QAAQ,IAAI,KAAKO,CAAG,GAAI,UAAUP,CAAK,GAAG,CAC5C,CACF,EACIQ,EAAiBH,EAGjBI,EAAgB,KAAM,CACxB,YAAYxD,EAAQ,CAClB,KAAK,OAASA,EACd,KAAK,UAAY,KACjB,KAAK,UAAY,KACjB,KAAK,eAAiB,KACtB,KAAK,UAAY,GACjB,KAAK,OAAS,IAAIuD,EAAe,KAAK,OAAO,KAAK,CACpD,CACA,MAAM,MAAO,CAEX,GADA,KAAK,YAA8B,IAAI,KACnC,CAAC,MAAM,KAAK,sBAAsB,EAAG,CACvC,KAAK,UAAU,EACf,MACF,CACA,KAAK,eAAiB,WAAW,IAAM,CACrC,KAAK,oBAAoB,CAC3B,EAAG,GAAG,EACN,MAAME,EAAoB,MAAM,KAAK,oBAAoB,EACnDC,EAAoB,KAAK,OAAO,OAAO,MAAQD,IAAsB,IAASA,EAAkB,MAAQ,IACxGE,EAAoB,KAAK,OAAO,OAAO,MAAQF,IAAsB,IAASA,EAAkB,MAAQ,IAC1GC,GACF,KAAK,UAAY,IAAI3B,EAAkB,KAAK,OAAQ,KAAK,MAAM,EAC/D,MAAM,KAAK,UAAU,IAAI,GAEzB,KAAK,OAAO,WAAW,gFAAgF,EAErG4B,GACF,KAAK,UAAY,IAAIR,EAAkB,KAAK,OAAQ,KAAK,MAAM,EAC/D,MAAM,KAAK,UAAU,IAAI,GAEzB,KAAK,OAAO,WAAW,gFAAgF,EAErGO,GAAqBC,EACvB,KAAK,uBAAuB,GAE5B,KAAK,OAAO,WAAW,uDAAuD,EAC9E,KAAK,UAAU,EAEnB,CACA,MAAM,uBAAwB,CAC5B,MAAMpE,EAAY,CAChB,MAAO,KAAK,OAAO,gBACnB,OAAQ,KAAK,OAAO,gBACtB,EACA,OAAIO,EAAc,qBAAqB,KAAK,OAAO,UAAWP,CAAS,GACrE,KAAK,OAAO,WAAW,mDAAmD,EACnE,IAEF,EACT,CACA,MAAM,qBAAsB,CAC1B,GAAI,CAACO,EAAc,aAAa,EAC9B,MAAO,GAET,IAAI8D,EAAa,IAAI,SACrB,OAAAA,EAAW,OAAO,SAAU,qBAAqB,EACjDA,EAAW,OAAO,sBAAuB,KAAK,OAAO,KAAK,EAC1DA,EAAW,OAAO,MAAO,KAAK,OAAO,GAAG,EACxCA,EAAW,OAAO,YAAa,KAAK,OAAO,SAAS,GACvB,MAAM,MAAM,KAAK,OAAO,SAAU,CAC7D,OAAQ,OACR,YAAa,cACb,KAAMA,CACR,CAAC,EAAE,KAAMC,GAASA,EAAK,KAAK,CAAC,GACD,IAC9B,CACA,wBAAyB,CACvB,MAAMC,EAAU,CACd,IAAK,KAAK,UAAY,KAAK,UAAU,WAAW,EAAI,KACpD,IAAK,KAAK,UAAY,KAAK,UAAU,WAAW,EAAI,IACtD,EACMD,EAAO,IAAI,SACjBA,EAAK,OAAO,SAAU,eAAe,EACrCA,EAAK,OAAO,sBAAuB,KAAK,OAAO,KAAK,EACpDA,EAAK,OAAO,MAAO,KAAK,OAAO,GAAG,EAClCA,EAAK,OAAO,YAAa,KAAK,OAAO,SAAS,EAC9CA,EAAK,OAAO,SAAU,KAAK,gBAAgB,CAAC,EAC5CA,EAAK,OAAO,UAAW,KAAK,UAAUC,CAAO,CAAC,EAC9C,MAAM,KAAK,OAAO,SAAU,CAC1B,OAAQ,OACR,YAAa,cACb,KAAMD,EACN,QAAS,CACP,wBAAyB,EAC3B,CACF,CAAC,EAAE,KAAME,GAAaA,EAAS,KAAK,CAAC,EAAE,KAAMC,GAAU,CACrD,KAAK,OAAO,WAAWA,EAAM,KAAK,GAAG,CACvC,CAAC,EAAE,MAAOC,GAAU,CAClB,KAAK,OAAO,WAAWA,CAAK,CAC9B,CAAC,EAAE,QAAQ,IAAM,CACf,KAAK,UAAU,CACjB,CAAC,CACH,CACA,iBAAkB,CAChB,OAAW,KAAK,YAAZ,GACK,KAAK,UAGV,KADgC,IAAI,KAAS,KAAK,aAAe,IAE5D,UAEF,SACT,CACA,qBAAsB,CACpB,KAAK,uBAAuB,CAC9B,CACA,WAAY,CACW,SAAS,cAAc,8BAA8B,EAC7D,aAAa,mBAAoB,MAAM,EACpD,aAAa,KAAK,cAAc,CAClC,CACF,EACIC,EAAwBV,GAG1BW,GAAuB,CACvB,GAAI,CAACA,EACH,OAEF,MAAMC,EAAW,IAAIF,EAAsBC,CAAkB,EAC7D,GAAI,SAAS,aAAe,UAAW,CACrC,WAAW,IAAM,CACfC,EAAS,KAAK,CAChB,EAAGD,EAAmB,KAAK,EAC3B,MACF,CACA,SAAS,iBAAiB,mBAAoB,IAAM,CAClD,WAAW,IAAM,CACfC,EAAS,KAAK,CAChB,EAAGD,EAAmB,KAAK,CAC7B,CAAC,CACH,GAAG,OAAO,kBAAkB,EAC5B,IAAIE,EAA2BH,CACjC,GAAG", "names": ["BeaconUtils", "is_mobile", "threshold", "screenWidth", "screenHeight", "isNotValidForMobile", "isNotValidForDesktop", "signature", "rect", "Utils_default", "BeaconLcp", "config", "logger", "above_the_fold_images", "err", "count", "lcpElements", "element", "imgElement", "item", "a", "b", "candidate", "visibleWidth", "visibleHeight", "nodeName", "element_info", "css_bg_url_rgx", "source", "imageElement", "img", "bg_props", "prop", "full_bg_prop", "matches", "m", "elements", "firstElementWithInfo", "elementInfo", "image", "isImageOrVideo", "isBgImageOrPicture", "BeaconLcp_default", "BeaconLrc", "elementsInView", "depth", "parent", "scrollTop", "skipStrings", "str", "exclusions", "i", "attribute", "pattern", "attributeValue", "distance", "hash", "can_push_hash", "color", "position", "pos", "sibling", "BeaconLrc_default", "Logger", "enabled", "msg", "Logger_default", "BeaconManager", "isGeneratedBefore", "shouldGenerateLcp", "shouldGeneratelrc", "data_check", "data", "results", "response", "data2", "error", "BeaconManager_default", "rocket_beacon_data", "instance", "BeaconEntryPoint_default"] } From 728e281efdb9357440b06a22b60c6089f4004948 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 4 Sep 2024 11:19:23 +0100 Subject: [PATCH 122/192] :close: #6943 Change dashboard button description --- inc/Engine/Admin/Settings/AdminBarMenuTrait.php | 12 ++++++------ views/settings/sections/clean-section.php | 4 +++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php index f13127b2fe..588c2f7749 100644 --- a/inc/Engine/Admin/Settings/AdminBarMenuTrait.php +++ b/inc/Engine/Admin/Settings/AdminBarMenuTrait.php @@ -111,20 +111,20 @@ protected function add_url_menu_item_to_admin_bar( * @param string $title The button title. * @param string $label Button label. * @param string $action Button action. - * @param string $hover_text Button Hover text. + * @param string $description Button description text. * * @return void */ - public function dashboard_button( bool $context, string $title, string $label, string $action, string $hover_text = '' ): void { + public function dashboard_button( bool $context, string $title, string $label, string $action, string $description = '' ): void { if ( ! $context ) { return; } $data = [ - 'action' => $action, - 'title' => $title, - 'label' => $label, - 'hover_text' => $hover_text, + 'action' => $action, + 'title' => $title, + 'label' => $label, + 'description' => $description, ]; echo $this->generate( 'sections/clean-section', $data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped diff --git a/views/settings/sections/clean-section.php b/views/settings/sections/clean-section.php index cea30efdd4..339d288964 100644 --- a/views/settings/sections/clean-section.php +++ b/views/settings/sections/clean-section.php @@ -15,6 +15,9 @@ ?>

+ +

+ render_action_button( 'link', @@ -23,7 +26,6 @@ 'label' => $data['label'], 'attributes' => [ 'class' => 'wpr-button wpr-button--icon wpr-button--no-min-width wpr-button--small wpr-icon-trash', - 'title' => $data['hover_text'], ], ] ); From 317b045208f6a0313e97c2c618963740dc8ddef4 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 4 Sep 2024 11:29:45 +0100 Subject: [PATCH 123/192] Modify unit test --- .../Settings/displayDashboardButton.php | 45 ++++++++++--------- .../Settings/displayDashboardButton.php | 4 +- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php index 20f487b44b..faf4e6e4ec 100644 --- a/tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php +++ b/tests/Fixtures/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php @@ -1,9 +1,9 @@ [ + 'shouldOutputLinkButtonWithDescription' => [ 'config' => [ - 'title_attr_text' => 'Title text', + 'description' => 'Short description for button', 'environment' => 'production', 'label' => 'Button label', 'action' => 'menu-action', @@ -13,40 +13,41 @@ 'expected' => <<

Button label

- Menu title +

Short description for button

+ Menu title
HTML ], 'shouldOutputEmptyWhenContextIsFalse' => [ 'config' => [ - 'title_attr_text' => 'Title text', - 'environment' => 'production', - 'label' => 'Button label', - 'action' => 'menu-action', - 'title' => 'Menu title', - 'context' => false, + 'description' => 'Title text', + 'environment' => 'production', + 'label' => 'Button label', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => false, ], 'expected' => null ], 'shouldOutputEmptyWhenEnvironmentIsLocal' => [ 'config' => [ - 'title_attr_text' => 'Title text', - 'environment' => 'local', - 'label' => 'Button label', - 'action' => 'menu-action', - 'title' => 'Menu title', - 'context' => false, + 'description' => 'Title text', + 'environment' => 'local', + 'label' => 'Button label', + 'action' => 'menu-action', + 'title' => 'Menu title', + 'context' => false, ], 'expected' => null ], - 'shouldOutputLinkButtonWithoutLinkTitleAttribute' => [ + 'shouldOutputLinkButtonWithoutLinkDescription' => [ 'config' => [ - 'title_attr_text' => '', - 'environment' => 'production', - 'label' => 'label', - 'action' => 'menu-action', - 'title' => 'Title', - 'context' => true, + 'description' => '', + 'environment' => 'production', + 'label' => 'label', + 'action' => 'menu-action', + 'title' => 'Title', + 'context' => true, ], 'expected' => << diff --git a/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php b/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php index 160a7dcb4e..db30912ba4 100644 --- a/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php +++ b/tests/Unit/inc/Engine/Admin/Settings/Settings/displayDashboardButton.php @@ -45,7 +45,7 @@ public function testShouldReturnAsExpected($config, $expected) { 'title' => $config['title'], 'action' => $config['action'], 'label' => $config['label'], - 'hover_text' => $config['title_attr_text'] + 'description' => $config['description'] ]; if ( null !== $expected ) { @@ -61,7 +61,7 @@ public function testShouldReturnAsExpected($config, $expected) { $config['title'], $config['label'], $config['action'], - $config['title_attr_text'] + $config['description'] ); $output = ob_get_clean(); From efd655637fbe0b298e4b1f4815c48682039025e0 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Wed, 4 Sep 2024 14:26:03 +0300 Subject: [PATCH 124/192] try excluding the new rule from phpstan --- phpstan.neon.dist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 612faecfcd..4f14976f4a 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -51,3 +51,5 @@ parameters: # These need plugin stubs! - %currentWorkingDirectory%/inc/classes/subscriber/third-party/ - %currentWorkingDirectory%/inc/3rd-party/ + featureToggles: + requireFileExists: false From a20f7232ea3504ea94ab31bdbaf88fedad54d474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Wed, 4 Sep 2024 10:58:08 -0400 Subject: [PATCH 125/192] update filters prefix --- .../Optimization/LazyRenderContent/Context/Context.php | 2 +- .../LazyRenderContent/Frontend/Processor/HelperTrait.php | 6 +++--- tests/Integration/bootstrap.php | 4 ++-- .../LazyRenderContent/Frontend/Subscriber/add_hashes.php | 4 ++-- .../LazyRenderContent/Context/Context/isAllowed.php | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Context/Context.php b/inc/Engine/Optimization/LazyRenderContent/Context/Context.php index 0f5a03cb25..8d68819bbc 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Context/Context.php +++ b/inc/Engine/Optimization/LazyRenderContent/Context/Context.php @@ -22,6 +22,6 @@ public function is_allowed( array $data = [] ): bool { * * @param bool $allow True to allow, false otherwise. */ - return wpm_apply_filters_typed( 'boolean', 'rocket_lazy_render_content_optimization', true ); + return wpm_apply_filters_typed( 'boolean', 'rocket_lrc_optimization', true ); } } diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php index 8a91d3d97e..cf6e7d8b8f 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php @@ -13,11 +13,11 @@ trait HelperTrait { protected function get_depth() { /** * Filter the depth integer value. - * The actual applied depth in the source is the default + 1 after the body or rocket_lazy_render_content_depth+1 after the body if the filter is set + * The actual applied depth in the source is the default + 1 after the body or rocket_lrc_depth+1 after the body if the filter is set * * @param int $depth Depth value. */ - return wpm_apply_filters_typed( 'integer', 'rocket_lazy_render_content_depth', 2 ); + return wpm_apply_filters_typed( 'integer', 'rocket_lrc_depth', 2 ); } /** @@ -33,7 +33,7 @@ protected function get_processed_tags() { */ return wpm_apply_filters_typed( 'array', - 'rocket_lazy_render_content_processed_tags', + 'rocket_lrc_processed_tags', [ 'DIV', 'MAIN', diff --git a/tests/Integration/bootstrap.php b/tests/Integration/bootstrap.php index da5ab4adf9..a105c30749 100644 --- a/tests/Integration/bootstrap.php +++ b/tests/Integration/bootstrap.php @@ -19,7 +19,7 @@ function () { // Disable ATF & LRC optimizations to prevent DB requests (unrelated to other tests). add_filter( 'rocket_above_the_fold_optimization', '__return_false' ); - add_filter( 'rocket_lazy_render_content_optimization', '__return_false' ); + add_filter( 'rocket_lrc_optimization', '__return_false' ); if ( BootstrapManager::isGroup( 'TranslatePress' ) ) { require WP_ROCKET_TESTS_FIXTURES_DIR . '/classes/TRP_Translate_Press.php'; @@ -265,7 +265,7 @@ function () { if ( BootstrapManager::isGroup( 'PerformanceHints' ) ) { add_filter( 'rocket_above_the_fold_optimization', '__return_true' ); - add_filter( 'rocket_lazy_render_content_optimization', '__return_true' ); + add_filter( 'rocket_lrc_optimization', '__return_true' ); } // Load the plugin. diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php index 104b2e74a2..709798b706 100644 --- a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -33,7 +33,7 @@ public function set_up() public function tear_down() { $this->restoreWpHook('rocket_critical_image_saas_visit_buffer'); - remove_filter( 'rocket_lazy_render_content_optimization', '__return_false' ); + remove_filter( 'rocket_lrc_optimization', '__return_false' ); parent::tear_down(); } @@ -44,7 +44,7 @@ public function tear_down() public function testShouldWorkAsExpected( $config, $expected ) { self::addLrc($config['row']); - add_filter( 'rocket_lazy_render_content_optimization', '__return_true' ); + add_filter( 'rocket_lrc_optimization', '__return_true' ); $this->assertSame( $expected['html'], diff --git a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php index 0bb6b9aced..27f32bb855 100644 --- a/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php +++ b/tests/Unit/inc/Engine/Optimization/LazyRenderContent/Context/Context/isAllowed.php @@ -24,7 +24,7 @@ public function set_up() { */ public function testShouldReturnExpected( $config, $expected ) { Functions\when( 'get_option' )->justReturn( $config['licence'] ); - Filters\expectApplied( 'rocket_lazy_render_content_optimization' ) + Filters\expectApplied( 'rocket_lrc_optimization' ) ->andReturn( $config['filter'] ); $this->assertSame( From 71d2a82c7a795e3e2f3e3218530e7ba6fdf390bf Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 5 Sep 2024 10:04:32 +0100 Subject: [PATCH 126/192] :closes: 6948 -- Make sure tags are case insensitive --- .../LazyRenderContent/Frontend/Processor/HelperTrait.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php index 8a91d3d97e..38b3c26d76 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Processor/HelperTrait.php @@ -31,7 +31,7 @@ protected function get_processed_tags() { * * @param array|string[] $tags Tags to be processed. */ - return wpm_apply_filters_typed( + $tags = wpm_apply_filters_typed( 'array', 'rocket_lazy_render_content_processed_tags', [ @@ -43,5 +43,10 @@ protected function get_processed_tags() { 'HEADER', ] ); + + /** + * Convert tags to upper case here before + */ + return array_map( 'strtoupper', $tags ); } } From 2eb92d29533161b7d0776e3765468fb08b6d21bf Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 5 Sep 2024 16:20:53 +0100 Subject: [PATCH 127/192] Add test --- .../Filter/lrcProcessedTagsFilter.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php new file mode 100644 index 0000000000..a4f4842422 --- /dev/null +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php @@ -0,0 +1,36 @@ +getMethod( 'get_processed_tags' ); + + $method->setAccessible(true); + $result = $method->invoke( $dom ); + + $expected = [ 'DIV', 'MAIN', 'FOOTER', 'SECTION', 'ARTICLE', 'HEADER', 'H2', 'H1', 'LI' ]; + + $this->assertSame( $expected, $result ); + } +} From f6d3fa0a9b81b3e9dbeb98cfe84f8af9592d8995 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 5 Sep 2024 20:40:09 +0200 Subject: [PATCH 128/192] Adapts a new test to the new filter name --- .../Frontend/Filter/lrcProcessedTagsFilter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php index a4f4842422..20cee734bd 100644 --- a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Filter/lrcProcessedTagsFilter.php @@ -14,7 +14,7 @@ class Test_lrcProcessedTagsFilter extends TestCase { public function testShouldReturnAsExpected() { - add_filter( 'rocket_lazy_render_content_processed_tags', function( $tags ) { + add_filter( 'rocket_lrc_processed_tags', function( $tags ) { $tags[]= 'h2'; $tags[]= 'h1'; $tags[]= 'li'; From ec6ff6b4a707f23d6fc3f1d08a22490522585d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Thu, 5 Sep 2024 16:15:54 -0400 Subject: [PATCH 129/192] update instantiation --- .../Common/PerformanceHints/ServiceProvider.php | 13 +++++++++++-- inc/Engine/Media/ServiceProvider.php | 10 ---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index d3d711b5e5..7a545760f3 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -3,6 +3,8 @@ namespace WP_Rocket\Engine\Common\PerformanceHints; +use WP_Rocket\Buffer\Config; +use WP_Rocket\Buffer\Tests; use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Common\PerformanceHints\Admin\{ Controller as AdminController, @@ -20,7 +22,6 @@ Subscriber as WarmUpSubscriber, Queue }; -use WP_Rocket\Engine\Optimization\LazyRenderContent\Context\Context as LRCContext; class ServiceProvider extends AbstractServiceProvider { /** @@ -33,6 +34,8 @@ class ServiceProvider extends AbstractServiceProvider { * @var array */ protected $provides = [ + 'config', + 'tests', 'ajax_processor', 'performance_hints_ajax_subscriber', 'frontend_processor', @@ -162,7 +165,13 @@ public function register(): void { ] ); + $this->getContainer()->add( 'config', Config::class ) + ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); + $this->getContainer()->add( 'tests', Tests::class ) + ->addArgument( $this->getContainer()->get( 'config' ) ); + $this->getContainer()->addShared( 'performance_hints_warmup_subscriber', WarmUpSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'performance_hints_warmup_controller' ) ); + ->addArgument( $this->getContainer()->get( 'performance_hints_warmup_controller' ) ) + ->addArgument( $this->getContainer()->get( 'tests' ) ); } } diff --git a/inc/Engine/Media/ServiceProvider.php b/inc/Engine/Media/ServiceProvider.php index 306d9295e2..a29830dceb 100644 --- a/inc/Engine/Media/ServiceProvider.php +++ b/inc/Engine/Media/ServiceProvider.php @@ -1,8 +1,6 @@ getContainer()->get( 'options' ); - $this->getContainer()->add( 'config', Config::class ) - ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); - $this->getContainer()->add( 'tests', Tests::class ) - ->addArgument( $this->getContainer()->get( 'config' ) ); - $this->getContainer()->add( 'lazyload_assets', Assets::class ); $this->getContainer()->add( 'lazyload_image', Image::class ); $this->getContainer()->add( 'lazyload_iframe', Iframe::class ); @@ -81,7 +72,6 @@ public function register(): void { ->addArgument( $options ); $this->getContainer()->addShared( 'image_dimensions_subscriber', ImageDimensionsSubscriber::class ) ->addArgument( $this->getContainer()->get( 'image_dimensions' ) ) - ->addArgument( $this->getContainer()->get( 'tests' ) ) ->addTag( 'front_subscriber' ); $this->getContainer()->addShared( 'image_dimensions_admin_subscriber', ImageDimensionsAdminSubscriber::class ) ->addArgument( $this->getContainer()->get( 'image_dimensions' ) ) From 58d03503cb7af75257b25fbc989825654a245425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Thu, 5 Sep 2024 16:17:38 -0400 Subject: [PATCH 130/192] move code for buffer --- .../PerformanceHints/WarmUp/Subscriber.php | 46 ++++++++++++++++++- .../Media/ImageDimensions/Subscriber.php | 46 ++++--------------- .../LazyRenderContent/Frontend/Subscriber.php | 22 ++++++++- 3 files changed, 73 insertions(+), 41 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php index 1e4d5a4b2c..e3de6c9469 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php @@ -3,6 +3,7 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\WarmUp; +use WP_Rocket\Buffer\Tests; use WP_Rocket\Event_Management\Subscriber_Interface; class Subscriber implements Subscriber_Interface { @@ -13,13 +14,22 @@ class Subscriber implements Subscriber_Interface { */ private $controller; + /** + * Buffer tests to run against current page, to decide if we can start the buffer or not. + * + * @var Tests + */ + private $buffer_tests; + /** * Constructor * * @param Controller $controller WarmUp controller instance. + * @param Tests $buffer_tests Buffer tests instance. */ - public function __construct( Controller $controller ) { - $this->controller = $controller; + public function __construct( Controller $controller, Tests $buffer_tests ) { + $this->controller = $controller; + $this->buffer_tests = $buffer_tests; } /** @@ -34,6 +44,7 @@ public static function get_subscribed_events(): array { 'rocket_job_warmup' => 'warm_up', 'rocket_job_warmup_url' => 'send_to_saas', 'rocket_saas_api_queued_url' => 'add_wpr_imagedimensions_query_arg', + 'template_redirect' => [ 'start_performance_hints_buffer', 3 ], ]; } @@ -91,4 +102,35 @@ public function warm_up_on_update( $new_version, $old_version ) { public function add_wpr_imagedimensions_query_arg( string $url ): string { return $this->controller->add_wpr_imagedimensions_query_arg( $url ); } + + /** + * Start performance hints buffer + * + * @return void + */ + public function start_performance_hints_buffer() { + if ( ! $this->buffer_tests->can_process_any_buffer() ) { + return; + } + + ob_start( [ $this, 'performance_hints_buffer' ] ); + } + + /** + * Update images that have no width/height with real dimensions for the SaaS + * + * @param string $buffer Page HTML content. + * + * @return string Page HTML content after update. + */ + public function performance_hints_buffer( $buffer ) { + /** + * Filters the buffer content for performance hints. + * + * @since 3.17 + * + * @param $buffer Page HTML content. + */ + return wpm_apply_filters_typed( 'string', 'rocket_performance_hints_buffer', $buffer ); + } } diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index e895bd9e26..132906fb43 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -2,7 +2,6 @@ namespace WP_Rocket\Engine\Media\ImageDimensions; -use WP_Rocket\Buffer\Tests; use WP_Rocket\Event_Management\Subscriber_Interface; /** @@ -19,22 +18,13 @@ class Subscriber implements Subscriber_Interface { */ private $dimensions; - /** - * Buffer tests to run against current page, to decide if we can start the buffer or not. - * - * @var Tests - */ - private $buffer_tests; - /** * Subscriber constructor. * * @param ImageDimensions $dimensions Images dimensions class that handles all business logic. - * @param Tests $buffer_tests Buffer tests instance. */ - public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) { - $this->dimensions = $dimensions; - $this->buffer_tests = $buffer_tests; + public function __construct( ImageDimensions $dimensions ) { + $this->dimensions = $dimensions; } /** @@ -44,9 +34,8 @@ public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) */ public static function get_subscribed_events() { return [ - 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], - 'template_redirect' => [ 'start_image_dimensions_buffer', 3 ], - 'rocket_critical_image_saas_visit_buffer' => 'specify_image_dimensions', + 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], + 'rocket_performance_hints_buffer' => 'image_dimensions_query_string', ]; } @@ -66,36 +55,19 @@ public function specify_image_dimensions( $buffer ) { } /** - * Update images that have no width/height with real dimensions for the SaaS + * Add image dimensions if the query string is in the URL. * * @param string $buffer Page HTML content. * - * @return string Page HTML content after update. + * @return string */ - public function prepare_critical_image_saas_visit( $buffer ) { - if ( ! isset( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return $buffer; - } - - return apply_filters( 'rocket_critical_image_saas_visit_buffer', $buffer ); - } - - /** - * Start image dimensions buffer to add - * - * @return void - */ - public function start_image_dimensions_buffer() { + public function image_dimensions_query_string( $buffer ): string { if ( empty( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return; - } - - if ( ! $this->buffer_tests->can_process_any_buffer() ) { - return; + return $buffer; } add_filter( 'rocket_specify_image_dimensions', '__return_true' ); - ob_start( [ $this, 'prepare_critical_image_saas_visit' ] ); + return $this->dimensions->specify_image_dimensions( $buffer ); } } diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php index c8c88fe4ca..37e0a0e7dd 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -29,8 +29,11 @@ public function __construct( Controller $controller ) { */ public static function get_subscribed_events(): array { return [ - 'rocket_buffer' => [ 'add_hashes', 16 ], - 'rocket_critical_image_saas_visit_buffer' => [ 'add_hashes', 16 ], + 'rocket_buffer' => [ 'add_hashes', 16 ], + 'rocket_performance_hints_buffer' => [ + [ 'add_hashes', 16 ], + [ 'add_hashes_query_string', 16 ], + ], ]; } @@ -44,4 +47,19 @@ public static function get_subscribed_events(): array { public function add_hashes( $html ) { return $this->controller->add_hashes( $html ); } + + /** + * Add hashes to the HTML elements + * + * @param string $buffer The HTML content. + * + * @return string + */ + public function add_hashes_query_string( $buffer ) { + if ( empty( $_GET['wpr_lazyrendercontent'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return $buffer; + } + + return $this->controller->add_hashes( $buffer ); + } } From 6214d0ae473fa30206da5292e7b70e97d04f4a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Thu, 5 Sep 2024 16:28:27 -0400 Subject: [PATCH 131/192] update priority --- .../Optimization/LazyRenderContent/Frontend/Subscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php index 37e0a0e7dd..7f753faa7e 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -32,7 +32,7 @@ public static function get_subscribed_events(): array { 'rocket_buffer' => [ 'add_hashes', 16 ], 'rocket_performance_hints_buffer' => [ [ 'add_hashes', 16 ], - [ 'add_hashes_query_string', 16 ], + [ 'add_hashes_query_string', 17 ], ], ]; } From 1b921c120a8a6e14620e4133afa9186d2898aba3 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 6 Sep 2024 08:27:17 +0100 Subject: [PATCH 132/192] Fixes #6922 3.17: Hashes are not removed from the source when there is no LRC data (#6937) --- .../LazyRenderContent/Database/Rows/LazyRenderContent.php | 4 ++-- .../LazyRenderContent/Frontend/Controller.php | 8 ++++---- .../LazyRenderContent/Frontend/Controller/optimize.php | 8 ++++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php b/inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php index 3331179c7d..65f9ec73e3 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php +++ b/inc/Engine/Optimization/LazyRenderContent/Database/Rows/LazyRenderContent.php @@ -92,7 +92,7 @@ public function __construct( $item ) { /** * Checks if the object has a valid LRC (Lazy Render Content) value. * - * @return bool Returns true if the object's status is 'completed' and the Below the fold value is not empty or 'not found', false otherwise. + * @return bool Returns true if the object's status is 'completed' and the Below the fold value is not empty or '[]', false otherwise. */ public function has_lrc() { if ( 'completed' !== $this->status ) { @@ -103,7 +103,7 @@ public function has_lrc() { return false; } - if ( 'not found' === $this->below_the_fold ) { + if ( '[]' === $this->below_the_fold ) { return false; } diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index b1a473646e..79e0590f14 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -43,13 +43,13 @@ public function __construct( Processor $processor, ContextInterface $context ) { */ public function optimize( string $html, $row ): string { if ( ! $row->has_lrc() ) { - return $html; + return $this->remove_hashes( $html ); } $hashes = json_decode( $row->below_the_fold ); - if ( null === $hashes || ! is_array( $hashes ) ) { - return $html; + if ( ! is_array( $hashes ) ) { + return $this->remove_hashes( $html ); } $result = preg_replace( '/data-rocket-location-hash="(?:' . implode( '|', $hashes ) . ')"/i', 'data-wpr-lazyrender="1"', $html, -1, $count ); @@ -59,7 +59,7 @@ public function optimize( string $html, $row ): string { || 0 === $count ) { - return $html; + return $this->remove_hashes( $html ); } $html = $result; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php index c55eee95d8..a5f5d85d7b 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller/optimize.php @@ -46,4 +46,12 @@ 'html' => $single_line_hashed, 'expected' => $single_line_expected, ], + 'testShouldReturnEarlyWhenDBHasEmptyArray' => [ + 'config' => [ + 'has_lrc' => true, + 'below_the_fold' => '[]', + ], + 'html' => '
hello here
', + 'expected' => '
hello here
', + ], ]; From eaa73d486e208a3e0eb358d7c187c7d5d60f73cb Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 09:58:32 +0100 Subject: [PATCH 133/192] Register warmup subscriber with complete arguments --- .../PerformanceHints/Activation/ServiceProvider.php | 13 ++++++++++++- .../Common/PerformanceHints/ServiceProvider.php | 3 +-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php index 6640dbe77a..a297f8cc4e 100644 --- a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php @@ -3,6 +3,7 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\Activation; +use WP_Rocket\Buffer\{Config, Tests}; use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{APIClient, Controller as WarmUpController, Subscriber as WarmUpSubscriber, Queue}; use WP_Rocket\Engine\Media\AboveTheFold\Context\Context as ATFContext; @@ -98,8 +99,18 @@ public function register(): void { ] ); + $this->getContainer()->add( 'config', Config::class ) + ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); + $this->getContainer()->add( 'tests', Tests::class ) + ->addArgument( $this->getContainer()->get( 'config' ) ); + $this->getContainer()->addShared( 'performance_hints_warmup_subscriber', WarmUpSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'performance_hints_warmup_controller' ) ); + ->addArguments( + [ + $this->getContainer()->get( 'performance_hints_warmup_controller' ), + $this->getContainer()->get( 'tests' ), + ] + ); $this->getContainer()->add( 'performance_hints_activation', Activation::class ) ->addArguments( diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index 7a545760f3..bcfdb27731 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -3,8 +3,7 @@ namespace WP_Rocket\Engine\Common\PerformanceHints; -use WP_Rocket\Buffer\Config; -use WP_Rocket\Buffer\Tests; +use WP_Rocket\Buffer\{Config, Tests}; use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Common\PerformanceHints\Admin\{ Controller as AdminController, From cadf21771432e41aab3fcbc8c65e73b7c687c1f0 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 12:50:26 +0100 Subject: [PATCH 134/192] Revert changes --- .../Media/ImageDimensions/Subscriber.php | 44 +++++++++++++++---- inc/Engine/Media/ServiceProvider.php | 10 +++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index 132906fb43..c6f69bcca9 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -3,6 +3,7 @@ namespace WP_Rocket\Engine\Media\ImageDimensions; use WP_Rocket\Event_Management\Subscriber_Interface; +use WP_Rocket\Buffer\Tests; /** * Images Subscriber @@ -18,13 +19,22 @@ class Subscriber implements Subscriber_Interface { */ private $dimensions; + /** + * Buffer tests to run against current page, to decide if we can start the buffer or not. + * + * @var Tests + */ + private $buffer_tests; + /** * Subscriber constructor. * * @param ImageDimensions $dimensions Images dimensions class that handles all business logic. + * @param Tests $buffer_tests Buffer tests instance. */ - public function __construct( ImageDimensions $dimensions ) { + public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) { $this->dimensions = $dimensions; + $this->buffer_tests = $buffer_tests; } /** @@ -34,8 +44,9 @@ public function __construct( ImageDimensions $dimensions ) { */ public static function get_subscribed_events() { return [ - 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], - 'rocket_performance_hints_buffer' => 'image_dimensions_query_string', + 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], + 'template_redirect' => [ 'start_image_dimensions_buffer', 3 ], + 'rocket_critical_image_saas_visit_buffer' => 'specify_image_dimensions', ]; } @@ -55,19 +66,36 @@ public function specify_image_dimensions( $buffer ) { } /** - * Add image dimensions if the query string is in the URL. + * Update images that have no width/height with real dimensions for the SaaS * * @param string $buffer Page HTML content. * - * @return string + * @return string Page HTML content after update. */ - public function image_dimensions_query_string( $buffer ): string { - if ( empty( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + public function prepare_critical_image_saas_visit( $buffer ) { + if ( ! isset( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return $buffer; } + return apply_filters( 'rocket_critical_image_saas_visit_buffer', $buffer ); + } + + /** + * Start image dimensions buffer to add + * + * @return void + */ + public function start_image_dimensions_buffer() { + if ( empty( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return; + } + + if ( ! $this->buffer_tests->can_process_any_buffer() ) { + return; + } + add_filter( 'rocket_specify_image_dimensions', '__return_true' ); - return $this->dimensions->specify_image_dimensions( $buffer ); + ob_start( [ $this, 'prepare_critical_image_saas_visit' ] ); } } diff --git a/inc/Engine/Media/ServiceProvider.php b/inc/Engine/Media/ServiceProvider.php index a29830dceb..306d9295e2 100644 --- a/inc/Engine/Media/ServiceProvider.php +++ b/inc/Engine/Media/ServiceProvider.php @@ -1,6 +1,8 @@ getContainer()->get( 'options' ); + $this->getContainer()->add( 'config', Config::class ) + ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); + $this->getContainer()->add( 'tests', Tests::class ) + ->addArgument( $this->getContainer()->get( 'config' ) ); + $this->getContainer()->add( 'lazyload_assets', Assets::class ); $this->getContainer()->add( 'lazyload_image', Image::class ); $this->getContainer()->add( 'lazyload_iframe', Iframe::class ); @@ -72,6 +81,7 @@ public function register(): void { ->addArgument( $options ); $this->getContainer()->addShared( 'image_dimensions_subscriber', ImageDimensionsSubscriber::class ) ->addArgument( $this->getContainer()->get( 'image_dimensions' ) ) + ->addArgument( $this->getContainer()->get( 'tests' ) ) ->addTag( 'front_subscriber' ); $this->getContainer()->addShared( 'image_dimensions_admin_subscriber', ImageDimensionsAdminSubscriber::class ) ->addArgument( $this->getContainer()->get( 'image_dimensions' ) ) From 74ef839ae3094300af1115a794706b5a3be4ee9f Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 12:51:44 +0100 Subject: [PATCH 135/192] phpcs fix --- inc/Engine/Media/ImageDimensions/Subscriber.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index c6f69bcca9..05aa5b0e3a 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -33,7 +33,7 @@ class Subscriber implements Subscriber_Interface { * @param Tests $buffer_tests Buffer tests instance. */ public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) { - $this->dimensions = $dimensions; + $this->dimensions = $dimensions; $this->buffer_tests = $buffer_tests; } From a23133a31af593d94589f0b13ceafd31b7ae03e3 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 12:54:04 +0100 Subject: [PATCH 136/192] Returned saas visit subscriber and updated rocket_performance_hints_buffer call back --- .../LazyRenderContent/Frontend/Subscriber.php | 23 +++---------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php index 7f753faa7e..fc3cacff21 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -29,11 +29,9 @@ public function __construct( Controller $controller ) { */ public static function get_subscribed_events(): array { return [ - 'rocket_buffer' => [ 'add_hashes', 16 ], - 'rocket_performance_hints_buffer' => [ - [ 'add_hashes', 16 ], - [ 'add_hashes_query_string', 17 ], - ], + 'rocket_buffer' => [ 'add_hashes', 16 ], + 'rocket_critical_image_saas_visit_buffer' => [ 'add_hashes', 16 ], + 'rocket_performance_hints_buffer' => [ 'add_hashes', 16 ], ]; } @@ -47,19 +45,4 @@ public static function get_subscribed_events(): array { public function add_hashes( $html ) { return $this->controller->add_hashes( $html ); } - - /** - * Add hashes to the HTML elements - * - * @param string $buffer The HTML content. - * - * @return string - */ - public function add_hashes_query_string( $buffer ) { - if ( empty( $_GET['wpr_lazyrendercontent'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return $buffer; - } - - return $this->controller->add_hashes( $buffer ); - } } From ee8a9e47cbee2e7ead9ff65ad783960bad9a4401 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 12:55:13 +0100 Subject: [PATCH 137/192] Updated bail out condition --- inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php index e3de6c9469..dd1f30c875 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php @@ -109,6 +109,11 @@ public function add_wpr_imagedimensions_query_arg( string $url ): string { * @return void */ public function start_performance_hints_buffer() { + // SaaS visits will be priority. + if ( isset( $_GET['wpr_imagedimensions'] ) || ! isset( $_GET['wpr_lazyrendercontent'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return; + } + if ( ! $this->buffer_tests->can_process_any_buffer() ) { return; } From e64bf2bda504ecba3d0a6d76bdef8c02efd27640 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 16:08:49 +0100 Subject: [PATCH 138/192] Moved rocket_performance_hints_buffer to frontend subscriber --- .../PerformanceHints/Frontend/Subscriber.php | 59 +++++++++++++++++-- .../PerformanceHints/ServiceProvider.php | 15 ++--- .../PerformanceHints/WarmUp/Subscriber.php | 51 +--------------- 3 files changed, 64 insertions(+), 61 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php b/inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php index dde578f3f7..d23230c97c 100644 --- a/inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/Frontend/Subscriber.php @@ -3,9 +3,9 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\Frontend; +use WP_Rocket\Buffer\Tests; use WP_Rocket\Event_Management\Subscriber_Interface; - class Subscriber implements Subscriber_Interface { /** @@ -15,13 +15,22 @@ class Subscriber implements Subscriber_Interface { */ private $processor; + /** + * Buffer tests to run against current page, to decide if we can start the buffer or not. + * + * @var Tests + */ + private $buffer_tests; + /** * Instantiate the class * * @param Processor $processor Processor Instance. + * @param Tests $buffer_tests Buffer tests instance. */ - public function __construct( Processor $processor ) { - $this->processor = $processor; + public function __construct( Processor $processor, Tests $buffer_tests ) { + $this->processor = $processor; + $this->buffer_tests = $buffer_tests; } /** @@ -31,8 +40,9 @@ public function __construct( Processor $processor ) { */ public static function get_subscribed_events(): array { return [ - 'rocket_buffer' => [ 'maybe_apply_optimizations', 17 ], - 'rocket_critical_image_saas_visit_buffer' => [ 'maybe_apply_optimizations', 17 ], + 'rocket_buffer' => [ 'maybe_apply_optimizations', 17 ], + 'rocket_performance_hints_buffer' => [ 'maybe_apply_optimizations', 17 ], + 'template_redirect' => [ 'start_performance_hints_buffer', 3 ], ]; } @@ -44,6 +54,45 @@ public static function get_subscribed_events(): array { * @return string */ public function maybe_apply_optimizations( $html ): string { + if ( ! isset( $_GET['wpr_imagedimensions'] ) && isset( $_GET['wpr_lazyrendercontent'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return $html; + } + return $this->processor->maybe_apply_optimizations( $html ); } + + /** + * Start performance hints buffer + * + * @return void + */ + public function start_performance_hints_buffer() { + if ( ! isset( $_GET['wpr_imagedimensions'] ) && ! isset( $_GET['wpr_lazyrendercontent'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return; + } + + if ( ! $this->buffer_tests->can_process_any_buffer() ) { + return; + } + + ob_start( [ $this, 'performance_hints_buffer' ] ); + } + + /** + * Update images that have no width/height with real dimensions for the SaaS + * + * @param string $buffer Page HTML content. + * + * @return string Page HTML content after update. + */ + public function performance_hints_buffer( $buffer ) { + /** + * Filters the buffer content for performance hints. + * + * @since 3.17 + * + * @param $buffer Page HTML content. + */ + return wpm_apply_filters_typed( 'string', 'rocket_performance_hints_buffer', $buffer ); + } } diff --git a/inc/Engine/Common/PerformanceHints/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/ServiceProvider.php index bcfdb27731..1330e11e3a 100644 --- a/inc/Engine/Common/PerformanceHints/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/ServiceProvider.php @@ -102,10 +102,17 @@ public function register(): void { ] ); + $this->getContainer()->add( 'config', Config::class ) + ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); + + $this->getContainer()->add( 'tests', Tests::class ) + ->addArgument( $this->getContainer()->get( 'config' ) ); + $this->getContainer()->addShared( 'performance_hints_frontend_subscriber', FrontendSubscriber::class ) ->addArguments( [ $this->getContainer()->get( 'frontend_processor' ), + $this->getContainer()->get( 'tests' ), ] ); @@ -164,13 +171,7 @@ public function register(): void { ] ); - $this->getContainer()->add( 'config', Config::class ) - ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); - $this->getContainer()->add( 'tests', Tests::class ) - ->addArgument( $this->getContainer()->get( 'config' ) ); - $this->getContainer()->addShared( 'performance_hints_warmup_subscriber', WarmUpSubscriber::class ) - ->addArgument( $this->getContainer()->get( 'performance_hints_warmup_controller' ) ) - ->addArgument( $this->getContainer()->get( 'tests' ) ); + ->addArgument( $this->getContainer()->get( 'performance_hints_warmup_controller' ) ); } } diff --git a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php index dd1f30c875..1e4d5a4b2c 100644 --- a/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php +++ b/inc/Engine/Common/PerformanceHints/WarmUp/Subscriber.php @@ -3,7 +3,6 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\WarmUp; -use WP_Rocket\Buffer\Tests; use WP_Rocket\Event_Management\Subscriber_Interface; class Subscriber implements Subscriber_Interface { @@ -14,22 +13,13 @@ class Subscriber implements Subscriber_Interface { */ private $controller; - /** - * Buffer tests to run against current page, to decide if we can start the buffer or not. - * - * @var Tests - */ - private $buffer_tests; - /** * Constructor * * @param Controller $controller WarmUp controller instance. - * @param Tests $buffer_tests Buffer tests instance. */ - public function __construct( Controller $controller, Tests $buffer_tests ) { - $this->controller = $controller; - $this->buffer_tests = $buffer_tests; + public function __construct( Controller $controller ) { + $this->controller = $controller; } /** @@ -44,7 +34,6 @@ public static function get_subscribed_events(): array { 'rocket_job_warmup' => 'warm_up', 'rocket_job_warmup_url' => 'send_to_saas', 'rocket_saas_api_queued_url' => 'add_wpr_imagedimensions_query_arg', - 'template_redirect' => [ 'start_performance_hints_buffer', 3 ], ]; } @@ -102,40 +91,4 @@ public function warm_up_on_update( $new_version, $old_version ) { public function add_wpr_imagedimensions_query_arg( string $url ): string { return $this->controller->add_wpr_imagedimensions_query_arg( $url ); } - - /** - * Start performance hints buffer - * - * @return void - */ - public function start_performance_hints_buffer() { - // SaaS visits will be priority. - if ( isset( $_GET['wpr_imagedimensions'] ) || ! isset( $_GET['wpr_lazyrendercontent'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return; - } - - if ( ! $this->buffer_tests->can_process_any_buffer() ) { - return; - } - - ob_start( [ $this, 'performance_hints_buffer' ] ); - } - - /** - * Update images that have no width/height with real dimensions for the SaaS - * - * @param string $buffer Page HTML content. - * - * @return string Page HTML content after update. - */ - public function performance_hints_buffer( $buffer ) { - /** - * Filters the buffer content for performance hints. - * - * @since 3.17 - * - * @param $buffer Page HTML content. - */ - return wpm_apply_filters_typed( 'string', 'rocket_performance_hints_buffer', $buffer ); - } } From f0730618c6c82543f5ffd42bff59ca7e8126587b Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 16:09:45 +0100 Subject: [PATCH 139/192] Revert to remy changes --- .../Media/ImageDimensions/Subscriber.php | 46 ++++--------------- 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index 05aa5b0e3a..132906fb43 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -3,7 +3,6 @@ namespace WP_Rocket\Engine\Media\ImageDimensions; use WP_Rocket\Event_Management\Subscriber_Interface; -use WP_Rocket\Buffer\Tests; /** * Images Subscriber @@ -19,22 +18,13 @@ class Subscriber implements Subscriber_Interface { */ private $dimensions; - /** - * Buffer tests to run against current page, to decide if we can start the buffer or not. - * - * @var Tests - */ - private $buffer_tests; - /** * Subscriber constructor. * * @param ImageDimensions $dimensions Images dimensions class that handles all business logic. - * @param Tests $buffer_tests Buffer tests instance. */ - public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) { - $this->dimensions = $dimensions; - $this->buffer_tests = $buffer_tests; + public function __construct( ImageDimensions $dimensions ) { + $this->dimensions = $dimensions; } /** @@ -44,9 +34,8 @@ public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) */ public static function get_subscribed_events() { return [ - 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], - 'template_redirect' => [ 'start_image_dimensions_buffer', 3 ], - 'rocket_critical_image_saas_visit_buffer' => 'specify_image_dimensions', + 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], + 'rocket_performance_hints_buffer' => 'image_dimensions_query_string', ]; } @@ -66,36 +55,19 @@ public function specify_image_dimensions( $buffer ) { } /** - * Update images that have no width/height with real dimensions for the SaaS + * Add image dimensions if the query string is in the URL. * * @param string $buffer Page HTML content. * - * @return string Page HTML content after update. + * @return string */ - public function prepare_critical_image_saas_visit( $buffer ) { - if ( ! isset( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return $buffer; - } - - return apply_filters( 'rocket_critical_image_saas_visit_buffer', $buffer ); - } - - /** - * Start image dimensions buffer to add - * - * @return void - */ - public function start_image_dimensions_buffer() { + public function image_dimensions_query_string( $buffer ): string { if ( empty( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - return; - } - - if ( ! $this->buffer_tests->can_process_any_buffer() ) { - return; + return $buffer; } add_filter( 'rocket_specify_image_dimensions', '__return_true' ); - ob_start( [ $this, 'prepare_critical_image_saas_visit' ] ); + return $this->dimensions->specify_image_dimensions( $buffer ); } } From 866c34c1ff3d6ede399924a2e7aea5e17c3a93b9 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 16:15:12 +0100 Subject: [PATCH 140/192] Updated subscriber --- .../Optimization/LazyRenderContent/Frontend/Subscriber.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php index fc3cacff21..3047298be9 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -29,9 +29,8 @@ public function __construct( Controller $controller ) { */ public static function get_subscribed_events(): array { return [ - 'rocket_buffer' => [ 'add_hashes', 16 ], - 'rocket_critical_image_saas_visit_buffer' => [ 'add_hashes', 16 ], - 'rocket_performance_hints_buffer' => [ 'add_hashes', 16 ], + 'rocket_buffer' => [ 'add_hashes', 16 ], + 'rocket_performance_hints_buffer' => [ 'add_hashes', 16 ], ]; } From 0f7c3fef25b91b6ce4a5704e7f8cb69521a7b683 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 16:41:21 +0100 Subject: [PATCH 141/192] Updated test --- .../LazyRenderContent/Frontend/Subscriber/add_hashes.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php index 709798b706..4731675e68 100644 --- a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -27,12 +27,12 @@ public function set_up() { parent::set_up(); - $this->unregisterAllCallbacksExcept('rocket_critical_image_saas_visit_buffer', 'add_hashes', 16); + $this->unregisterAllCallbacksExcept('rocket_performance_hints_buffer', 'add_hashes', 16); } public function tear_down() { - $this->restoreWpHook('rocket_critical_image_saas_visit_buffer'); + $this->restoreWpHook('rocket_performance_hints_buffer'); remove_filter( 'rocket_lrc_optimization', '__return_false' ); parent::tear_down(); @@ -48,7 +48,7 @@ public function testShouldWorkAsExpected( $config, $expected ) { $this->assertSame( $expected['html'], - apply_filters( 'rocket_critical_image_saas_visit_buffer', $config['html'] ) + apply_filters( 'rocket_performance_hints_buffer', $config['html'] ) ); } } From 9b19f44915b1653ac13b4ab8055688e3473acfc0 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 16:56:25 +0100 Subject: [PATCH 142/192] Removed second argument for warmup in activation service provider --- .../Common/PerformanceHints/Activation/ServiceProvider.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php index a297f8cc4e..449a980df9 100644 --- a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php @@ -3,7 +3,6 @@ namespace WP_Rocket\Engine\Common\PerformanceHints\Activation; -use WP_Rocket\Buffer\{Config, Tests}; use WP_Rocket\Dependencies\League\Container\ServiceProvider\AbstractServiceProvider; use WP_Rocket\Engine\Common\PerformanceHints\WarmUp\{APIClient, Controller as WarmUpController, Subscriber as WarmUpSubscriber, Queue}; use WP_Rocket\Engine\Media\AboveTheFold\Context\Context as ATFContext; @@ -99,16 +98,10 @@ public function register(): void { ] ); - $this->getContainer()->add( 'config', Config::class ) - ->addArgument( [ 'config_dir_path' => rocket_get_constant( 'WP_ROCKET_CONFIG_PATH' ) ] ); - $this->getContainer()->add( 'tests', Tests::class ) - ->addArgument( $this->getContainer()->get( 'config' ) ); - $this->getContainer()->addShared( 'performance_hints_warmup_subscriber', WarmUpSubscriber::class ) ->addArguments( [ $this->getContainer()->get( 'performance_hints_warmup_controller' ), - $this->getContainer()->get( 'tests' ), ] ); From 29a4a56b075e58be75ba534d19056b266fe9d672 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Fri, 6 Sep 2024 18:04:57 +0100 Subject: [PATCH 143/192] Revert changes: no coverage analysis --- .../Common/PerformanceHints/Activation/ServiceProvider.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php index 449a980df9..6640dbe77a 100644 --- a/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php +++ b/inc/Engine/Common/PerformanceHints/Activation/ServiceProvider.php @@ -99,11 +99,7 @@ public function register(): void { ); $this->getContainer()->addShared( 'performance_hints_warmup_subscriber', WarmUpSubscriber::class ) - ->addArguments( - [ - $this->getContainer()->get( 'performance_hints_warmup_controller' ), - ] - ); + ->addArgument( $this->getContainer()->get( 'performance_hints_warmup_controller' ) ); $this->getContainer()->add( 'performance_hints_activation', Activation::class ) ->addArguments( From dcd1419465a63274f534d59688068809b92df66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Fri, 6 Sep 2024 15:49:01 -0400 Subject: [PATCH 144/192] add method add hashs without check --- .../LazyRenderContent/Frontend/Controller.php | 15 +++++++++++++-- .../LazyRenderContent/Frontend/Subscriber.php | 13 ++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php index 79e0590f14..57ed9806d8 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Controller.php @@ -105,17 +105,28 @@ private function add_css( $html ) { } /** - * Add hashes to the HTML elements + * Add hashes to the HTML elements if allowed * * @param string $html The HTML content. * * @return string */ - public function add_hashes( $html ) { + public function add_hashes_when_allowed( $html ) { if ( ! $this->context->is_allowed() ) { return $html; } + return $this->add_hashes( $html ); + } + + /** + * Add hashes to the HTML elements + * + * @param string $html The HTML content. + * + * @return string + */ + public function add_hashes( $html ) { /** * Filters the Lazy Render Content processor to use. * diff --git a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php index 3047298be9..66082e88dd 100644 --- a/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php +++ b/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber.php @@ -29,11 +29,22 @@ public function __construct( Controller $controller ) { */ public static function get_subscribed_events(): array { return [ - 'rocket_buffer' => [ 'add_hashes', 16 ], + 'rocket_buffer' => [ 'add_hashes_when_allowed', 16 ], 'rocket_performance_hints_buffer' => [ 'add_hashes', 16 ], ]; } + /** + * Add hashes to the HTML elements if allowed + * + * @param string $html The HTML content. + * + * @return string + */ + public function add_hashes_when_allowed( $html ) { + return $this->controller->add_hashes_when_allowed( $html ); + } + /** * Add hashes to the HTML elements * From 9cb20a638c5398fd2adf0497dbc1ded14ddc8a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Mon, 9 Sep 2024 09:53:24 -0400 Subject: [PATCH 145/192] update tests --- .../Subscriber/add_hashes_when_allowed.php | 50 ++++++++++++++ .../Frontend/Subscriber/html/expected.php | 4 -- .../Subscriber/html/expected_allowed.php | 65 +++++++++++++++++++ .../Frontend/Subscriber/html/original.php | 4 -- .../Frontend/Subscriber/add_hashes.php | 18 +++-- .../Subscriber/add_hashes_when_allowed.php | 62 ++++++++++++++++++ 6 files changed, 185 insertions(+), 18 deletions(-) create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php create mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected_allowed.php create mode 100644 tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php new file mode 100644 index 0000000000..6575257283 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php @@ -0,0 +1,50 @@ + [ + 'shouldNotAddHashesWhenNotAllowed' => [ + 'config' => [ + 'filter' => false, + 'row' => [ + 'url' => 'http://example.org/', + 'is_mobile' => 0, + 'below_the_fold' => json_encode( + [ + '93548b90aa8f4989f7198144479055dc', + '7b16eca0652d4703f83ba63e304f2030', + '737184bbad8e65d0172a89cc68a46107', + '8a4ef50742cf3456f9db6425e16930dc', + ] + ), + 'status' => 'completed', + ], + 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php' ), + ], + 'expected' => [ + 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php' ), + ], + ], + 'shouldAddHashes' => [ + 'config' => [ + 'filter' => true, + 'row' => [ + 'url' => 'http://example.org/', + 'is_mobile' => 0, + 'below_the_fold' => json_encode( + [ + '93548b90aa8f4989f7198144479055dc', + '7b16eca0652d4703f83ba63e304f2030', + '737184bbad8e65d0172a89cc68a46107', + '8a4ef50742cf3456f9db6425e16930dc', + ] + ), + 'status' => 'completed', + ], + 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php' ), + ], + 'expected' => [ + 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected_allowed.php' ), + ], + ], + ], +]; diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php index d6080e38f6..ad15561af8 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php @@ -12,8 +12,6 @@ - - + + +
400px +
800 px +































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































+ 1800 px
Testing something
+
+
+ +
+
+
+
+ This is a class with margin-top set to 3000px +
+
+
+
+ +
+
+
+ This is a class with margin-top set to 1800px +
+
+
+ +
+ Somethign fishy going on. +
+ + diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php index 4c4601398e..be2346dbb0 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php @@ -14,8 +14,6 @@ - - -
400px -
800 px -































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































+
400px +
800 px +































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































1800 px
Testing something
-
+
-
+
This is a class with margin-top set to 3000px
-
+
This is a class with margin-top set to 1800px diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_expected_150_hashes.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_expected_150_hashes.php new file mode 100644 index 0000000000..b8cb5b4be8 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_expected_150_hashes.php @@ -0,0 +1,375 @@ + + + + + +HTML Page with 100,000 Div Elements + + +largehtmldiv – ColorMag + + +test1 +
Div 1
+
Div 2
+
Div 3
+
Div 4
+
Div 5
+
Div 6
+
Div 7
+
Div 8
+
Div 9
+
Div 10
+
Div 11
+
Div 12
+
Div 13
+
Div 14
+
Div 15
+
Div 16
+
Div 17
+
Div 18
+
Div 19
+
Div 20
+
Div 21
+
Div 22
+
Div 23
+
Div 24
+
Div 25
+
Div 26
+
Div 27
+
Div 28
+
Div 29
+
Div 30
+
Div 31
+
Div 32
+
Div 33
+
Div 34
+
Div 35
+
Div 36
+
Div 37
+
Div 38
+
Div 39
+
Div 40
+
Div 41
+
Div 42
+
Div 43
+
Div 44
+
Div 45
+
Div 46
+
Div 47
+
Div 48
+
Div 49
+
Div 50
+
Div 51
+
Div 52
+
Div 53
+
Div 54
+
Div 55
+
Div 56
+
Div 57
+
Div 58
+
Div 59
+
Div 60
+
Div 61
+
Div 62
+
Div 63
+
Div 64
+
Div 65
+
Div 66
+
Div 67
+
Div 68
+
Div 69
+
Div 70
+
Div 71
+
Div 72
+
Div 73
+
Div 74
+
Div 75
+
Div 76
+
Div 77
+
Div 78
+
Div 79
+
Div 80
+
Div 81
+
Div 82
+
Div 83
+
Div 84
+
Div 85
+
Div 86
+
Div 87
+
Div 88
+
Div 89
+
Div 90
+
Div 91
+
Div 92
+
Div 93
+
Div 94
+
Div 95
+
Div 96
+
Div 97
+
Div 98
+
Div 99
+
Div 100
+
Div 101
+
Div 102
+
Div 103
+
Div 104
+
Div 105
+
Div 106
+
Div 107
+
Div 108
+
Div 109
+
Div 110
+
Div 111
+
Div 112
+
Div 113
+
Div 114
+
Div 115
+
Div 116
+
Div 117
+
Div 118
+
Div 119
+
Div 120
+
Div 121
+
Div 122
+
Div 123
+
Div 124
+
Div 125
+
Div 126
+
Div 127
+
Div 128
+
Div 129
+
Div 130
+
Div 131
+
Div 132
+
Div 133
+
Div 134
+
Div 135
+
Div 136
+
Div 137
+
Div 138
+
Div 139
+
Div 140
+
Div 141
+
Div 142
+
Div 143
+
Div 144
+
Div 145
+
Div 146
+
Div 147
+
Div 148
+
Div 149
+
Div 150
+
Div 151
+
Div 152
+
Div 153
+
Div 154
+
Div 155
+
Div 156
+
Div 157
+
Div 158
+
Div 159
+
Div 160
+
Div 161
+
Div 162
+
Div 163
+
Div 164
+
Div 165
+
Div 166
+
Div 167
+
Div 168
+
Div 169
+
Div 170
+
Div 171
+
Div 172
+
Div 173
+
Div 174
+
Div 175
+
Div 176
+
Div 177
+
Div 178
+
Div 179
+
Div 180
+
Div 181
+
Div 182
+
Div 183
+
Div 184
+
Div 185
+
Div 186
+
Div 187
+
Div 188
+
Div 189
+
Div 190
+
Div 191
+
Div 192
+
Div 193
+
Div 194
+
Div 195
+
Div 196
+
Div 197
+
Div 198
+
Div 199
+
Div 200
+
Div 201
+
Div 202
+
Div 203
+
Div 204
+
Div 205
+
Div 206
+
Div 207
+
Div 208
+
Div 209
+
Div 210
+
Div 211
+
Div 212
+
Div 213
+
Div 214
+
Div 215
+
Div 216
+
Div 217
+
Div 218
+
Div 219
+
Div 220
+
Div 221
+
Div 222
+
Div 223
+
Div 224
+
Div 225
+
Div 226
+
Div 227
+
Div 228
+
Div 229
+
Div 230
+
Div 231
+
Div 232
+
Div 233
+
Div 234
+
Div 235
+
Div 236
+
Div 237
+
Div 238
+
Div 239
+
Div 240
+
Div 241
+
Div 242
+
Div 243
+
Div 244
+
Div 245
+
Div 246
+
Div 247
+
Div 248
+
Div 249
+
Div 250
+
Div 251
+
Div 252
+
Div 253
+
Div 254
+
Div 255
+
Div 256
+
Div 257
+
Div 258
+
Div 259
+
Div 260
+
Div 261
+
Div 262
+
Div 263
+
Div 264
+
Div 265
+
Div 266
+
Div 267
+
Div 268
+
Div 269
+
Div 270
+
Div 271
+
Div 272
+
Div 273
+
Div 274
+
Div 275
+
Div 276
+
Div 277
+
Div 278
+
Div 279
+
Div 280
+
Div 281
+
Div 282
+
Div 283
+
Div 284
+
Div 285
+
Div 286
+
Div 287
+
Div 288
+
Div 289
+
Div 290
+
Div 291
+
Div 292
+
Div 293
+
Div 294
+
Div 295
+
Div 296
+
Div 297
+
Div 298
+
Div 299
+ + + + + + + \ No newline at end of file diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_expected_200_hashes.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_expected_200_hashes.php new file mode 100644 index 0000000000..868d7ba781 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_expected_200_hashes.php @@ -0,0 +1,375 @@ + + + + + +HTML Page with 100,000 Div Elements + + +largehtmldiv – ColorMag + + +test1 +
Div 1
+
Div 2
+
Div 3
+
Div 4
+
Div 5
+
Div 6
+
Div 7
+
Div 8
+
Div 9
+
Div 10
+
Div 11
+
Div 12
+
Div 13
+
Div 14
+
Div 15
+
Div 16
+
Div 17
+
Div 18
+
Div 19
+
Div 20
+
Div 21
+
Div 22
+
Div 23
+
Div 24
+
Div 25
+
Div 26
+
Div 27
+
Div 28
+
Div 29
+
Div 30
+
Div 31
+
Div 32
+
Div 33
+
Div 34
+
Div 35
+
Div 36
+
Div 37
+
Div 38
+
Div 39
+
Div 40
+
Div 41
+
Div 42
+
Div 43
+
Div 44
+
Div 45
+
Div 46
+
Div 47
+
Div 48
+
Div 49
+
Div 50
+
Div 51
+
Div 52
+
Div 53
+
Div 54
+
Div 55
+
Div 56
+
Div 57
+
Div 58
+
Div 59
+
Div 60
+
Div 61
+
Div 62
+
Div 63
+
Div 64
+
Div 65
+
Div 66
+
Div 67
+
Div 68
+
Div 69
+
Div 70
+
Div 71
+
Div 72
+
Div 73
+
Div 74
+
Div 75
+
Div 76
+
Div 77
+
Div 78
+
Div 79
+
Div 80
+
Div 81
+
Div 82
+
Div 83
+
Div 84
+
Div 85
+
Div 86
+
Div 87
+
Div 88
+
Div 89
+
Div 90
+
Div 91
+
Div 92
+
Div 93
+
Div 94
+
Div 95
+
Div 96
+
Div 97
+
Div 98
+
Div 99
+
Div 100
+
Div 101
+
Div 102
+
Div 103
+
Div 104
+
Div 105
+
Div 106
+
Div 107
+
Div 108
+
Div 109
+
Div 110
+
Div 111
+
Div 112
+
Div 113
+
Div 114
+
Div 115
+
Div 116
+
Div 117
+
Div 118
+
Div 119
+
Div 120
+
Div 121
+
Div 122
+
Div 123
+
Div 124
+
Div 125
+
Div 126
+
Div 127
+
Div 128
+
Div 129
+
Div 130
+
Div 131
+
Div 132
+
Div 133
+
Div 134
+
Div 135
+
Div 136
+
Div 137
+
Div 138
+
Div 139
+
Div 140
+
Div 141
+
Div 142
+
Div 143
+
Div 144
+
Div 145
+
Div 146
+
Div 147
+
Div 148
+
Div 149
+
Div 150
+
Div 151
+
Div 152
+
Div 153
+
Div 154
+
Div 155
+
Div 156
+
Div 157
+
Div 158
+
Div 159
+
Div 160
+
Div 161
+
Div 162
+
Div 163
+
Div 164
+
Div 165
+
Div 166
+
Div 167
+
Div 168
+
Div 169
+
Div 170
+
Div 171
+
Div 172
+
Div 173
+
Div 174
+
Div 175
+
Div 176
+
Div 177
+
Div 178
+
Div 179
+
Div 180
+
Div 181
+
Div 182
+
Div 183
+
Div 184
+
Div 185
+
Div 186
+
Div 187
+
Div 188
+
Div 189
+
Div 190
+
Div 191
+
Div 192
+
Div 193
+
Div 194
+
Div 195
+
Div 196
+
Div 197
+
Div 198
+
Div 199
+
Div 200
+
Div 201
+
Div 202
+
Div 203
+
Div 204
+
Div 205
+
Div 206
+
Div 207
+
Div 208
+
Div 209
+
Div 210
+
Div 211
+
Div 212
+
Div 213
+
Div 214
+
Div 215
+
Div 216
+
Div 217
+
Div 218
+
Div 219
+
Div 220
+
Div 221
+
Div 222
+
Div 223
+
Div 224
+
Div 225
+
Div 226
+
Div 227
+
Div 228
+
Div 229
+
Div 230
+
Div 231
+
Div 232
+
Div 233
+
Div 234
+
Div 235
+
Div 236
+
Div 237
+
Div 238
+
Div 239
+
Div 240
+
Div 241
+
Div 242
+
Div 243
+
Div 244
+
Div 245
+
Div 246
+
Div 247
+
Div 248
+
Div 249
+
Div 250
+
Div 251
+
Div 252
+
Div 253
+
Div 254
+
Div 255
+
Div 256
+
Div 257
+
Div 258
+
Div 259
+
Div 260
+
Div 261
+
Div 262
+
Div 263
+
Div 264
+
Div 265
+
Div 266
+
Div 267
+
Div 268
+
Div 269
+
Div 270
+
Div 271
+
Div 272
+
Div 273
+
Div 274
+
Div 275
+
Div 276
+
Div 277
+
Div 278
+
Div 279
+
Div 280
+
Div 281
+
Div 282
+
Div 283
+
Div 284
+
Div 285
+
Div 286
+
Div 287
+
Div 288
+
Div 289
+
Div 290
+
Div 291
+
Div 292
+
Div 293
+
Div 294
+
Div 295
+
Div 296
+
Div 297
+
Div 298
+
Div 299
+ + + + + + + \ No newline at end of file diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_original.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_original.php new file mode 100644 index 0000000000..60eaa7f71d --- /dev/null +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/long_original.php @@ -0,0 +1,375 @@ + + + + + +HTML Page with 100,000 Div Elements + + +largehtmldiv – ColorMag + + +test1 +
Div 1
+
Div 2
+
Div 3
+
Div 4
+
Div 5
+
Div 6
+
Div 7
+
Div 8
+
Div 9
+
Div 10
+
Div 11
+
Div 12
+
Div 13
+
Div 14
+
Div 15
+
Div 16
+
Div 17
+
Div 18
+
Div 19
+
Div 20
+
Div 21
+
Div 22
+
Div 23
+
Div 24
+
Div 25
+
Div 26
+
Div 27
+
Div 28
+
Div 29
+
Div 30
+
Div 31
+
Div 32
+
Div 33
+
Div 34
+
Div 35
+
Div 36
+
Div 37
+
Div 38
+
Div 39
+
Div 40
+
Div 41
+
Div 42
+
Div 43
+
Div 44
+
Div 45
+
Div 46
+
Div 47
+
Div 48
+
Div 49
+
Div 50
+
Div 51
+
Div 52
+
Div 53
+
Div 54
+
Div 55
+
Div 56
+
Div 57
+
Div 58
+
Div 59
+
Div 60
+
Div 61
+
Div 62
+
Div 63
+
Div 64
+
Div 65
+
Div 66
+
Div 67
+
Div 68
+
Div 69
+
Div 70
+
Div 71
+
Div 72
+
Div 73
+
Div 74
+
Div 75
+
Div 76
+
Div 77
+
Div 78
+
Div 79
+
Div 80
+
Div 81
+
Div 82
+
Div 83
+
Div 84
+
Div 85
+
Div 86
+
Div 87
+
Div 88
+
Div 89
+
Div 90
+
Div 91
+
Div 92
+
Div 93
+
Div 94
+
Div 95
+
Div 96
+
Div 97
+
Div 98
+
Div 99
+
Div 100
+
Div 101
+
Div 102
+
Div 103
+
Div 104
+
Div 105
+
Div 106
+
Div 107
+
Div 108
+
Div 109
+
Div 110
+
Div 111
+
Div 112
+
Div 113
+
Div 114
+
Div 115
+
Div 116
+
Div 117
+
Div 118
+
Div 119
+
Div 120
+
Div 121
+
Div 122
+
Div 123
+
Div 124
+
Div 125
+
Div 126
+
Div 127
+
Div 128
+
Div 129
+
Div 130
+
Div 131
+
Div 132
+
Div 133
+
Div 134
+
Div 135
+
Div 136
+
Div 137
+
Div 138
+
Div 139
+
Div 140
+
Div 141
+
Div 142
+
Div 143
+
Div 144
+
Div 145
+
Div 146
+
Div 147
+
Div 148
+
Div 149
+
Div 150
+
Div 151
+
Div 152
+
Div 153
+
Div 154
+
Div 155
+
Div 156
+
Div 157
+
Div 158
+
Div 159
+
Div 160
+
Div 161
+
Div 162
+
Div 163
+
Div 164
+
Div 165
+
Div 166
+
Div 167
+
Div 168
+
Div 169
+
Div 170
+
Div 171
+
Div 172
+
Div 173
+
Div 174
+
Div 175
+
Div 176
+
Div 177
+
Div 178
+
Div 179
+
Div 180
+
Div 181
+
Div 182
+
Div 183
+
Div 184
+
Div 185
+
Div 186
+
Div 187
+
Div 188
+
Div 189
+
Div 190
+
Div 191
+
Div 192
+
Div 193
+
Div 194
+
Div 195
+
Div 196
+
Div 197
+
Div 198
+
Div 199
+
Div 200
+
Div 201
+
Div 202
+
Div 203
+
Div 204
+
Div 205
+
Div 206
+
Div 207
+
Div 208
+
Div 209
+
Div 210
+
Div 211
+
Div 212
+
Div 213
+
Div 214
+
Div 215
+
Div 216
+
Div 217
+
Div 218
+
Div 219
+
Div 220
+
Div 221
+
Div 222
+
Div 223
+
Div 224
+
Div 225
+
Div 226
+
Div 227
+
Div 228
+
Div 229
+
Div 230
+
Div 231
+
Div 232
+
Div 233
+
Div 234
+
Div 235
+
Div 236
+
Div 237
+
Div 238
+
Div 239
+
Div 240
+
Div 241
+
Div 242
+
Div 243
+
Div 244
+
Div 245
+
Div 246
+
Div 247
+
Div 248
+
Div 249
+
Div 250
+
Div 251
+
Div 252
+
Div 253
+
Div 254
+
Div 255
+
Div 256
+
Div 257
+
Div 258
+
Div 259
+
Div 260
+
Div 261
+
Div 262
+
Div 263
+
Div 264
+
Div 265
+
Div 266
+
Div 267
+
Div 268
+
Div 269
+
Div 270
+
Div 271
+
Div 272
+
Div 273
+
Div 274
+
Div 275
+
Div 276
+
Div 277
+
Div 278
+
Div 279
+
Div 280
+
Div 281
+
Div 282
+
Div 283
+
Div 284
+
Div 285
+
Div 286
+
Div 287
+
Div 288
+
Div 289
+
Div 290
+
Div 291
+
Div 292
+
Div 293
+
Div 294
+
Div 295
+
Div 296
+
Div 297
+
Div 298
+
Div 299
+ + + + + + + \ No newline at end of file diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php index be2346dbb0..459f98ab23 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php @@ -45,7 +45,7 @@
-
+
This is a class with margin-top set to 3000px
diff --git a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php index 7286fa3f0e..412f15a940 100644 --- a/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php +++ b/tests/Integration/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes.php @@ -10,6 +10,8 @@ * @group PerformanceHints */ class Test_AddHashes extends TestCase { + private $max_hashes; + public static function set_up_before_class() { parent::set_up_before_class(); @@ -26,12 +28,14 @@ public static function tear_down_after_class() { public function set_up() { parent::set_up(); + $this->max_hashes = null; $this->unregisterAllCallbacksExcept( 'rocket_performance_hints_buffer', 'add_hashes', 16 ); } public function tear_down() { $this->restoreWpHook( 'rocket_performance_hints_buffer' ); remove_filter( 'rocket_lrc_optimization', '__return_false' ); + remove_filter( 'rocket_lrc_max_hashes', [ $this, 'set_lrc_max_hashes' ] ); parent::tear_down(); } @@ -44,9 +48,19 @@ public function testShouldWorkAsExpected( $config, $expected ) { add_filter( 'rocket_lrc_optimization', '__return_true' ); + if ( isset( $config['max_hashes'] ) ) { + $this->max_hashes = $config['max_hashes']; + add_filter( 'rocket_lrc_max_hashes', [ $this, 'set_lrc_max_hashes' ] ); + } + + $this->assertSame( $expected['html'], apply_filters( 'rocket_performance_hints_buffer', $config['html'] ) ); } + + public function set_lrc_max_hashes() { + return $this->max_hashes; + } } From 7b6b03ea00d1d98344b1e5bddaf980dc410ef83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Wed, 11 Sep 2024 09:47:35 -0400 Subject: [PATCH 154/192] update with new strings from 3.17 --- languages/rocket.pot | 934 ++++++++++++++++++++++--------------------- 1 file changed, 472 insertions(+), 462 deletions(-) diff --git a/languages/rocket.pot b/languages/rocket.pot index d1a6ee8b7e..813305295f 100644 --- a/languages/rocket.pot +++ b/languages/rocket.pot @@ -2,16 +2,16 @@ # This file is distributed under the same license as the WP Rocket plugin. msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha2\n" -"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" -"Last-Translator: WP Media (http://wp-rocket.me/)\n" -"Language-Team: WP Media (http://www.transifex.com/projects/p/wp-media/) \n" +"Project-Id-Version: WP Rocket 3.17-alpha3\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" +"POT-Creation-Date: 2024-09-11T13:45:18+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.7.1\n" +"X-Generator: WP-CLI 2.4.0\n" "X-Domain: rocket\n" #. Plugin Name of the plugin @@ -45,10 +45,10 @@ msgstr "" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 #: inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "Your site is hosted on %s, we have enabled Varnish auto-purge for compatibility." msgstr "" @@ -175,45 +175,35 @@ msgstr "" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to previous settings:" msgstr "" -#: inc/Addon/Cloudflare/Subscriber.php:661 +#: inc/Addon/Cloudflare/Subscriber.php:632 #: inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " @@ -319,7 +309,7 @@ msgstr "" #: inc/admin/admin.php:96 #: inc/admin/admin.php:117 #: inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "" @@ -352,19 +342,19 @@ msgid "Settings imported and saved." msgstr "" #: inc/admin/options.php:102 -#: inc/Engine/Admin/Settings/Page.php:571 +#: inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "" #: inc/admin/options.php:103 -#: inc/Engine/Admin/Settings/Page.php:725 +#: inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "" #: inc/admin/options.php:104 -#: inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "" @@ -377,22 +367,22 @@ msgid "Excluded Delay JavaScript Files" msgstr "" #: inc/admin/options.php:107 -#: inc/Engine/Admin/Settings/Page.php:1229 +#: inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "" #: inc/admin/options.php:108 -#: inc/Engine/Admin/Settings/Page.php:1243 +#: inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "" #: inc/admin/options.php:109 -#: inc/Engine/Admin/Settings/Page.php:1249 +#: inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "" #: inc/admin/options.php:110 -#: inc/Engine/Admin/Settings/Page.php:1530 +#: inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "" @@ -415,7 +405,7 @@ msgstr "" #: inc/admin/ui/notices.php:671 #: inc/common/admin-bar.php:91 #: inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 +#: views/settings/page-sections/dashboard.php:167 msgid "Clear cache" msgstr "" @@ -541,17 +531,15 @@ msgid "%s: User cache cleared." msgstr "" #: inc/admin/ui/notices.php:662 -#: inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 +#: inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 #: views/settings/page-sections/dashboard.php:46 msgid "Dismiss this notice" msgstr "" #: inc/admin/ui/notices.php:682 -#: inc/Engine/Saas/Admin/AdminBar.php:84 -#: inc/Engine/Saas/Admin/AdminBar.php:202 msgid "Clear Used CSS" msgstr "" @@ -619,8 +607,8 @@ msgstr "" #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 #: inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "" @@ -638,7 +626,7 @@ msgstr "" #: inc/common/admin-bar.php:91 #: inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 +#: views/settings/page-sections/dashboard.php:167 msgid "Clear and preload cache" msgstr "" @@ -670,7 +658,7 @@ msgid "Documentation" msgstr "" #: inc/deprecated/3.2.php:52 -#: views/settings/page-sections/imagify.php:36 +#: views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "" @@ -776,7 +764,7 @@ msgstr "" #. translators: 1 and 3 are link openings, 2 is a link closing. #: inc/deprecated/3.11.php:279 -#: inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "" @@ -856,7 +844,7 @@ msgid "Choose a file from your computer (maximum size: %s)" msgstr "" #: inc/deprecated/deprecated.php:1294 -#: inc/Engine/Admin/Settings/Render.php:422 +#: inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "" @@ -952,8 +940,8 @@ msgid "Static Files" msgstr "" #: inc/deprecated/deprecated.php:1773 -#: inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "" @@ -963,23 +951,23 @@ msgid "Advanced" msgstr "" #: inc/deprecated/deprecated.php:1775 -#: inc/Engine/Admin/Settings/Page.php:1345 +#: inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "" #: inc/deprecated/deprecated.php:1776 -#: inc/Engine/Admin/Settings/Page.php:1051 +#: inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "" #: inc/deprecated/deprecated.php:1789 -#: inc/Engine/Admin/Settings/Page.php:357 +#: inc/Engine/Admin/Settings/Page.php:368 #: views/settings/page-sections/dashboard.php:80 msgid "License" msgstr "" @@ -1006,27 +994,27 @@ msgid "weekly" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "" @@ -1068,937 +1056,909 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "" +#: inc/Engine/Admin/Settings/Page.php:278 #: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 #: inc/functions/admin.php:550 msgid "Unavailable" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:435 -#: views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "I agree to share anonymous data with the development team to help improve WP Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "%1$s Minification is currently activated in Autoptimize. If you want to use %2$s’s minification, disable this option in Autoptimize." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "%1$s Minification is currently activated in Autoptimize. If you want to use %2$s’s minification, disable those options in Autoptimize." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "If you have problems after activating this option, copy and paste the default exclusions to quickly resolve issues:" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "Also, please check our %1$sdocumentation%2$s for a list of compatibility exclusions." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "Internal scripts are excluded by default to prevent issues. Remove them to take full advantage of this option." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "If you notice any errors on your website after having activated this setting, just deactivate it again, and your site will be back to normal." -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "Internal: The domain part of the URL will be stripped automatically. Use (.*).css wildcards to exclude all CSS files located at a specific path." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "3rd Party: Use either the full URL path or only the domain name, to exclude external CSS. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "Optimize CSS delivery eliminates render-blocking CSS on your website. Only one method can be selected. Remove Unused CSS is recommended for optimal performance, but limited only to the users with active license." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "Optimize CSS delivery eliminates render-blocking CSS on your website. Only one method can be selected. Remove Unused CSS is recommended for optimal performance." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "Optimize CSS Delivery features are disabled on local environments. %1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "Removes unused CSS per page and helps to reduce page size and HTTP requests. Recommended for best performance. Test thoroughly! %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "If you notice any errors on your website after having activated this setting, just deactivate it again, and your site will be back to normal." +msgstr "" + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "Specify CSS filenames, IDs or classes that should not be removed (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "Load CSS asynchronously is currently handled by the %1$s plugin. If you want to use WP Rocket’s load CSS asynchronously option, disable the %1$s plugin." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "Provides a fallback if auto-generated critical path CSS is incomplete. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "Combine JavaScript files combines your site’s internal, 3rd party and inline JS reducing HTTP requests. Not recommended if your site uses HTTP/2. %1$sMore info%2$s" msgstr "" -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "For compatibility and best results, this option is disabled when delay javascript execution is enabled." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "Specify patterns of inline JavaScript to be excluded from concatenation (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "Specify URLs of JavaScript files to be excluded from minification and concatenation (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "Internal: The domain part of the URL will be stripped automatically. Use (.*).js wildcards to exclude all JS files located at a specific path." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "3rd Party: Use either the full URL path or only the domain name, to exclude external JS. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "Load JavaScript deferred eliminates render-blocking JS on your site and can improve load time. %1$sMore info%2$s" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "Specify URLs or keywords of JavaScript files to be excluded from defer (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "Improves performance by delaying the loading of JavaScript files until user interaction (e.g. scroll, click). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "When using the Delay JavaScript Execution, you might experience delay loading elements located in the viewport that need to appear immediately - e.g. slider, header, menu." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "If you need instant visibility, click below on files that should NOT be delayed. This selection will help users interact with the elements straight away." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "Specify URLs or keywords that can identify inline or JavaScript files to be excluded from delaying execution (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "It can improve actual and perceived loading time as images, iframes, and videos will be loaded only as they enter (or about to enter) the viewport and reduces the number of HTTP requests. %1$sMore Info%2$s" msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s LazyLoad, disable this option in %2$s." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "Add missing width and height attributes to images. Helps prevent layout shifts and improve the reading experience for your visitors. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "LazyLoad for images is currently activated in %2$s. If you want to use %1$s’s LazyLoad, disable this option in %2$s." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "This can significantly improve your loading time if you have a lot of YouTube videos on a page." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from the image or iframe code to be excluded (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "When you enable preloading WP Rocket will automatically detect your sitemaps and save all URLs to the database. The plugin will make sure that your cache is always preloaded." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "Link preloading improves the perceived load time by downloading a page when a user hovers over the link. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "DNS prefetching can make external files load faster, especially on mobile networks" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "Improves performance by helping browsers discover fonts in CSS files. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "Specify URLs to be excluded from the preload feature (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "Specify external hosts to be prefetched (no http:, one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "Specify urls of the font files to be preloaded (one per line). Fonts must be hosted on your own domain, or the domain you have specified on the CDN tab." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "The domain part of the URL will be stripped automatically.
Allowed font extensions: otf, ttf, svg, woff, woff2." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "
Cart, checkout and \"my account\" pages set in %1$s%2$s%3$s will be detected and never cached by default." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "Cache files older than the specified lifespan will be deleted.
Enable %1$spreloading%2$s for the cache to be rebuilt automatically after lifespan expiration." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "%1$sCache for query strings%2$s enables you to force caching for specific GET parameters." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "Reduce lifespan to 10 hours or less if you notice issues that seem to appear periodically. %1$sWhy?%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "The domain part of the URL will be stripped automatically.
Use (.*) wildcards to address multiple URLs under a given path." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "Specify full or partial IDs of cookies that, when set in the visitor's browser, should prevent a page from getting cached (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "Specify user agent strings that should never see cached pages (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "Specify URLs you always want purged from cache whenever you update any post or page (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "Post revisions and drafts will be permanently deleted. Do not use this option if you need to retain revisions or drafts." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "Transients are temporary options; they are safe to remove. They will be automatically regenerated as your plugins require them." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s) you provide." msgstr "" #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "Not required for services like Cloudflare and Sucuri. Please see our available %1$sAdd-ons%2$s." msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings is not required for %2$l to work on your site." msgid_plural "%1$s%2$l Add-ons%3$s are currently enabled. Configuration of the CDN settings is not required for %2$l to work on your site." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "The domain part of the URL will be stripped automatically.
Use (.*) wildcards to exclude all files of a given file type located at a specific path." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "Reducing or disabling the Heartbeat API’s activity can help save some of your server’s resources." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "Reducing activity will change Heartbeat frequency from one hit each minute to one hit every 2 minutes." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "One-Click Add-ons are features extending available options without configuration needed. Switch the option \"on\" to enable from this screen." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "If you need to create a dedicated set of cache files for each logged-in WordPress user, you must activate this add-on." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "User cache is great when you have user-specific or restricted content on your website.
%1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "Provide your account email, global API key, and domain to use options such as clearing the Cloudflare cache and enabling optimal settings with WP Rocket." msgstr "" #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just activate the official Cloudflare plugin and configure it. WP Rocket will automatically enable compatibility." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "Varnish cache will be purged each time WP Rocket clears its cache to ensure content is always up-to-date.
%1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "" #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "Enable this option if you would like WP Rocket to serve WebP images to compatible browsers. Please note that WP Rocket cannot create WebP images for you. To create WebP images we recommend %1$sImagify%2$s. %3$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "Temporarily activate development mode on your website. This setting will automatically turn off after 3 hours. %1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "Automatically enhances your Cloudflare configuration for speed, performance grade and compatibility." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "Should only be used with Cloudflare's flexible SSL feature. URLs of static files (CSS, JS, images) will be rewritten to use // instead of http:// or https://." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "Firewall API key (for plugin), must be in format {32 characters}/{32 characters}:" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "" -#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: option a tag, %5$s: opening a tag. -#: inc/Engine/Admin/Settings/Page.php:2295 -msgid "%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our brand new feature %3$sOptimize critical images%5$s is automatically activated now! Also, the Cache tab was removed but the existing features will remain working, %4$ssee more here%5$s." +#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 +msgid "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New feature: %3$sLazy Render Content%4$s. Check out our documentation to learn more about it." msgstr "" #: inc/Engine/Admin/Settings/Settings.php:361 @@ -2009,25 +1969,25 @@ msgstr "" msgid "Sorry! Adding /(.*) in Advanced Rules > Never Cache URL(s) was not saved because it disables caching and optimizations for every page on your site." msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:172 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:198 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:216 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "" @@ -2035,49 +1995,49 @@ msgstr "" msgid "WP Rocket Expired Cache Interval" msgstr "" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "The WP_CACHE constant needs to be set to true for WP Rocket cache to work properly" msgstr "" -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "" #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "" #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2133,64 +2093,64 @@ msgid "RocketCDN disabled" msgstr "" #. Translators: %s = date formatted using date_i18n() and get_option( 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "High performance Content Delivery Network (CDN) with %1$sunlimited bandwidth%2$s" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in our plugin" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "*$%1$s/month for 12 months then $%2$s/month. You can cancel your subscription at any time." msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "" @@ -2202,6 +2162,18 @@ msgstr "" msgid "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network!" msgstr "" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "" + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "" + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "" + #: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "" @@ -2214,11 +2186,49 @@ msgstr "" msgid "WP Rocket process on submit jobs" msgstr "" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Performance Hints data" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Performance Hints data of this URL" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Performance Hints" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +msgid "Clear" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "This action will clear data for Optimize Critical Images and Lazy Render Content." +msgstr "" + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "" + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "" @@ -2245,7 +2255,6 @@ msgstr "" msgid "Publish the %s" msgstr "" -#. translators: %s = post type. #: inc/Engine/CriticalPath/Admin/Post.php:223 msgid "Enable Load CSS asynchronously in WP Rocket settings" msgstr "" @@ -2260,40 +2269,40 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "Critical CSS for %1$s on mobile not generated. Error: The API returned an empty response." msgstr "" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "Critical CSS for %1$s not generated. Error: The API returned an empty response." msgstr "" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "" #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "" #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "Critical CSS for %1$s on mobile not generated. Error: The API returned an invalid response code." msgstr "" #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "Critical CSS for %1$s not generated. Error: The API returned an invalid response code." msgstr "" #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "" @@ -2360,36 +2369,36 @@ msgid "Critical CSS file cannot be deleted" msgstr "" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "" -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" @@ -2485,112 +2494,112 @@ msgid "Unlimited" msgstr "" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "You can no longer use the Remove Unused CSS or Load CSS asynchronously options." msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, which addresses a PageSpeed Insights recommendation and improves your page performance." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "The Remove Unused CSS and Load CSS asynchronously features are great options to address the PageSpeed Insights recommendations and improve your website performance." msgstr "" #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "Your website could be much faster if it could take advantage of our %1$snew features and enhancements%2$s. 🚀" msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access to product updates and support." msgstr "" -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "You can use WP Rocket on more websites by upgrading your license. To upgrade, simply pay the %1$sprice difference%2$s between your current and new licenses, as shown below." msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "" @@ -2598,19 +2607,6 @@ msgstr "" msgid "You can use WP Rocket on more websites by upgrading your license (you will only pay the price difference between your current and new licenses)." msgstr "" -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 -msgid "Script error" -msgstr "" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 -msgid "Script timeout" -msgstr "" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "" @@ -2623,15 +2619,15 @@ msgstr "" msgid "LazyLoad CSS backgrounds" msgstr "" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "" @@ -2675,9 +2671,14 @@ msgstr "" msgid "Minify CSS" msgstr "" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Remove Unused CSS" +msgstr "" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 -msgid "%1$s: Could not create the %2$s table in the database which is necessary for the Remove Unused CSS feature to work. Please reach out to %3$sour support%4$s." +msgid "%1$s: Could not create the %2$s table in the database which is necessary for the Remove Unused CSS feature to work. Please check our %3$sdocumentation%4$s." msgstr "" #. translators: %1$s = plugin name. @@ -2686,7 +2687,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "%1$s: The preload service is now active. After the initial preload it will continue to cache all your pages whenever they are purged. No further action is needed." msgstr "" @@ -2698,68 +2699,56 @@ msgstr "" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "" -#: inc/Engine/Saas/Admin/AdminBar.php:77 -#: inc/Engine/Saas/Admin/AdminBar.php:198 -msgid "Clear Critical Images" -msgstr "" - -#: inc/Engine/Saas/Admin/AdminBar.php:164 -msgid "Clear Critical Images of this URL" +#: inc/Engine/Saas/Admin/AdminBar.php:51 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +msgid "Clear RUCSS optimizations" msgstr "" -#: inc/Engine/Saas/Admin/AdminBar.php:167 -msgid "Clear Used CSS of this URL" -msgstr "" - -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Critical Images Cache" -msgstr "" - -#: inc/Engine/Saas/Admin/AdminBar.php:201 -msgid "Remove Used CSS Cache" +#: inc/Engine/Saas/Admin/AdminBar.php:106 +msgid "Clear RUCSS optimizations of this URL" msgstr "" #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing your pages, the plugin is optimizing LCP and the images above the fold." msgstr "" #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." msgstr "" #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:180 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" -#: inc/Engine/Saas/Admin/Notices.php:246 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "We couldn't generate the used CSS because you're using a nulled version of WP Rocket. You need an active license to use the Remove Unused CSS feature and further improve your website's performance." msgstr "" #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:249 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:302 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "It seems a security plugin or the server's firewall prevents WP Rocket from accessing the SaaS features. IPs listed %1$shere in our documentation%2$s should be added to your allowlists:" msgstr "" -#: inc/Engine/Saas/Admin/Notices.php:307 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "" -#: inc/Engine/Saas/Admin/Notices.php:308 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "" @@ -3017,31 +3006,31 @@ msgstr[0] "" msgstr[1] "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP compression%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser caching%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile optimization%3$s" msgstr "" @@ -3253,7 +3242,6 @@ msgstr "" msgid "Purges RocketCDN cached resources for your website. %s" msgstr "" -#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:63 #: views/settings/page-sections/cloudflare.php:36 #: views/settings/page-sections/sucuri.php:37 @@ -3290,7 +3278,6 @@ msgstr "" msgid "Purges cached resources for your website. %s" msgstr "" -#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:36 msgid "https://support.cloudflare.com/hc/en-us/articles/200169246" msgstr "" @@ -3343,32 +3330,42 @@ msgstr "" msgid "View my account" msgstr "" -#: views/settings/page-sections/dashboard.php:137 +#: views/settings/page-sections/dashboard.php:130 +#: views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "" + +#. translators: %1$s = opening tag, %2$s = closing tag. +#: views/settings/page-sections/dashboard.php:136 +msgid "I agree to share anonymous data with the development team to help improve WP Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" + +#: views/settings/page-sections/dashboard.php:154 msgid "Quick Actions" msgstr "" -#: views/settings/page-sections/dashboard.php:144 +#: views/settings/page-sections/dashboard.php:161 msgid "Remove all cached files" msgstr "" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:181 +#: views/settings/page-sections/dashboard.php:187 msgid "Regenerate Critical CSS" msgstr "" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:213 msgid "Frequently Asked Questions" msgstr "" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:227 msgid "Still cannot find a solution?" msgstr "" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:228 msgid "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:236 msgid "Ask support" msgstr "" @@ -3384,32 +3381,45 @@ msgstr "" msgid "Save Changes and Optimize" msgstr "" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 -msgid "%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image optimization.%2$s" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 +msgid "%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" +msgstr "" + +#: views/settings/page-sections/imagify.php:28 +msgid "Images can account for 50% of your loading time!" msgstr "" -#: views/settings/page-sections/imagify.php:24 -msgid "Compress image to make your website faster, all while maintaining image quality." +#: views/settings/page-sections/imagify.php:31 +msgid "Imagify automatically optimizes all your images, helping your website gain precious seconds while saving you time. With just one click, it resizes, compresses, and converts your images to WebP and AVIF formats without sacrificing quality." msgstr "" -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" msgstr "" -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" msgstr "" -#: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" msgstr "" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" msgstr "" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "" From 05360d212d5648b3ec9bff389e2c79834fd072a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Perona?= Date: Wed, 11 Sep 2024 09:57:40 -0400 Subject: [PATCH 155/192] update test --- .../Subscriber/add_hashes_when_allowed.php | 2 +- .../Subscriber/html/expected_allowed.php | 65 ------------------- 2 files changed, 1 insertion(+), 66 deletions(-) delete mode 100644 tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected_allowed.php diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php index 6575257283..6a3ce9ca9a 100644 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php +++ b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/add_hashes_when_allowed.php @@ -43,7 +43,7 @@ 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/original.php' ), ], 'expected' => [ - 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected_allowed.php' ), + 'html' => file_get_contents( WP_ROCKET_TESTS_FIXTURES_DIR . '/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected.php' ), ], ], ], diff --git a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected_allowed.php b/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected_allowed.php deleted file mode 100644 index e71f80955c..0000000000 --- a/tests/Fixtures/inc/Engine/Optimization/LazyRenderContent/Frontend/Subscriber/html/expected_allowed.php +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - -
400px -
800 px -































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































- 1800 px
Testing something
-
-
- -
-
-
-
- This is a class with margin-top set to 3000px -
-
-
-
- -
-
-
- This is a class with margin-top set to 1800px -
-
-
- -
- Somethign fishy going on. -
- - From cc35e33d81ff3d0dd6a851d487413ffb4dd9b134 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:41:53 +0000 Subject: [PATCH 156/192] Translate languages/rocket.pot in tr_TR 100% translated source file: 'languages/rocket.pot' on 'tr_TR'. --- languages/rocket-tr_TR.po | 1004 +++++++++++++++++++------------------ 1 file changed, 510 insertions(+), 494 deletions(-) diff --git a/languages/rocket-tr_TR.po b/languages/rocket-tr_TR.po index d7361fe653..2ed8056ad6 100644 --- a/languages/rocket-tr_TR.po +++ b/languages/rocket-tr_TR.po @@ -8,9 +8,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha2\n" -"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" -"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" +"Project-Id-Version: WP Rocket 3.17-alpha3\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" +"POT-Creation-Date: 2024-09-11T13:45:18+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: BouRock, 2024\n" "Language-Team: Turkish (Turkey) (https://app.transifex.com/wp-media/teams/18133/tr_TR/)\n" @@ -20,7 +20,7 @@ msgstr "" "Language: tr_TR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.7.1\n" +"X-Generator: WP-CLI 2.4.0\n" #. Plugin Name of the plugin msgid "WP Rocket" @@ -51,9 +51,9 @@ msgstr "https://wp-media.me" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "" "Your site is hosted on %s, we have enabled Varnish auto-purge for " @@ -184,41 +184,31 @@ msgstr "Cloudflare önbellek seviyesi %s olarak ayarlandı" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "Cloudflare küçültme hatası: %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "Cloudflare küçültme %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "Cloudflare rocket yükleyici hatası: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "Cloudflare rocket yükleyici %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "Cloudflare tarayıcı önbelleği hatası: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "Cloudflare tarayıcı önbelleği %s olarak ayarlandı" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "%1$sWP Rocket:%2$s Cloudflare için en uygun ayarlar aktif edildi:" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "" "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to " "previous settings:" @@ -226,7 +216,7 @@ msgstr "" "%1$sWP Rocket:%2$s Cloudflare için en uygun ayarlar devre dışı bırakıldı, " "önceki ayarlara geri döndürüldü:" -#: inc/Addon/Cloudflare/Subscriber.php:661 inc/admin/options.php:165 +#: inc/Addon/Cloudflare/Subscriber.php:632 inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " msgstr "WP Rocket: " @@ -381,7 +371,7 @@ msgid "Settings" msgstr "Ayarlar" #: inc/admin/admin.php:96 inc/admin/admin.php:117 inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "Bu önbelleği temizle" @@ -413,17 +403,17 @@ msgstr "Ayarları içe aktarma başarısız oldu: beklenmeyen dosya içeriği." msgid "Settings imported and saved." msgstr "Ayarlar içe aktarıldı ve kaydedildi." -#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:571 +#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "Hariç Tutulan CSS Dosyaları" -#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:725 +#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "Hariç Tutulan Satır İçi JavaScript" -#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "Hariç Tutulan JavaScript Dosyaları" @@ -435,19 +425,19 @@ msgstr "JavaScript Dosyalarını Ertele" msgid "Excluded Delay JavaScript Files" msgstr "Hariç Tutulan JavaScript Dosyalarını Geciktirme" -#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1229 +#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "Asla Önbelleklenmeyen URL(ler)" -#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1243 +#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "Asla Önbelleklenmeyen Kullanıcı Tanıtıcı(ları)sı" -#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1249 +#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "Her Zaman Temizlenen URL(ler)" -#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1530 +#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "CDN’den hariç tutulan dosyalar" @@ -468,7 +458,7 @@ msgstr "Daha fazla bilgi" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 +#: views/settings/page-sections/dashboard.php:167 msgid "Clear cache" msgstr "Önbelleği temizle" @@ -651,16 +641,15 @@ msgstr "%s: Terim önbelleği temizlendi." msgid "%s: User cache cleared." msgstr "%s: Kullanıcı önbelleği temizlendi." -#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 +#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 #: views/settings/page-sections/dashboard.php:46 msgid "Dismiss this notice" msgstr "Bu bildirimi anımsatma" -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:84 -#: inc/Engine/Saas/Admin/AdminBar.php:202 +#: inc/admin/ui/notices.php:682 msgid "Clear Used CSS" msgstr "Kullanılan CSS’yi Temizle" @@ -739,8 +728,8 @@ msgstr "%s sürümünü yeniden yükle" #: inc/classes/class-wp-rocket-requirements-check.php:203 #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "%s Güncellemesi Geri Alma" @@ -768,7 +757,7 @@ msgstr "" "working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 +#: views/settings/page-sections/dashboard.php:167 msgid "Clear and preload cache" msgstr "Önbelleği temizle ve önyükle" @@ -796,7 +785,7 @@ msgstr "RocketCDN önbelleğini temizle" msgid "Documentation" msgstr "Belgeler" -#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:36 +#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "Imagify’ı Etkinleştir" @@ -940,7 +929,7 @@ msgstr "" "Önyüklemek için seçeneği işaretleyebilirsiniz." #. translators: 1 and 3 are link openings, 2 is a link closing. -#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "" "%1$sWP Rocket’a geri dönün%2$s ya da %3$sEklentiler sayfasına gidin%2$s" @@ -1023,7 +1012,7 @@ msgstr "" msgid "Choose a file from your computer (maximum size: %s)" msgstr "Bilgisayarınızdan bir dosya seçin (en fazla boyut: %s)" -#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:422 +#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "Dosyayı gönder ve ayarları içe aktar" @@ -1106,8 +1095,8 @@ msgstr "Temel" msgid "Static Files" msgstr "Sabit Dosyalar" -#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "CDN" @@ -1116,21 +1105,21 @@ msgstr "CDN" msgid "Advanced" msgstr "Gelişmiş" -#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1345 +#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "Veritabanı" -#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1051 +#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "Önyükleme" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "Araçlar" -#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:357 +#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 #: views/settings/page-sections/dashboard.php:80 msgid "License" msgstr "Lisans" @@ -1174,27 +1163,27 @@ msgid "weekly" msgstr "haftalık" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "Düzeltmeler" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "Otomatik Taslaklar" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "Çöpe Atılmış Yazılar" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "İstenmeyen Yorumlar" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "Çöpe Atılmış Yorumlar" @@ -1247,63 +1236,46 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "WP Rocket yapılandırma dosyalarını şimdi yeniden oluştur" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "Değişiklikleri Kaydet" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "Lisansı Doğrula" -#: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 inc/functions/admin.php:550 +#: inc/Engine/Admin/Settings/Page.php:278 +#: inc/Engine/Admin/Settings/Page.php:279 inc/functions/admin.php:550 msgid "Unavailable" msgstr "Mevcut değil" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "API anahtarı" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "E-posta adresi" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "Panel" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "Yardım alın, hesap bilgisi" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "Durumum" - -#: inc/Engine/Admin/Settings/Page.php:435 views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "Rocket Çözümsel" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "" -"I agree to share anonymous data with the development team to help improve WP" -" Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" -"WP Rocket’i iyileştirmeye yardımcı olmak için geliştirme ekibiyle isimsiz " -"verileri paylaşmayı kabul ediyorum. %1$sNe tür bilgi toplayacağız?%2$s" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "Dosyaları İyileştirme" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "CSS ve JS kodlarını iyileştirin" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable this option in Autoptimize." @@ -1312,17 +1284,17 @@ msgstr "" " %2$s’in küçültmesini kullanmak istiyorsanız, Autoptimize içindeki bu " "seçeneği etkisizleştirin." -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "CSS Dosyaları" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "JavaScript Dosyaları" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable those options in Autoptimize." @@ -1331,7 +1303,7 @@ msgstr "" " %2$s’in küçültmesini kullanmak istiyorsanız, Autoptimize içindeki bu " "seçenekleri etkisizleştirin." -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "" "If you have problems after activating this option, copy and paste the " "default exclusions to quickly resolve issues:" @@ -1341,7 +1313,7 @@ msgstr "" "yapıştırın:" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "" "Also, please check our %1$sdocumentation%2$s for a list of compatibility " "exclusions." @@ -1349,7 +1321,7 @@ msgstr "" "Ayrıca, uyumluluk istisnaları listesi için lütfen %1$sbelgelerimizi%2$s " "gözden geçirin." -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "" "Internal scripts are excluded by default to prevent issues. Remove them to " "take full advantage of this option." @@ -1358,53 +1330,31 @@ msgstr "" "seçenekten tam olarak yararlanmak için bunları kaldırın." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "" "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" "Eğer bu, soruna neden olursa, %1$sburada%2$s bulunan varsayılan hariç " "tutulanları geri yükleyin" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "CSS dosyalarını küçült" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "" "CSS’yi küçültme, dosya boyutunu düşürmek için boşlukları ve açıklamaları " "kaldırır." -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "Bu birşeyleri bozabilir!" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "" -"If you notice any errors on your website after having activated this " -"setting, just deactivate it again, and your site will be back to normal." -msgstr "" -"Bu ayarı aktif ettikten sonra web sitenizde herhangi bir hata fark " -"ederseniz, sadece tekrar devre dışı bırakın, ve siteniz normale dönecektir." - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "CSS küçültmeyi aktif et" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "" "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" "Küçültmeden hariç tutulacak CSS dosyalarının URL’lerini belirtin (her satıra" " bir tane)." -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).css wildcards to exclude all CSS files located at a " @@ -1415,7 +1365,7 @@ msgstr "" "tutmak için (.*).css joker karakterlerini kullanın." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external CSS. %1$sMore info%2$s" @@ -1423,12 +1373,12 @@ msgstr "" "3. Taraf: Harici CSS dosyalarını dahil etmemek için ya URL " "tam yolunu ya da sadece etki alanı adını kullanın. %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "CSS teslimini iyileştir" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1439,7 +1389,7 @@ msgstr "" "Kullanılmayan CSS’yi Kaldır önerilir, ancak sadece aktif lisansa sahip " "kullanıcılarla sınırlıdır." -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1450,7 +1400,7 @@ msgstr "" "Kullanılmayan CSS’yi Kaldır önerilir." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "" "Optimize CSS Delivery features are disabled on local environments. %1$sLearn" " more%2$s" @@ -1458,13 +1408,12 @@ msgstr "" "CSS teslimini iyileştir özellikleri yerel ortamlarda etkisizleştirilir. " "%1$sDaha fazla bilgi edinin%2$s" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" -msgstr "Kullanılmayan CSS’yi Kaldır" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" +msgstr "Kullanılmayan CSS’yi (RUCSS) Kaldır" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "" "Removes unused CSS per page and helps to reduce page size and HTTP requests." " Recommended for best performance. Test thoroughly! %1$sMore info%2$s" @@ -1473,15 +1422,29 @@ msgstr "" "isteklerini azaltmaya yardımcı olur. Daha iyi performans için önerilir. " "İyice deneyin! %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "Bu birşeyleri bozabilir!" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "" +"If you notice any errors on your website after having activated this " +"setting, just deactivate it again, and your site will be back to normal." +msgstr "" +"Bu ayarı aktif ettikten sonra web sitenizde herhangi bir hata fark " +"ederseniz, sadece tekrar devre dışı bırakın, ve siteniz normale dönecektir." + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "Kullanılmayan CSS’yi Kaldır’ı aktif et" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "CSS güvenli listesi" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "" "Specify CSS filenames, IDs or classes that should not be removed (one per " "line)." @@ -1489,13 +1452,13 @@ msgstr "" "Kaldırılmaması gereken CSS dosya adlarını, kimliklerini veya sınıfları " "belirtin (her satıra bir tane)." -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "CSS’yi eşzamanlı olmadan yükle" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "" "Load CSS asynchronously is currently handled by the %1$s plugin. If you want" @@ -1506,19 +1469,19 @@ msgstr "" "kullanmak istiyorsanız, %1$s eklentisini etkisizleştirin." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "" "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" "Önemli Yol CSS’yi oluşturur ve CSS’yi eşzamanlı olmadan yükler. %1$sDaha " "fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "Son çare önemli CSS" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "" "Provides a fallback if auto-generated critical path CSS is incomplete. " "%1$sMore info%2$s" @@ -1526,22 +1489,18 @@ msgstr "" "Otomatik oluşturulmuş önemli yol CSS tamamlanmazsa son bir çare sağlar. " "%1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "JavaScript dosyalarını küçült" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "" "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "" "JavaScript’i küçültme, dosya boyutunu düşürmek için boşlukları ve " "açıklamaları kaldırır." -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "JavaScript küçültmeyi aktif et" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "" "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" @@ -1549,7 +1508,7 @@ msgstr "" "küçült’ü etkinleştirin)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "" "Combine JavaScript files combines your site’s internal, 3rd party and inline" " JS reducing HTTP requests. Not recommended if your site uses HTTP/2. " @@ -1559,8 +1518,7 @@ msgstr "" "JS dosyalarını birleştirir, HTTP isteklerini azaltır. Siteniz HTTP/2 " "kullanıyorsa önerilmez. %1$sDaha fazla bilgi%2$s" -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "" "For compatibility and best results, this option is disabled when delay " "javascript execution is enabled." @@ -1568,12 +1526,12 @@ msgstr "" "Uyumluluk ve en iyi sonuçlar için javascript’i geciktir yürütmesi " "etkinleştirildiğinde bu seçenek etkisizleştirilir." -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "JavaScript birleştirmeyi aktif et" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "" "Specify patterns of inline JavaScript to be excluded from concatenation (one" " per line). %1$sMore info%2$s" @@ -1581,7 +1539,7 @@ msgstr "" "Birleştirmeden hariç tutulacak satır içi JavaScript dosyalarının örneklerini" " belirtin (her satıra bir tane). %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "" "Specify URLs of JavaScript files to be excluded from minification and " "concatenation (one per line)." @@ -1589,7 +1547,7 @@ msgstr "" "Küçültmeden ve birleştirmeden hariç tutulacak JavaScript dosyalarının " "URL’lerini belirtin (her satıra bir tane)." -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).js wildcards to exclude all JS files located at a " @@ -1600,7 +1558,7 @@ msgstr "" "tutmak için (.*).js joker karakterlerini kullanın." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external JS. %1$sMore info%2$s" @@ -1608,13 +1566,13 @@ msgstr "" "3. Taraf: Harici JS dosyalarını dahil etmemek için ya URL " "tam yolunu ya da sadece etki alanı adını kullanın. %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "Ertelenmiş JavaScript yükle" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "" "Load JavaScript deferred eliminates render-blocking JS on your site and can " "improve load time. %1$sMore info%2$s" @@ -1624,7 +1582,7 @@ msgstr "" "bilgi%2$s" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "" "Specify URLs or keywords of JavaScript files to be excluded from defer (one " "per line). %1$sMore info%2$s" @@ -1633,13 +1591,13 @@ msgstr "" "anahtar kelimelerini belirtin (her satıra bir tane). %1$sDaha fazla " "bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "JavaScript’i Geciktir yürütmesi" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "" "Improves performance by delaying the loading of JavaScript files until user " "interaction (e.g. scroll, click). %1$sMore info%2$s" @@ -1647,11 +1605,11 @@ msgstr "" "JavaScript dosyalarının yüklenmesini, kullanıcı etkileşimine (örn. kaydırma," " tıklama) kadar geciktirerek performansı artırır. %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "Tek tıkla hariç tutmalar" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "" "When using the Delay JavaScript Execution, you might experience delay " "loading elements located in the viewport that need to appear immediately - " @@ -1661,7 +1619,7 @@ msgstr "" "hemen görünmesi gereken öğelerin yüklenmesinde gecikme yaşayabilirsiniz - " "örn. kaydırıcı, başlık, menü." -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "" "If you need instant visibility, click below on files that should NOT be " "delayed. This selection will help users interact with the elements straight " @@ -1671,7 +1629,7 @@ msgstr "" "dosyalara aşağıdan tıklayın. Bu seçim, kullanıcıların öğelerle hemen " "etkileşim kurmasına yardımcı olacak." -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "" "Specify URLs or keywords that can identify inline or JavaScript files to be " "excluded from delaying execution (one per line)." @@ -1680,24 +1638,24 @@ msgstr "" "dosyalarını tanımlayabilecek URL’leri veya anahtar kelimeleri belirtin (her " "satıra bir tane)." -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "Ortam" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "LazyLoad, resim boyutları" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "Otoiyileştir" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "LazyLoad" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "" "It can improve actual and perceived loading time as images, iframes, and " "videos will be loaded only as they enter (or about to enter) the viewport " @@ -1709,7 +1667,7 @@ msgstr "" "Fazla Bilgi%2$s" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "" "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s " "LazyLoad, disable this option in %2$s." @@ -1717,12 +1675,12 @@ msgstr "" "LazyLoad şu anda %2$s içinde aktif edildi. Eğer WP Rocket’in LazyLoad’ını " "kullanmak istiyorsanız, %2$s içindeki bu seçeneği etkisizleştirin." -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "Resim Boyutları" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "" "Add missing width and height attributes to images. Helps prevent layout " "shifts and improve the reading experience for your visitors. %1$sMore " @@ -1732,12 +1690,12 @@ msgstr "" "değişimlerini önlemeye ve ziyaretçileriniz için okuma deneyimini " "iyileştirmeye yardımcı olur. %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "Resimler için etkinleştir" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "" "LazyLoad for images is currently activated in %2$s. If you want to use " "%1$s’s LazyLoad, disable this option in %2$s." @@ -1746,26 +1704,26 @@ msgstr "" "LazyLoad’ını kullanmak istiyorsanız, %2$s içindeki bu seçeneği " "etkisizleştirin." -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "CSS arka plan resimleri için etkinleştir" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "Iframe’ler ve görüntüler için etkinleştir" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "Önizleme resmi ile YouTube iframe’ini değiştir" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "" "Önizleme resmi ile değiştirilen YouTube iframe’i %2$s ile uyumlu değil." #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "" "This can significantly improve your loading time if you have a lot of " "YouTube videos on a page." @@ -1773,12 +1731,12 @@ msgstr "" "Bir sayfada çok sayıda YouTube görüntüsüne sahipseniz bu önemli ölçüde " "yükleme sürenizi iyileştirebilir." -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "Hariç tutulan resimler veya iframe’ler" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "" "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from" " the image or iframe code to be excluded (one per line). %1$sMore info%2$s" @@ -1787,20 +1745,20 @@ msgstr "" "dosya adı, CSS dosya adı, CSS sınıfı, etki alanı) belirtin (her satıra bir " "tane). %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "Eksik resim boyutlarını ekle" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "Önbellek dosyalarını oluşturun, yazı tiplerini önyükleyin" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "Önbelleği Önyükle" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "" "When you enable preloading WP Rocket will automatically detect your sitemaps" " and save all URLs to the database. The plugin will make sure that your " @@ -1810,12 +1768,12 @@ msgstr "" "otomatik olarak algılayacak ve tüm URL’leri veritabanına kaydedecek. " "Eklenti, önbelleğinizin her zaman önceden yüklendiğinden emin olacak." -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "Bağlantıları Önyükle" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "" "Link preloading improves the perceived load time by downloading a page when " "a user hovers over the link. %1$sMore info%2$s" @@ -1823,11 +1781,11 @@ msgstr "" "Bağlantı önyükleme, kullanıcı bağlantının üzerine geldiğinde bir sayfa " "indirerek algılanan yükleme süresini iyileştirir. %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "DNS İsteklerini Önceden Getirme" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "" "DNS prefetching can make external files load faster, especially on mobile " "networks" @@ -1835,12 +1793,12 @@ msgstr "" "Önceden DNS getirme, harici dosyaları daha hızlı yüklemeyi sağlayabilir, " "özellikle de mobil ağlarda" -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "Yazı Tiplerini Önyükle" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "" "Improves performance by helping browsers discover fonts in CSS files. " "%1$sMore info%2$s" @@ -1848,16 +1806,16 @@ msgstr "" "Tarayıcıların CSS dosyalarındaki yazı tiplerini keşfetmelerine yardımcı " "olarak performansı artırır. %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "Önyüklemeyi aktif et" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "Hariç tutulan URL’ler" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "" "Specify URLs to be excluded from the preload feature (one per line). " "%1$sMore info%2$s" @@ -1865,11 +1823,11 @@ msgstr "" "Önyükleme özelliğinden hariç tutulacak URL’leri belirtin (her satıra bir " "tane). %1$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "Önceden gertirmek için URL’ler" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "" "Specify external hosts to be prefetched (no http:, one per " "line)" @@ -1877,11 +1835,11 @@ msgstr "" "Önceden getirilecek olan harici anamakineleri belirtin (http: " "olmadan, her satıra bir tane)" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "Önyüklenecek yazı tipleri" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "" "Specify urls of the font files to be preloaded (one per line). Fonts must be" " hosted on your own domain, or the domain you have specified on the CDN tab." @@ -1890,7 +1848,7 @@ msgstr "" "tane). Yazı tipleri kendi etki alanınızda veya CDN sekmesinde belirttiğiniz " "etki alanında barındırılmak zorundadır." -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "" "The domain part of the URL will be stripped automatically.
Allowed font " "extensions: otf, ttf, svg, woff, woff2." @@ -1898,53 +1856,53 @@ msgstr "" "URL’nin etki alanı kısmı otomatik olarak sadeleştirilecektir.
İzin " "verilen yazı tipi uzantıları: otf, ttf, svg, woff, woff2." -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "Bağlantı önyüklemeyi etkinleştir" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "Gelişmiş Kurallar" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "Önbellek kurallarına ince ayar yapın" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "" "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "" "Özel oturum açma/oturum kapatma URL’leri gibi hassas sayfalar önbellekten " "hariç tutulmalıdır." -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "WooCommerce" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "Easy Digital Downloads" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "iThemes Exchange" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "Jigoshop" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "WP-Shop" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing #. tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "" "
Cart, checkout and \"my account\" pages set in " "%1$s%2$s%3$s will be detected and never cached by default." @@ -1953,12 +1911,12 @@ msgstr "" "\"hesabım\" sayfaları algılanacak ve varsayılan olarak asla " "önbelleklenmeyecektir." -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "Önbellek Geçerlilik Süresi" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "" "Cache files older than the specified lifespan will be deleted.
Enable " "%1$spreloading%2$s for the cache to be rebuilt automatically after lifespan " @@ -1968,16 +1926,16 @@ msgstr "" "silinecektir.
Geçerlilik süresi sona erdikten sonra otomatik olarak " "yeniden oluşturulması için önbellek %1$sönyüklemeyi%2$s etkinleştirin." -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "Asla Önbelleklenmeyen Tanımlama Bilgileri" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "Önbelleklenen Sorgu Dizgi(leri)si" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "" "%1$sCache for query strings%2$s enables you to force caching for specific " "GET parameters." @@ -1985,7 +1943,7 @@ msgstr "" "%1$sSorgu dizgilerini önbelleklemek%2$s belirli GET parametreleri için " "önbelleklemeye zorlamanızı etkinleştirir." -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "" "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" @@ -1993,7 +1951,7 @@ msgstr "" "sınırsız)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "" "Reduce lifespan to 10 hours or less if you notice issues that seem to appear" " periodically. %1$sWhy?%2$s" @@ -2001,27 +1959,27 @@ msgstr "" "Eğer belirli aralıklarla görünen sorunları fark ederseniz geçerlilik " "süresini 10 saat veya daha azına düşürün. %1$sNeden?%2$s" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "Saat" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "Gün" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "" "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" "Asla önbelleklenmemesi gereken sayfa ve yazıların URL’lerini belirtin (her " "satıra bir tane)" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to address multiple URLs under a given path." @@ -2029,7 +1987,7 @@ msgstr "" "URL’nin etki alanı kısmı otomatik olarak sadeleştirilecektir.
Verilen yol" " altında çoklu URL’leri adreslemek için (.*) joker karakterlerini kullanın." -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "" "Specify full or partial IDs of cookies that, when set in the visitor's " "browser, should prevent a page from getting cached (one per line)" @@ -2038,20 +1996,20 @@ msgstr "" "engel olması gereken, tanımlama bilgilerinin tam ya da kısmi kimliklerini " "belirtin (satır başına bir tane)" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "" "Specify user agent strings that should never see cached pages (one per line)" msgstr "" "Önbelleklenmiş sayfaları asla görmemesi gereken kullanıcı tanıtıcı dizgisini" " belirtin (her satıra bir tane)" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "" "UA dizgilerinin parçalarını algılamak için (.*) joker karakterlerini " "kullanın." -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "" "Specify URLs you always want purged from cache whenever you update any post " "or page (one per line)" @@ -2059,19 +2017,19 @@ msgstr "" "Herhangi bir yazıyı veya sayfayı her güncellediğinizde daima önbellekten " "temizlenmesini istediğiniz URL’leri belirtin (her satıra bir tane)" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "Önbellekleme için sorgu dizgilerini belirtin (her satıra bir tane)" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "İyileştirin, şişmeyi azaltın" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "Yazı Temizleme" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "" "Post revisions and drafts will be permanently deleted. Do not use this " "option if you need to retain revisions or drafts." @@ -2079,19 +2037,19 @@ msgstr "" "Yazı incelemeleri ve taslaklar kalıcı olarak silinecektir. İncelemeleri ya " "da taslakları tutmanız gerekiyorsa bu seçeneği kullanmayın." -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "Yorumları Temizleme" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "İstenmeyen mesaj ve çöpe atılmış yorumlar kalıcı olarak silinecektir." -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "Geçicileri Temizleme" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "" "Transients are temporary options; they are safe to remove. They will be " "automatically regenerated as your plugins require them." @@ -2099,21 +2057,21 @@ msgstr "" "Geçiciler geçici seçeneklerdir; kaldırması güvenlidir. Eklentilerinizin " "gerektirdiklerini otomatik olarak oluşturacaklardır." -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "Veritabanı Temizleme" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "Veritabanı tablolarının ek yükünü azaltır" -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "Otomatik Temizleme" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "Veritabanınızda %s düzeltme." @@ -2121,7 +2079,7 @@ msgstr[1] "Veritabanınızda %s düzeltme." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "Veritabanınızda %s taslak." @@ -2129,7 +2087,7 @@ msgstr[1] "Veritabanınızda %s taslak." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "Veritabanınızda %s çöpe atılmış yazı." @@ -2137,7 +2095,7 @@ msgstr[1] "Veritabanınızda %s çöpe atılmış yazı." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "Veritabanınızda %s istenmeyen yorum." @@ -2145,61 +2103,61 @@ msgstr[1] "Veritabanınızda %s istenmeyen yorum." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "Veritabanınızda %s çöpe atılmış yorum." msgstr[1] "Veritabanınızda %s çöpe atılmış yorum." -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "Tüm geçiciler" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "Veritabanınızda %s geçici." msgstr[1] "Veritabanınızda %s geçici." -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "Tabloları iyileştir" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "Veritabanınızda iyileştirmek için %s tablo." msgstr[1] "Veritabanınızda iyileştirmek için %s tablo." -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "Otomatik Temizlemeyi Zamanla" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "Sıklıkla" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "Günlük" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "Haftalık" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "Aylık" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "CDN’nizi bütünleştirin" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "" "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s)" " you provide." @@ -2208,7 +2166,7 @@ msgstr "" "yeniden yazılacaktır." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "" "Not required for services like Cloudflare and Sucuri. Please see our " "available %1$sAdd-ons%2$s." @@ -2218,7 +2176,7 @@ msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = #. closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "" "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings " "is not required for %2$l to work on your site." @@ -2232,28 +2190,28 @@ msgstr[1] "" "%1$s%2$l Eklentileri%3$s şu anda etkinleştirildi. CDN ayarlarının " "yapılandırması, sitenizde çalışması amacıyla %2$l için gerekmez." -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "İçerik Dağıtım Ağını (CDN) etkinleştir" -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "CDN CNAME(ler)" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "Aşağıda CNAME(leri) belirtin" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "" "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" "CDN aracılığıyla sunulmaması gereken dosyaların URL(lerini)sini belirtin " "(her satıra bir tane)." -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to exclude all files of a given file type located at a specific " @@ -2263,16 +2221,16 @@ msgstr "" " yolda bulunan verilen bir dosya türünün tüm dosyalarını hariç tutmak için " "(.*) joker karakterlerini kullanın." -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "Kalp Atışı" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "WordPress Kalp Atışı API’sini denetleyin" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "" "Reducing or disabling the Heartbeat API’s activity can help save some of " "your server’s resources." @@ -2280,11 +2238,11 @@ msgstr "" "Kalp Atışı API’si etkinliğini azaltmak veya etkisizleştirmek, sunucunuzun " "kaynaklarının bazılarını kurtarmasına yardımcı olabilir." -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "Kalp Atışı etkinliğini azaltma veya etkisizleştirme" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Reducing activity will change Heartbeat frequency from one hit each minute " "to one hit every 2 minutes." @@ -2292,55 +2250,55 @@ msgstr "" "Etkinliği azaltmak Kalp Atışı sıklığını, her dakikada bir vuruştan her 2 " "dakikada bir vuruşa değiştirecektir." -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" "Kalp Atışı’nın tamamen etkisizleştirilmesi bu API’yi kullanan eklentileri ve" " temaları bozabilir." -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "Sınırlandırma" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "Etkinliği azalt" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "Etkisizleştir" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "Kalp Atışı’nı denetle" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "Arka uçtaki davranış" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "Yazı düzenleyicideki davranış" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "Ön uçtaki davranış" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "Eklentiler" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "Daha fazla özellik ekleyin" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "Tek Tık Rocket Eklentileri" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "" "One-Click Add-ons are features extending available options without " "configuration needed. Switch the option \"on\" to enable from this screen." @@ -2349,20 +2307,20 @@ msgstr "" "özelliklerdir. Etkinleştirmek için seçeneği bu ekrandan \"açık\" olarak " "değiştirin." -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "Rocket Eklentileri" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "" "Rocket Eklentileri mevcut seçenekleri genişleten tamamlayıcı özelliklerdir." -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "Kullanıcı Önbelleği" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "" "If you need to create a dedicated set of cache files for each logged-in " "WordPress user, you must activate this add-on." @@ -2371,7 +2329,7 @@ msgstr "" " kümesi oluşturmanız gerekiyorsa bu eklentiyi etkinleştirmek zorundasınız." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "" "User cache is great when you have user-specific or restricted content on " "your website.
%1$sLearn more%2$s" @@ -2379,16 +2337,16 @@ msgstr "" "Web sitenizde kullanıcıya özgü ya da kısıtlı içeriğe sahip olduğunuzda " "kullanıcı önbelleği mükemmeldir.
%1$sDaha fazla bilgi edinin%2$s" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "Bu eklenti ile Cloudflare hesabınızı bütünleştirin." -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "" "Provide your account email, global API key, and domain to use options such " "as clearing the Cloudflare cache and enabling optimal settings with WP " @@ -2399,7 +2357,7 @@ msgstr "" "anahtarını ve etki alanını sağlar." #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "" "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just " "activate the official Cloudflare plugin and configure it. WP Rocket will " @@ -2409,17 +2367,17 @@ msgstr "" "planlıyorsunuz?%2$s Sadece resmi Cloudflare eklentisini aktif edin ve " "yapılandırın. WP Rocket uyumluluğu otomatik olarak etkinleştirecektir." -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "Varnish" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "" "Varnish sunucunuzda çalışıyorsa, bu eklentiyi aktif etmek zorundasınız." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "" "Varnish cache will be purged each time WP Rocket clears its cache to ensure " "content is always up-to-date.
%1$sLearn more%2$s" @@ -2428,16 +2386,16 @@ msgstr "" "zaman güncel olmasını sağlamak için temizlenecektir.
%1$sDaha fazla bilgi" " edinin%2$s" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "WebP Uyumluluğu" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "WebP resimleri için tarayıcı uyumluluğunu iyileştirin." #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "" "Enable this option if you would like WP Rocket to serve WebP images to " "compatible browsers. Please note that WP Rocket cannot create WebP images " @@ -2449,11 +2407,11 @@ msgstr "" "oluşturamayacağını lütfen unutmayın. WebP resimleri oluşturmak için " "%1$sImagify%2$s öneriyoruz. %3$sDaha fazla bilgi%2$s" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "WP Rocket’in önbelleği temizlendiğinde Sucuri önbelleğini temizler." -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "" "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is " "cleared." @@ -2461,49 +2419,49 @@ msgstr "" "WP Rocket’in önbelleği temizlendiğinde Sucuri önbelleğini temizlemek için " "API anahtarınızı verin." -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "Sucuri" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "Bu eklenti ile Sucuri önbelleğini eşitleyin." -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "Cloudflare kimlik bilgileri" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "Cloudflare ayarları" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "Genel API anahtarı" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "API anahtarınızı bulun" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "Hesap e-postası" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "Bölge Kimliği - Zone ID" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "Geliştirme kipi" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "" "Temporarily activate development mode on your website. This setting will " "automatically turn off after 3 hours. %1$sLearn more%2$s" @@ -2511,11 +2469,11 @@ msgstr "" "Web sitenizde geçici olarak geliştirme kipini aktif edin. Bu ayar otomatik " "olarak 3 saat sonra kapanacak. %1$sDaha fazla bilgi edinin%2$s" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "En uygun ayarlar" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "" "Automatically enhances your Cloudflare configuration for speed, performance " "grade and compatibility." @@ -2523,11 +2481,11 @@ msgstr "" "Hız, performans puanı ve uyumluluk için Cloudflare yapılandırmanızı otomatik" " olarak iyileştirir." -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "Göreli protokol" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "" "Should only be used with Cloudflare's flexible SSL feature. URLs of static " "files (CSS, JS, images) will be rewritten to use // instead of http:// or " @@ -2537,11 +2495,11 @@ msgstr "" "dosyaların (CSS, JS, resimler) URL’leri, http:// veya https:// yerine // " "kullanmak için yeniden yazılacaktır." -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "Sucuri kimlik bilgileri" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "" "Firewall API key (for plugin), must be in format {32 characters}/{32 " @@ -2550,24 +2508,22 @@ msgstr "" "Güvenlik Duvarı API anahtarı (eklenti için), {32 karakter}/{32 karakter} " "biçiminde olmak zorundadır:" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "API anahtarınızı bulun" #. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: -#. opening a tag, %4$s: option a tag, %5$s: opening a tag. -#: inc/Engine/Admin/Settings/Page.php:2295 +#. opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 msgid "" -"%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our " -"brand new feature %3$sOptimize critical images%5$s is automatically " -"activated now! Also, the Cache tab was removed but the existing features " -"will remain working, %4$ssee more here%5$s." +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " +"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " +"more about it." msgstr "" -"%1$sWP Rocket:%2$s eklenti 3.16 sürümüne güncellendi. Yepyeni özelliğimiz " -"%3$sÖnemli resimleri iyileştir%5$s artık otomatik olarak etkinleştirildi! " -"Ayrıca, Önbellek sekmesi kaldırıldı ancak varolan özellikler çalışmaya devam" -" edecek, %4$sdaha fazlasına buradan bakın%5$s." +"%1$sWP Rocket:%2$s eklenti 3.17 sürümüne güncellendi. Yeni özellik: %3$sLazy" +" Render İçeriği%4$s. Bu konuda daha fazla bilgi edinmek için belgelerimizi " +"gözden geçirin." #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" @@ -2586,25 +2542,25 @@ msgstr "" "eklemek, sitenizdeki her sayfa için önbelleğe almayı ve iyileştirmeleri " "etkisizleştirdiğinden kaydedilmedi." -#: inc/Engine/Admin/Settings/Subscriber.php:172 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "İçe aktarın, Dışa aktarın, Geri alın" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "Resim İyileştirme" -#: inc/Engine/Admin/Settings/Subscriber.php:198 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "Resimlerinizi sıkıştırın" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "Eğitimler" -#: inc/Engine/Admin/Settings/Subscriber.php:216 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "Başlarken ve nasıl yapılır videoları" @@ -2612,15 +2568,15 @@ msgstr "Başlarken ve nasıl yapılır videoları" msgid "WP Rocket Expired Cache Interval" msgstr "WP Roket Süresi Dolmuş Önbellek Aralığı" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "WP_CACHE değeri" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "Önbellek" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "" "The WP_CACHE constant needs to be set to true for WP Rocket cache to work " "properly" @@ -2628,38 +2584,38 @@ msgstr "" "WP Rocket önbelleğinin düzgün çalışması için WP_CACHE sabitinin true olarak " "ayarlanması gerekir" -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "WP_CACHE, true olarak ayarlı" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "WP_CACHE ayarlı değil" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "WP_CACHE, false olarak ayarlı" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "Sonraki Fatura Tarihi" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "Abonelik Yok" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "RocketCDN aboneliğiniz şu anda etkin." #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing #. tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "RocketCDN’yi kullanmak için CNAME’nizi %1$s%2$s%3$s ile değiştirin." #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2729,16 +2685,16 @@ msgstr "RocketCDN etkisizleştirildi" #. Translators: %s = date formatted using date_i18n() and get_option( #. 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "Sadece %s tarihine kadar geçerli!" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "Şunlar sayesinde web sitenizi hızlandırın:" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "" "High performance Content Delivery Network (CDN) with %1$sunlimited " "bandwidth%2$s" @@ -2747,14 +2703,14 @@ msgstr "" "(CDN)" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "" "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "" "Kolay yapılandırma: %1$sen iyi CDN ayarları%2$s otomatik olarak uygulanır" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "" "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in" " our plugin" @@ -2762,12 +2718,12 @@ msgstr "" "WP Rocket bütünleştirmesi: CDN seçeneği eklentimizde %1$sotomatik olarak " "yapılandırılır%2$s" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "RocketCDN hakkında daha fazla bilgi edinin" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "" "*$%1$s/month for 12 months then $%2$s/month. You can cancel your " "subscription at any time." @@ -2775,35 +2731,35 @@ msgstr "" "*12 ay için $%1$s/ay ardından $%2$s/ay. Aboneliğinizi istediğiniz zaman " "iptal edebilirsiniz." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "Aylık faturalandırılır" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "Başlayın" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "Bu afişi küçült" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "" "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "" "RocketCDN, WP Rocket’in İçerik Dağıtım Ağı ile web sitenizi hızlandırın." -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "Daha Fazla Bilgi Edinin" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "" "RocketCDN yerel etki alanlarında ve hazırlık sitelerinde kullanılamaz." -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "RocketCDN’yi Al" @@ -2817,6 +2773,18 @@ msgid "" msgstr "" "RocketCDN, WP Rocket’in İçerik Dağıtım Ağı ile web sitenizi hızlandırın!" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "Çok fazla istek." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "Geçerli yanıt değil." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "Geçerli istek türü değil." + #: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "WP Rocket işlemi bekleyen işler" @@ -2829,11 +2797,53 @@ msgstr "WP Rocket başarısız işleri temizledi" msgid "WP Rocket process on submit jobs" msgstr "Gönderme işlerinde WP Roket süreci" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Performance Hints data" +msgstr "Performans İpuçları verilerini temizle" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Performance Hints data of this URL" +msgstr "Bu URL’nin Performans İpuçları verilerini temizle" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Performance Hints" +msgstr "Performans İpuçları" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +msgid "Clear" +msgstr "Temizle" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "" +"This action will clear data for Optimize Critical Images and Lazy Render " +"Content." +msgstr "" +"Bu eylem, Önemli Resimleri İyileştirmeye ve Lazy Render İçeriğine ilişkin " +"verileri temizleyecek." + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "%1$s: Önemli resimler ve Lazy Render verileri temizlendi!" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "Komut kodu hatası" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "Komut kodu zaman aşımı" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "Geçerli bir kesinti zamanı belirlemek mümkün değildi: %s." + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "Her dakika" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "Önemli Yol CSS’yi yeniden oluştur" @@ -2861,7 +2871,6 @@ msgstr "Bu özelliği kullanmak için %l." msgid "Publish the %s" msgstr "%s Yayınla" -#. translators: %s = post type. #: inc/Engine/CriticalPath/Admin/Post.php:223 msgid "Enable Load CSS asynchronously in WP Rocket settings" msgstr "WP Rocket ayarlarında CSS’yi eşzamanlı olmadan yükle’yi etkinleştir" @@ -2876,7 +2885,7 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "%1$s için Önemli CSS oluşturulmadı. Hata: %2$s" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "empty response." @@ -2885,26 +2894,26 @@ msgstr "" "döndürdü." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an empty " "response." msgstr "%1$s için Önemli CSS oluşturulmadı. Hata: API boş bir yanıt döndürdü." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "Mobil üzerinde %1$s için Önemli CSS oluşturulmadı." #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "%1$s için Önemli CSS oluşturulmadı." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "invalid response code." @@ -2913,7 +2922,7 @@ msgstr "" "yanıt kodu döndürdü." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an invalid " "response code." @@ -2922,8 +2931,8 @@ msgstr "" "döndürdü." #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "Hata: %1$s" @@ -3008,38 +3017,38 @@ msgid "Critical CSS file cannot be deleted" msgstr "Önemli CSS dosyası silinemez" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "%1$s için Mobil Önemli CSS oluşturulmadı." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "%s için Önemli CSS devam ediyor." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "%s için Mobil Önemli CSS oluşturuldu." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "%s için Önemli CSS oluşturuldu." -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "Önemli CSS dosyası başarılı olarak silindi." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "%1$s için Mobil Önemli CSS zaman aşımına uğradı. Lütfen biraz sonra yeniden " "deneyin." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "%1$s için Önemli CSS zaman aşımına uğradı. Lütfen biraz sonra yeniden " @@ -3169,39 +3178,39 @@ msgid "Unlimited" msgstr "Sınırsız" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "%s indirim" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "%s promosyonu geçerli!" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "Acele Edin! Anlaşmanın bitiş zamanı:" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "Dakika" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "Saniye" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "Şimdi yükselt" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "CSS teslimini iyileştir özelliği etkisizleştirildi." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "" "You can no longer use the Remove Unused CSS or Load CSS asynchronously " "options." @@ -3210,7 +3219,7 @@ msgstr "" "seçeneklerini kullanamazsınız." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "" "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, " "which addresses a PageSpeed Insights recommendation and improves your page " @@ -3220,26 +3229,26 @@ msgstr "" "önerisini ele alan ve sayfa performansınızı iyileştiren %1$saktif bir " "lisansa%2$s ihtiyacınız var." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "Şimdi yenile" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "Yakında bazı özelliklere erişiminizi kaybedeceksiniz." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "" "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" "%1$sCSS teslimini iyileştirmeye devam etmek için aktif bir lisansa%2$s " "ihtiyacınız var." -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "" "The Remove Unused CSS and Load CSS asynchronously features are great options" " to address the PageSpeed Insights recommendations and improve your website " @@ -3250,17 +3259,17 @@ msgstr "" "artırmak için harika seçeneklerdir." #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "" "Bu özellikler %1$s%3$s tarihinde otomatik olarak etkisizleştirilecektir%2$s." -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "WP Rocket lisansınızın süresi doldu!" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "" "Your website could be much faster if it could take advantage of our %1$snew " "features and enhancements%2$s. 🚀" @@ -3269,7 +3278,7 @@ msgstr "" " siteniz çok daha hızlı olabilirdi.🚀" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "" "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access" " to product updates and support." @@ -3277,12 +3286,12 @@ msgstr "" "%1$sWP Rocket lisansınızın süresi dolmak üzere%2$s: yakında ürün " "güncellemelerine ve desteğine erişiminizi kaybedeceksiniz." -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "Daha Fazla Web Sitesini Hızlandırın" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "" "You can use WP Rocket on more websites by upgrading your license. To " "upgrade, simply pay the %1$sprice difference%2$s between your current and " @@ -3293,7 +3302,7 @@ msgstr "" "arasındaki %1$sfiyat farkını%2$s, aşağıda gösterildiği gibi ödeyin." #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "" "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "" @@ -3301,17 +3310,17 @@ msgstr "" "değiştirmez" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "$%s dolar tasarruf edin" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "%s web sitesi" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "%s olarak yükselt" @@ -3324,19 +3333,6 @@ msgstr "" "kullanabilirsiniz (sadece şu anki ve yeni lisanslarınız arasındaki fiyat " "farkını ödeyeceksiniz)." -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "%1$s: Önemli resimler temizlendi!" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 -msgid "Script error" -msgstr "Komut kodu hatası" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 -msgid "Script timeout" -msgstr "Komut kodu zaman aşımı" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "Resimler için LazyLoad" @@ -3349,15 +3345,15 @@ msgstr "Iframe’ler ve görüntüler için LazyLoad" msgid "LazyLoad CSS backgrounds" msgstr "LazyLoad CSS arka planları" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "Çözümsel ve Reklamlar" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "Eklentiler" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "Temalar" @@ -3405,17 +3401,22 @@ msgstr "JavaScript’i küçült/birleştir" msgid "Minify CSS" msgstr "CSS’yi küçült" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Remove Unused CSS" +msgstr "Kullanılmayan CSS’yi Kaldır" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, #. %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 msgid "" "%1$s: Could not create the %2$s table in the database which is necessary for" -" the Remove Unused CSS feature to work. Please reach out to %3$sour " -"support%4$s." +" the Remove Unused CSS feature to work. Please check our " +"%3$sdocumentation%4$s." msgstr "" -"%1$s: Kullanılmayan CSS'yi Kaldır özelliğinin çalışması için gerekli olan " -"%2$s tablosu veritabanında oluşturulamadı. Lütfen %3$sdestek birimimize%4$s " -"ulaşın." +"%1$s: Kullanılmayan CSS’yi Kaldır özelliğinin çalışması için gerekli olan " +"%2$s tablosu veritabanında oluşturulamadı. Lütfen %3$sbelgelerimizi %4$s " +"gözden geçirin." #. translators: %1$s = plugin name. #: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:274 @@ -3423,7 +3424,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "%1$s: Kullanılan CSS önbelleği temizlendi!" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "" "%1$s: The preload service is now active. After the initial preload it will " "continue to cache all your pages whenever they are purged. No further action" @@ -3441,29 +3442,17 @@ msgstr "WP Rocket Önyükleme bekleyen işler" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "WP Rocket Önyükleme, sıkışmış başarısız işleri geri alır" -#: inc/Engine/Saas/Admin/AdminBar.php:77 -#: inc/Engine/Saas/Admin/AdminBar.php:198 -msgid "Clear Critical Images" -msgstr "Önemli Resimleri Temizle" - -#: inc/Engine/Saas/Admin/AdminBar.php:164 -msgid "Clear Critical Images of this URL" -msgstr "Bu URL'nin Önemli Resimlerini Temizle" - -#: inc/Engine/Saas/Admin/AdminBar.php:167 -msgid "Clear Used CSS of this URL" -msgstr "Bu URL’nin Kullanılan CSS’sini Temizle" +#: inc/Engine/Saas/Admin/AdminBar.php:51 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +msgid "Clear RUCSS optimizations" +msgstr "RUCSS iyileştirmelerini temizle" -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Critical Images Cache" -msgstr "Önemli Resimler Önbelleği" - -#: inc/Engine/Saas/Admin/AdminBar.php:201 -msgid "Remove Used CSS Cache" -msgstr "Kullanılan CSS Önbelleğini Kaldır" +#: inc/Engine/Saas/Admin/AdminBar.php:106 +msgid "Clear RUCSS optimizations of this URL" +msgstr "Bu URL’nin RUCSS iyileştirmelerini temizle" #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "" "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing " "your pages, the plugin is optimizing LCP and the images above the fold." @@ -3474,7 +3463,7 @@ msgstr "" #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of #. seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." @@ -3483,19 +3472,19 @@ msgstr "" "\t\t\t WP Rocket, %3$s saniyede %2$s URL’ye kadar Kullanılan CSS oluşturmaya devam edecek." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" "En hızlı sonuçlar için %1$sÖnyükleme%2$s’nin etkinleştirilmesini öneririz." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:180 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" "İşlem hakkında daha fazla bilgi edinmek için %1$sbelgelerimizi%2$s gözden " "geçirin." -#: inc/Engine/Saas/Admin/Notices.php:246 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3507,12 +3496,12 @@ msgstr "" "ihtiyacınız var." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:249 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "%1$s indirimle WP Rocket tekli lisansı almak için burayı tıklayın!" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:302 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3522,11 +3511,11 @@ msgstr "" "özelliklerinin WP Rocket’a erişmesini önlüyor. %1$sBurada belgelerimizde%2$s" " listelenen IP’ler, izinli listelerinize eklenmelidir:" -#: inc/Engine/Saas/Admin/Notices.php:307 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "- Güvenlik eklentisinde, eğer bir eklenti kullanıyorsanız" -#: inc/Engine/Saas/Admin/Notices.php:308 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "" "- Sunucunun güvenlik duvarında. Barındırıcınız bu konuda size yardımcı " @@ -3891,7 +3880,7 @@ msgid "" msgstr "" "Bu eklenti, WP Rocket’in önbelleğe alınmasını ve iyileştirmelerini engeller." " Bunu devre dışı bırakın ve bunun yerine %1$sEzoic’in ad sunucusu " -"bütünleştirmesi%2$s'ni kullanın." +"bütünleştirmesi%2$s’ni kullanın." #. Translators: %s = Plugin name. #: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:78 @@ -3910,7 +3899,7 @@ msgstr[1] "" "bırakın:" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" @@ -3919,7 +3908,7 @@ msgstr "" "etkisizleştirmesi%3$s ile çakışıyor" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP " @@ -3929,7 +3918,7 @@ msgstr "" "çakışıyor" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser " @@ -3939,7 +3928,7 @@ msgstr "" "önbelleklemesi%3$s ile çakışıyor" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "" "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" @@ -3948,7 +3937,7 @@ msgstr "" "ile çakışıyor" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile " @@ -4232,7 +4221,6 @@ msgstr "CDN CNAME" msgid "Purges RocketCDN cached resources for your website. %s" msgstr "Web siteniz için RocketCDN önbelleklenmiş kaynaklarını temizler. %s" -#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:63 #: views/settings/page-sections/cloudflare.php:36 #: views/settings/page-sections/sucuri.php:37 @@ -4269,7 +4257,6 @@ msgstr "Cloudflare Önbelleği" msgid "Purges cached resources for your website. %s" msgstr "Web sitenizin önbelleklenmiş kaynaklarını temizler. %s" -#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:36 msgid "https://support.cloudflare.com/hc/en-us/articles/200169246" msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" @@ -4328,35 +4315,48 @@ msgstr "Bitiş Tarihi" msgid "View my account" msgstr "Hesabımı göster" -#: views/settings/page-sections/dashboard.php:137 +#: views/settings/page-sections/dashboard.php:130 views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "Rocket Çözümsel" + +#. translators: %1$s = opening tag, %2$s = closing tag. +#: views/settings/page-sections/dashboard.php:136 +msgid "" +"I agree to share anonymous data with the development team to help improve WP" +" Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" +"WP Rocket’i iyileştirmeye yardımcı olmak için geliştirme ekibiyle isimsiz " +"verileri paylaşmayı kabul ediyorum. %1$sNe tür bilgi toplayacağız?%2$s" + +#: views/settings/page-sections/dashboard.php:154 msgid "Quick Actions" msgstr "Hızlı Eylemler" -#: views/settings/page-sections/dashboard.php:144 +#: views/settings/page-sections/dashboard.php:161 msgid "Remove all cached files" msgstr "Tüm önbelleklenen dosyaları kaldırın" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:181 +#: views/settings/page-sections/dashboard.php:187 msgid "Regenerate Critical CSS" msgstr "Önemli CSS’yi yeniden oluştur" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:213 msgid "Frequently Asked Questions" msgstr "Sıkça Sorulan Sorular" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:227 msgid "Still cannot find a solution?" msgstr "Hala bir çözüm bulamadınız mı?" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:228 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" "Bir çağrı gönderin ve arkadaş yanlısı ve bilgili Roketçilerimizden yardım " "alın." -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:236 msgid "Ask support" msgstr "Destek iste" @@ -4375,41 +4375,57 @@ msgstr "" msgid "Save Changes and Optimize" msgstr "Değişiklikleri Kaydet ve İyileştir" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 msgid "" -"%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image " -"optimization.%2$s" +"%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" msgstr "" -"%1$sWP ROCKET%2$s, resim iyileştirme için sınıfının en iyisi %3$sIMAGIFY%4$s" -" %1$seklentisini yarattı.%2$s" +"%1$sWP Rocket, web sitenize fazladan hız artışı sağlamak için IMAGIFY’ı " +"yarattı!%2$s" -#: views/settings/page-sections/imagify.php:24 +#: views/settings/page-sections/imagify.php:28 +msgid "Images can account for 50% of your loading time!" +msgstr "Resimler yükleme sürenizin %50’ini oluşturabilir!" + +#: views/settings/page-sections/imagify.php:31 msgid "" -"Compress image to make your website faster, all while maintaining image " -"quality." +"Imagify automatically optimizes all your images, helping your website gain " +"precious seconds while saving you time. With just one click, it resizes, " +"compresses, and converts your images to WebP and AVIF formats without " +"sacrificing quality." msgstr "" -"Tüm resim kalitesini korurken, web sitenizin daha hızlı hale getirmek için " -"resmi sıkıştırın." +"Imagify, tüm görsellerinizi otomatik olarak iyileştirerek web sitenizin " +"zamandan tasarruf ederken değerli saniyeler kazanmasına yardımcı olur. Tek " +"tıklamayla resimlerinizi kaliteden ödün vermeden yeniden boyutlandırır, " +"sıkıştırır ve WebP ve AVIF biçimlerine dönüştürür. " -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" -msgstr "Imagify’da daha fazlası:" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" +msgstr "Tüm resimlerinizi tek tıklamayla %1$ssıkıştırın%2$s" -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" -msgstr "Imagify Eklenti Sayfası" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" +msgstr "Resimleri WebP ve Avif’e %1$sdönüştürün%2$s" -#: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" -msgstr "Imagify Web Sitesi" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "Resimlerinizi anında %1$syeniden boyutlandırın%2$s" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" -msgstr "Resim Sıkıştırma Eklentileri İncelemesi" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" +msgstr "%1$sÜcretsiz plan%2$s 20MB/ay içerir (yaklaşık 200 resim)" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" +msgstr "" +"%1$sEn Kolay WordPress Resim İyileştiricisi olan Imagify’ı yükleyin%2$s" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "Imagify’ı Yükle" From bec4a8042d7cf25b271dd35010c88f355ab9fae5 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 16:42:04 +0000 Subject: [PATCH 157/192] Translate languages/rocket.pot in tr_TR 100% translated source file: 'languages/rocket.pot' on 'tr_TR'. --- languages/rocket-tr_TR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-tr_TR.po b/languages/rocket-tr_TR.po index 2ed8056ad6..730cff1b76 100644 --- a/languages/rocket-tr_TR.po +++ b/languages/rocket-tr_TR.po @@ -4423,7 +4423,7 @@ msgstr "%1$sÜcretsiz plan%2$s 20MB/ay içerir (yaklaşık 200 resim)" #: views/settings/page-sections/imagify.php:83 msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" msgstr "" -"%1$sEn Kolay WordPress Resim İyileştiricisi olan Imagify’ı yükleyin%2$s" +"%1$sEn Kolay WordPress Resim İyileştiricisi olan Imagify’ı Yükleyin%2$s" #: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" From 6984085f21a8f5f72f2d6edaf4a514d65747e74f Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:50:30 +0000 Subject: [PATCH 158/192] Translate languages/rocket.pot in pt_PT 100% translated source file: 'languages/rocket.pot' on 'pt_PT'. --- languages/rocket-pt_PT.po | 1003 +++++++++++++++++++------------------ 1 file changed, 511 insertions(+), 492 deletions(-) diff --git a/languages/rocket-pt_PT.po b/languages/rocket-pt_PT.po index eb87b05e85..faad75bd3f 100644 --- a/languages/rocket-pt_PT.po +++ b/languages/rocket-pt_PT.po @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha2\n" -"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" -"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" +"Project-Id-Version: WP Rocket 3.17-alpha3\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" +"POT-Creation-Date: 2024-09-11T13:45:18+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Pedro Mendonça , 2024\n" "Language-Team: Portuguese (Portugal) (https://app.transifex.com/wp-media/teams/18133/pt_PT/)\n" @@ -17,7 +17,7 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.7.1\n" +"X-Generator: WP-CLI 2.4.0\n" #. Plugin Name of the plugin msgid "WP Rocket" @@ -48,9 +48,9 @@ msgstr "https://wp-media.me" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "" "Your site is hosted on %s, we have enabled Varnish auto-purge for " @@ -182,41 +182,31 @@ msgstr "Nível de cache da Cloudflare definido para %s" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "Erro na minificação da Cloudflare: %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "Minificação da Cloudflare %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "Erro no Rocket Loader da Cloudflare: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "Rocket Loader da Cloudflare %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "Erro na cache do navegador da Cloudflare: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "Cache do navegador da Cloudflare definida como %s" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "%1$sWP Rocket:%2$s Opções ideais activadas para a Cloudflare:" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "" "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to " "previous settings:" @@ -224,7 +214,7 @@ msgstr "" "%1$sWP Rocket:%2$s Opções ideais desactivadas para a Cloudflare, foram " "revertidas as opções anteriores:" -#: inc/Addon/Cloudflare/Subscriber.php:661 inc/admin/options.php:165 +#: inc/Addon/Cloudflare/Subscriber.php:632 inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " msgstr "WP Rocket: " @@ -383,7 +373,7 @@ msgid "Settings" msgstr "Opções" #: inc/admin/admin.php:96 inc/admin/admin.php:117 inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "Limpar esta cache" @@ -415,17 +405,17 @@ msgstr "Falhou ao importar as opções: Ficheiro com conteúdo inesperado." msgid "Settings imported and saved." msgstr "As opções foram importadas e guardadas." -#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:571 +#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "Ficheiros de CSS excluídos" -#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:725 +#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "JavaScript em linha excluído" -#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "Ficheiros de JavaScript excluídos" @@ -437,19 +427,19 @@ msgstr "Diferir ficheiros de JavaScript" msgid "Excluded Delay JavaScript Files" msgstr "Ficheiros de JavaScript excluídos do diferimento" -#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1229 +#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "Nunca criar cache dos URL" -#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1243 +#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "Nunca criar cache de agentes de utilizador" -#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1249 +#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "Limpar sempre os URL" -#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1530 +#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "Excluir ficheiros da CDN" @@ -471,7 +461,7 @@ msgstr "Mais informações" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 +#: views/settings/page-sections/dashboard.php:167 msgid "Clear cache" msgstr "Limpar cache" @@ -656,16 +646,15 @@ msgstr "%s: A cache do termo foi limpa." msgid "%s: User cache cleared." msgstr "%s: A cache do utilizador foi limpa." -#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 +#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 #: views/settings/page-sections/dashboard.php:46 msgid "Dismiss this notice" msgstr "Descartar esta notificação" -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:84 -#: inc/Engine/Saas/Admin/AdminBar.php:202 +#: inc/admin/ui/notices.php:682 msgid "Clear Used CSS" msgstr "Limpar CSS utilizado" @@ -746,8 +735,8 @@ msgstr "Reinstalar a versão %s" #: inc/classes/class-wp-rocket-requirements-check.php:203 #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "Reversão da actualização do %s" @@ -775,7 +764,7 @@ msgstr "" "working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 +#: views/settings/page-sections/dashboard.php:167 msgid "Clear and preload cache" msgstr "Limpar e pré-carregar cache" @@ -803,7 +792,7 @@ msgstr "Limpar a cache da RocketCDN" msgid "Documentation" msgstr "Documentação" -#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:36 +#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "Activar o Imagify" @@ -951,7 +940,7 @@ msgstr "" "seleccionar a opção para o pré-carregar." #. translators: 1 and 3 are link openings, 2 is a link closing. -#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "%1$sVolte para o WP Rocket%2$s ou %3$svá para a página de plugins%2$s" @@ -1033,7 +1022,7 @@ msgstr "" msgid "Choose a file from your computer (maximum size: %s)" msgstr "Escolha um ficheiro do seu computador (tamanho máximo: %s)" -#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:422 +#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "Carregar ficheiro e importar opções" @@ -1116,8 +1105,8 @@ msgstr "Básico" msgid "Static Files" msgstr "Ficheiros estáticos" -#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "CDN" @@ -1126,21 +1115,21 @@ msgstr "CDN" msgid "Advanced" msgstr "Avançado" -#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1345 +#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "Base de dados" -#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1051 +#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "Pré-carregamento" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "Ferramentas" -#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:357 +#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 #: views/settings/page-sections/dashboard.php:80 msgid "License" msgstr "Licença" @@ -1183,27 +1172,27 @@ msgid "weekly" msgstr "semanalmente" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "Revisões" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "Rascunhos automáticos" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "Conteúdos no lixo" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "Comentários de spam" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "Comentários no lixo" @@ -1258,63 +1247,46 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "Regenere agora os ficheiros de configuração do WP Rocket" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "Guardar alterações" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "Validar licença" -#: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 inc/functions/admin.php:550 +#: inc/Engine/Admin/Settings/Page.php:278 +#: inc/Engine/Admin/Settings/Page.php:279 inc/functions/admin.php:550 msgid "Unavailable" msgstr "Indisponível" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "Chave de API" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "Endereço de email" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "Painel" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "Obter ajuda, informações da conta" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "O meu estado" - -#: inc/Engine/Admin/Settings/Page.php:435 views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "Rocket Analytics" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "" -"I agree to share anonymous data with the development team to help improve WP" -" Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" -"Concordo em partilhar informações anónimas com a equipa de desenvolvimento " -"para ajudar a melhorar o WP Rocket. %1$sQue informações recolhemos?%2$s" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "Optimizar ficheiros" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "Optimize o CSS e JS" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable this option in Autoptimize." @@ -1323,17 +1295,17 @@ msgstr "" "Autoptimize. Se quiser usar a minificação do %2$s, " "desactive esta opção no Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "Ficheiros de CSS" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "Ficheiros de JavaScript" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable those options in Autoptimize." @@ -1342,7 +1314,7 @@ msgstr "" "Autoptimize. Se quiser usar a minificação do %2$s, " "desactive esta opção no Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "" "If you have problems after activating this option, copy and paste the " "default exclusions to quickly resolve issues:" @@ -1351,7 +1323,7 @@ msgstr "" "exclusões por omissão para corrigir os erros rapidamente:" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "" "Also, please check our %1$sdocumentation%2$s for a list of compatibility " "exclusions." @@ -1359,7 +1331,7 @@ msgstr "" "Além disto, por favor consulte a nossa %1$sdocumentação%2$s para uma lista " "de exclusões compatíveis." -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "" "Internal scripts are excluded by default to prevent issues. Remove them to " "take full advantage of this option." @@ -1368,52 +1340,30 @@ msgstr "" "Remova-os para tirar total partido desta opção." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "" "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" "Se isto criar algum problema, recupere as exclusões por omissão %1$saqui%2$s" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "Minificar ficheiros de CSS" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "" "A minificação do CSS remove espaços em branco e comentários para reduzir o " "tamanho do ficheiro." -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "Isto poderá danificar alguma coisa!" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "" -"If you notice any errors on your website after having activated this " -"setting, just deactivate it again, and your site will be back to normal." -msgstr "" -"Se notar quaisquer erros no seu site depois de activar esta opção, basta " -"desactivar de novo para o seu site voltar ao normal." - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "Activar minificação do CSS" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "" "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" "Especifique os URL de ficheiros de CSS a excluir da minificação (um por " "linha)." -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).css wildcards to exclude all CSS files located at a " @@ -1424,7 +1374,7 @@ msgstr "" "num caminho específico." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external CSS. %1$sMore info%2$s" @@ -1432,12 +1382,12 @@ msgstr "" "Terceiros: Use o caminho completo do URL ou apenas o nome " "do domínio, para excluir CSS externo. %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "Optimizar entrega do CSS" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1448,7 +1398,7 @@ msgstr "" "recomendado Remover CSS não utilizado, mas apenas para utilizadores com uma " "licença activa." -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1459,7 +1409,7 @@ msgstr "" "recomendado Remover CSS não utilizado." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "" "Optimize CSS Delivery features are disabled on local environments. %1$sLearn" " more%2$s" @@ -1467,13 +1417,12 @@ msgstr "" "As funcionalidades de optimizar entrega do CSS estão desactivadas em " "ambientes locais. %1$sSaiba mais%2$s" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" -msgstr "Remover CSS não utilizado" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" +msgstr "Remover CSS não utilizado (RUCSS)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "" "Removes unused CSS per page and helps to reduce page size and HTTP requests." " Recommended for best performance. Test thoroughly! %1$sMore info%2$s" @@ -1482,15 +1431,29 @@ msgstr "" "página e os pedidos HTTP. Recomendado para um melhor desempenho. Teste com " "cuidado! %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "Isto poderá danificar alguma coisa!" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "" +"If you notice any errors on your website after having activated this " +"setting, just deactivate it again, and your site will be back to normal." +msgstr "" +"Se notar quaisquer erros no seu site depois de activar esta opção, basta " +"desactivar de novo para o seu site voltar ao normal." + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "Activar a remoção de CSS não utilizado" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "CSS a não remover" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "" "Specify CSS filenames, IDs or classes that should not be removed (one per " "line)." @@ -1498,13 +1461,13 @@ msgstr "" "Especifique os ficheiros, ID ou classes CSS que não devem ser removidos (um " "por linha)." -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "Carregamento assíncrono de CSS" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "" "Load CSS asynchronously is currently handled by the %1$s plugin. If you want" @@ -1514,19 +1477,19 @@ msgstr "" "usar o carregamento assíncrono de CSS do WP Rocket, desactive o plugin %1$s." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "" "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" "Gera CSS do caminho crítico e carrega o CSS de modo assíncrono. %1$sMais " "informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "Alternativa ao CSS crítico" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "" "Provides a fallback if auto-generated critical path CSS is incomplete. " "%1$sMore info%2$s" @@ -1534,22 +1497,18 @@ msgstr "" "Fornece uma alternativa caso o CSS do caminho crítico gerado automaticamente" " esteja incompleto. %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "Minificar ficheiros de JavaScript" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "" "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "" "A minificação do JavaScript remove espaços em branco e comentários para " "reduzir o tamanho do ficheiro." -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "Activar minificação do JavaScript" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "" "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" @@ -1557,7 +1516,7 @@ msgstr "" "JavaScript para poder seleccionar)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "" "Combine JavaScript files combines your site’s internal, 3rd party and inline" " JS reducing HTTP requests. Not recommended if your site uses HTTP/2. " @@ -1567,8 +1526,7 @@ msgstr "" "terceiros, reduzindo os pedidos HTTP. Não é recomendado se o seu site " "utilizar HTTP/2. %1$sMais informações%2$s" -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "" "For compatibility and best results, this option is disabled when delay " "javascript execution is enabled." @@ -1576,12 +1534,12 @@ msgstr "" "Para compatibilidade e melhores resultados, esta opção é desactivada ao " "activar a opção de diferir a execução de JavaScript." -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "Activar combinação do JavaScript" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "" "Specify patterns of inline JavaScript to be excluded from concatenation (one" " per line). %1$sMore info%2$s" @@ -1589,7 +1547,7 @@ msgstr "" "Especifique padrões de JavaScript em linha a excluir da concatenação (um por" " linha). %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "" "Specify URLs of JavaScript files to be excluded from minification and " "concatenation (one per line)." @@ -1597,7 +1555,7 @@ msgstr "" "Especifique os URL de ficheiros de JavaScript a excluir da minificação e " "concatenação (um por linha)." -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).js wildcards to exclude all JS files located at a " @@ -1608,7 +1566,7 @@ msgstr "" "caminho específico." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external JS. %1$sMore info%2$s" @@ -1616,13 +1574,13 @@ msgstr "" "Terceiros: Use o caminho completo do URL ou apenas o nome " "do domínio, para excluir JS externo. %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "Diferir carregamento de JavaScript" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "" "Load JavaScript deferred eliminates render-blocking JS on your site and can " "improve load time. %1$sMore info%2$s" @@ -1632,7 +1590,7 @@ msgstr "" "informações%2$s" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "" "Specify URLs or keywords of JavaScript files to be excluded from defer (one " "per line). %1$sMore info%2$s" @@ -1640,13 +1598,13 @@ msgstr "" "Especifique os URL ou palavras-chave de ficheiros de JavaScript a excluir do" " diferimento (um por linha). %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "Diferir execução de JavaScript" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "" "Improves performance by delaying the loading of JavaScript files until user " "interaction (e.g. scroll, click). %1$sMore info%2$s" @@ -1655,11 +1613,11 @@ msgstr "" "até interacção do utilizador (como scroll ou clique). %1$sMais " "informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "Exclusões com um clique" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "" "When using the Delay JavaScript Execution, you might experience delay " "loading elements located in the viewport that need to appear immediately - " @@ -1669,7 +1627,7 @@ msgstr "" " no carregamento de elementos localizados na área visível do ecrã que devam " "ser mostrados de imediato, como por exemplo, slider, cabeçalho ou menu." -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "" "If you need instant visibility, click below on files that should NOT be " "delayed. This selection will help users interact with the elements straight " @@ -1679,7 +1637,7 @@ msgstr "" "devem ser diferidos. Esta selecção ajudará os utilizadores a interagir de " "imediato com os elementos." -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "" "Specify URLs or keywords that can identify inline or JavaScript files to be " "excluded from delaying execution (one per line)." @@ -1687,24 +1645,24 @@ msgstr "" "Especifique os URL ou palavras-chave que possam identificar o JavaScript em " "linha ou em ficheiros a excluir da execução em diferido (um por linha)." -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "Multimédia" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "Carregamento diferido, dimensões de imagens" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "Autoptimize" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "Carregamento diferido" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "" "It can improve actual and perceived loading time as images, iframes, and " "videos will be loaded only as they enter (or about to enter) the viewport " @@ -1716,7 +1674,7 @@ msgstr "" "informações%2$s" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "" "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s " "LazyLoad, disable this option in %2$s." @@ -1724,12 +1682,12 @@ msgstr "" "De momento o carregamento diferido está activado em %2$s. Se quiser usar o " "carregamento diferido do WP Rocket, desactive esta opção em %2$s." -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "Dimensões das imagens" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "" "Add missing width and height attributes to images. Helps prevent layout " "shifts and improve the reading experience for your visitors. %1$sMore " @@ -1739,12 +1697,12 @@ msgstr "" "evitar alterações de layout e melhora a experiência de leitura dos seus " "visitantes. %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "Activar para imagens" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "" "LazyLoad for images is currently activated in %2$s. If you want to use " "%1$s’s LazyLoad, disable this option in %2$s." @@ -1752,27 +1710,27 @@ msgstr "" "De momento o carregamento diferido de imagens está activado em %2$s. Se " "quiser usar o carregamento diferido do %1$s, desactive esta opção em %2$s." -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "Activar para imagens de fundo CSS" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "Activar para iframes e vídeos" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "Substituir iframes do YouTube por imagens de pré-visualização" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "" "A substituição de iframes do YouTube por imagens de pré-visualização não é " "compatível com %2$s." #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "" "This can significantly improve your loading time if you have a lot of " "YouTube videos on a page." @@ -1780,12 +1738,12 @@ msgstr "" "Isto pode melhorar significativamente o tempo de carregamento se tiver " "muitos vídeos do YouTube numa só página." -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "Imagens ou iframes excluídos" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "" "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from" " the image or iframe code to be excluded (one per line). %1$sMore info%2$s" @@ -1794,20 +1752,20 @@ msgstr "" "ficheiro CSS, classe CSS, domínio) das imagens ou dos códigos de iframe a " "excluir (uma por linha). %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "Adicionar dimensões em falta das imagens" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "Crie ficheiros de cache, pré-carregue tipos de letra" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "Pré-carregamento da cache" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "" "When you enable preloading WP Rocket will automatically detect your sitemaps" " and save all URLs to the database. The plugin will make sure that your " @@ -1817,12 +1775,12 @@ msgstr "" "seus sitemaps e guardar todos os URL na base de dados. O plugin assegura que" " a sua cache seja sempre pré-carregada." -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "Pré-carregamento das ligações" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "" "Link preloading improves the perceived load time by downloading a page when " "a user hovers over the link. %1$sMore info%2$s" @@ -1831,11 +1789,11 @@ msgstr "" "através de descarregar a página assim que o utilizador passa com o rato " "sobre a respectiva ligação. %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "Antecipar pedidos de DNS" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "" "DNS prefetching can make external files load faster, especially on mobile " "networks" @@ -1843,12 +1801,12 @@ msgstr "" "A antecipação do pedido de DNS pode acelerar o carregamento de ficheiros " "externos, especialmente em redes móveis" -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "Pré-carregar tipos de letra" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "" "Improves performance by helping browsers discover fonts in CSS files. " "%1$sMore info%2$s" @@ -1856,16 +1814,16 @@ msgstr "" "Melhora o desempenho ao ajudar os navegadores a descobrir tipos de letra em " "ficheiros de CSS. %1$sMais informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "Activar pré-carregamento" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "Excluir estes URL" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "" "Specify URLs to be excluded from the preload feature (one per line). " "%1$sMore info%2$s" @@ -1873,11 +1831,11 @@ msgstr "" "Especifique os URL a excluir do pré-carregamento (um por linha). %1$sMais " "informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "Os URL dos pedidos a antecipar" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "" "Specify external hosts to be prefetched (no http:, one per " "line)" @@ -1885,11 +1843,11 @@ msgstr "" "Especifique os servidores externos a antecipar os pedidos (sem " "http:, um por linha)" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "Tipos de letra a pré-carregar" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "" "Specify urls of the font files to be preloaded (one per line). Fonts must be" " hosted on your own domain, or the domain you have specified on the CDN tab." @@ -1898,7 +1856,7 @@ msgstr "" "linha). Os tipos de letra devem ser alojados no seu domínio, ou no domínio " "especificado no separador da CDN." -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "" "The domain part of the URL will be stripped automatically.
Allowed font " "extensions: otf, ttf, svg, woff, woff2." @@ -1906,53 +1864,53 @@ msgstr "" "O domínio será removido automaticamente do URL.
Extensões permitidas " "para tipos de letra: otf, ttf, svg, woff, woff2." -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "Activar o pré-carregamento de ligações" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "Regras avançadas" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "Configure as regras de cache em pormenor" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "" "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "" "Devem excluir-se da cache os URL personalizados de páginas dinâmicas como as" " de início e terminar sessão." -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "WooCommerce" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "Easy Digital Downloads" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "iThemes Exchange" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "Jigoshop" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "WP-Shop" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing #. tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "" "
Cart, checkout and \"my account\" pages set in " "%1$s%2$s%3$s will be detected and never cached by default." @@ -1961,12 +1919,12 @@ msgstr "" "%1$s%2$s%3$s serão detectadas e por omissão nunca serão " "armazenadas em cache." -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "Expiração da cache" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "" "Cache files older than the specified lifespan will be deleted.
Enable " "%1$spreloading%2$s for the cache to be rebuilt automatically after lifespan " @@ -1976,16 +1934,16 @@ msgstr "" "especificada.
Active o %1$spré-carregamento%2$s para a cache ser " "reconstruída automaticamente após a sua expiração." -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "Nunca criar cache de cookies" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "Cache de parâmetros de consulta" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "" "%1$sCache for query strings%2$s enables you to force caching for specific " "GET parameters." @@ -1993,14 +1951,14 @@ msgstr "" "A %1$scache de parâmetros de consulta%2$s permite forçar a cache de " "parâmetros GET específicos." -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "" "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" "Especifique o tempo após o qual a cache global é limpa
(0 = ilimitado)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "" "Reduce lifespan to 10 hours or less if you notice issues that seem to appear" " periodically. %1$sWhy?%2$s" @@ -2008,27 +1966,27 @@ msgstr "" "Reduza a expiração para 10 horas ou menos se notar erros que parecem surgir " "periodicamente. %1$sPorquê?%2$s" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "Horas" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "Dias" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "" "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" "Especifique os URL de páginas ou conteúdos que nunca deverão ser guardados " "em cache (um por linha)" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to address multiple URLs under a given path." @@ -2036,7 +1994,7 @@ msgstr "" "O domínio será removido automaticamente do URL.
Utilize wildcards (.*) " "para incluir múltiplos URL num determinado caminho." -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "" "Specify full or partial IDs of cookies that, when set in the visitor's " "browser, should prevent a page from getting cached (one per line)" @@ -2045,20 +2003,20 @@ msgstr "" " navegador do visitante, deverão impedir uma página de ser guardada em cache" " (um por linha)" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "" "Specify user agent strings that should never see cached pages (one per line)" msgstr "" "Especifique strings de agentes de utilizador que nunca devem obter páginas " "em cache (uma por linha)" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "" "Utilize wildcards (.*) para detectar partes de strings de agentes de " "utilizador." -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "" "Specify URLs you always want purged from cache whenever you update any post " "or page (one per line)" @@ -2066,19 +2024,19 @@ msgstr "" "Especifique os URL a limpar da cache sempre que actualizar qualquer conteúdo" " ou página (um por linha)" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "Especifique parâmetros de consulta a adicionar à cache (um por linha)" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "Optimize, reduza a sobrecarga" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "Limpeza de conteúdos" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "" "Post revisions and drafts will be permanently deleted. Do not use this " "option if you need to retain revisions or drafts." @@ -2086,19 +2044,19 @@ msgstr "" "As revisões e rascunhos de conteúdos serão eliminados permanentemente. Não " "use esta opção se precisar das revisões e dos rascunhos." -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "Limpeza de comentários" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "Os comentários de spam e no lixo serão eliminados permanentemente." -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "Limpeza de transientes" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "" "Transients are temporary options; they are safe to remove. They will be " "automatically regenerated as your plugins require them." @@ -2106,21 +2064,21 @@ msgstr "" "Os transientes são opções temporárias, é seguro removê-los. Serão " "regenerados automaticamente quando os seus plugins precisarem." -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "Limpeza da base de dados" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "Reduz a sobrecarga das tabelas da base de dados" -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "Limpeza automática" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "%s revisão na sua base de dados." @@ -2129,7 +2087,7 @@ msgstr[2] "%s revisões na sua base de dados." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "%s rascunho na sua base de dados." @@ -2138,7 +2096,7 @@ msgstr[2] "%s rascunhos na sua base de dados." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "%s conteúdo no lixo na sua base de dados." @@ -2147,7 +2105,7 @@ msgstr[2] "%s conteúdos no lixo na sua base de dados." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "%s comentário de spam na sua base de dados." @@ -2156,64 +2114,64 @@ msgstr[2] "%s comentários de spam na sua base de dados." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "%s comentário no lixo na sua base de dados." msgstr[1] "%s comentários no lixo na sua base de dados." msgstr[2] "%s comentários no lixo na sua base de dados." -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "Todos os transientes" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "%s transiente na sua base de dados." msgstr[1] "%s transientes na sua base de dados." msgstr[2] "%s transientes na sua base de dados." -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "Optimizar tabelas" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "%s tabela a optimizar na sua base de dados." msgstr[1] "%s tabelas a optimizar na sua base de dados." msgstr[2] "%s tabelas a optimizar na sua base de dados." -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "Agendar limpeza automática" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "Frequência" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "Diariamente" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "Semanalmente" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "Mensalmente" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "Integre a sua CDN" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "" "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s)" " you provide." @@ -2222,7 +2180,7 @@ msgstr "" "no(s) CNAME(s) que fornecer." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "" "Not required for services like Cloudflare and Sucuri. Please see our " "available %1$sAdd-ons%2$s." @@ -2232,7 +2190,7 @@ msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = #. closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "" "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings " "is not required for %2$l to work on your site." @@ -2249,28 +2207,28 @@ msgstr[2] "" "Os %1$smódulos %2$l%3$s estão activos de momento. Não é necessário " "configurar a CDN para os módulos %2$l funcionarem no seu site." -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "Activar CDN" -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "CNAME(s) da CDN" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "Especifique o(s) CNAME(s) abaixo" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "" "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" "Especifique os URL dos ficheiros que não devem ser servidos pela CDN (um por" " linha)." -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to exclude all files of a given file type located at a specific " @@ -2280,16 +2238,16 @@ msgstr "" "para excluir todos os ficheiros de um determinado tipo, localizados num " "caminho específico." -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "Controle a Heartbeat API do WordPress" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "" "Reducing or disabling the Heartbeat API’s activity can help save some of " "your server’s resources." @@ -2297,11 +2255,11 @@ msgstr "" "Reduzir ou desactivar a actividade da Hartbeat API pode economizar alguns " "recursos do seu servidor." -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "Reduzir ou desactivar a actividade do Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Reducing activity will change Heartbeat frequency from one hit each minute " "to one hit every 2 minutes." @@ -2309,55 +2267,55 @@ msgstr "" "A redução de actividade altera a frequência do Heartbeat de um acesso por " "minuto para um acesso a cada 2 minutos." -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" "Desactivar completamente o Heartbeat pode prejudicar os plugins e temas que " "usem esta API." -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "Não limitar" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "Reduzir actividade" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "Desactivar" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "Controlar Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "Comportamento no painel de administração" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "Comportamento no editor de conteúdos" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "Comportamento na interface do site" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "Módulos" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "Adicione mais funcionalidades" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "Módulos do Rocket com um clique" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "" "One-Click Add-ons are features extending available options without " "configuration needed. Switch the option \"on\" to enable from this screen." @@ -2366,21 +2324,21 @@ msgstr "" "opções disponíveis sem necessidade de configuração. Ligue as opções para " "activar os módulos neste mesmo ecrã." -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "Módulos do Rocket" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "" "Os módulos do Rocket são funcionalidades complementares que aumentam as " "opções disponíveis." -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "Cache de utilizadores" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "" "If you need to create a dedicated set of cache files for each logged-in " "WordPress user, you must activate this add-on." @@ -2389,7 +2347,7 @@ msgstr "" "utilizador do WordPress com sessão iniciada, tem de activar este módulo." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "" "User cache is great when you have user-specific or restricted content on " "your website.
%1$sLearn more%2$s" @@ -2397,16 +2355,16 @@ msgstr "" "A cache de utilizador é excelente quando tem conteúdo restrito ou específico" " do utilizador no seu site.
%1$sSaiba mais%2$s" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "Integre a sua conta da Cloudflare com este módulo." -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "" "Provide your account email, global API key, and domain to use options such " "as clearing the Cloudflare cache and enabling optimal settings with WP " @@ -2417,7 +2375,7 @@ msgstr "" "ideal com o WP Rocket." #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "" "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just " "activate the official Cloudflare plugin and configure it. WP Rocket will " @@ -2427,16 +2385,16 @@ msgstr "" "activar e o plugin oficial da Cloudflare e configurar. O WP Rocket activará " "a compatibilidade automaticamente." -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "Varnish" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "Se utilizar o Varnish no seu servidor, deve activar este módulo." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "" "Varnish cache will be purged each time WP Rocket clears its cache to ensure " "content is always up-to-date.
%1$sLearn more%2$s" @@ -2444,16 +2402,16 @@ msgstr "" "O cache do Varnish será limpa sempre que limpar a cache do WP Rocket para " "garantir que o conteúdo está sempre actualizado.
%1$sSaiba mais%2$s" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "Compatibilidade com WebP" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "Melhorar a compatibilidade dos navegadores para imagens WebP." #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "" "Enable this option if you would like WP Rocket to serve WebP images to " "compatible browsers. Please note that WP Rocket cannot create WebP images " @@ -2465,11 +2423,11 @@ msgstr "" " por si. Para criar imagens WebP recomendamos o %1$sImagify%2$s. %3$sMais " "informações%2$s" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "Limpar a cache do Sucuri ao limpar a cache do WP Rocket." -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "" "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is " "cleared." @@ -2477,49 +2435,49 @@ msgstr "" "Forneça a sua chave de API para limpar a cache do Sucuri ao limpar a cache " "do WP Rocket." -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "Sucuri" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "Sincronize a cache do Sucuri com este módulo." -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "Credenciais da Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "Opções da Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "Chave global de API:" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "Consulte a sua chave de API" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "Email da conta" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "ID da zona" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "Modo de desenvolvimento" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "" "Temporarily activate development mode on your website. This setting will " "automatically turn off after 3 hours. %1$sLearn more%2$s" @@ -2527,11 +2485,11 @@ msgstr "" "Active temporariamente o modo de desenvolvimento no seu site. Esta opção " "desactiva-se automaticamente após 3 horas. %1$sSaiba mais%2$s" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "Configuração ideal" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "" "Automatically enhances your Cloudflare configuration for speed, performance " "grade and compatibility." @@ -2539,11 +2497,11 @@ msgstr "" "Melhore automaticamente a sua configuração da Cloudflare para melhor " "velocidade, grau de desempenho e compatibilidade." -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "Protocolo relativo" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "" "Should only be used with Cloudflare's flexible SSL feature. URLs of static " "files (CSS, JS, images) will be rewritten to use // instead of http:// or " @@ -2553,11 +2511,11 @@ msgstr "" "ficheiros estáticos (CSS, JS, imagens) serão reescritos para usar // em vez " "de http:// ou https://." -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "Credenciais do Sucuri" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "" "Firewall API key (for plugin), must be in format {32 characters}/{32 " @@ -2566,24 +2524,22 @@ msgstr "" "A chave de API da firewall (do plugin) tem de estar no formato {32 " "caracteres}/{32 caracteres}:" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "Consulte a sua chave de API" #. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: -#. opening a tag, %4$s: option a tag, %5$s: opening a tag. -#: inc/Engine/Admin/Settings/Page.php:2295 +#. opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 msgid "" -"%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our " -"brand new feature %3$sOptimize critical images%5$s is automatically " -"activated now! Also, the Cache tab was removed but the existing features " -"will remain working, %4$ssee more here%5$s." +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " +"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " +"more about it." msgstr "" -"%1$sWP Rocket:%2$s O plugin foi actualizado para a versão 3.16. A nova " -"funcionalidade de %3$sOptimizar imagens críticas%5$s foi automaticamente " -"activada! Além disto, o separador Cache foi removido, mas as funcionalidades" -" existentes continuarão a funcionar, %4$ssaiba mais aqui%5$s." +"%1$sWP Rocket:%2$s o plugin foi actualizado para a versão 3.17. Noca " +"funcionalidade: %3$sApresentação diferida de conteúdo%4$s. Consulte a nossa " +"documentação saber mais." #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" @@ -2602,25 +2558,25 @@ msgstr "" " URL porque isto desactiva o armazenamento de cache e as optimizações para " "cada página do seu site." -#: inc/Engine/Admin/Settings/Subscriber.php:172 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "Importar, exportar, reverter" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "Optimizar imagens" -#: inc/Engine/Admin/Settings/Subscriber.php:198 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "Comprima as suas imagens" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "Tutoriais" -#: inc/Engine/Admin/Settings/Subscriber.php:216 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "Vídeos de introdução e aprendizagem" @@ -2628,15 +2584,15 @@ msgstr "Vídeos de introdução e aprendizagem" msgid "WP Rocket Expired Cache Interval" msgstr "Intervalo de expiração da cache do WP Rocket" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "Valor de WP_CACHE" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "Cache" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "" "The WP_CACHE constant needs to be set to true for WP Rocket cache to work " "properly" @@ -2644,38 +2600,38 @@ msgstr "" "A constante WP_Cache tem de estar definida como 'true' para que a cache do " "WP Rocket funcione correctamente" -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "WP_CACHE está definida como true" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "WP_CACHE não está definida" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "WP_CACHE está definida como false" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "Data da próxima facturação" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "Sem subscrição" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "A sua assinatura da RocketCDN está activa." #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing #. tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "Para usar a RocketCDN, substitua o seu CNAME por %1$s%2$s%3$s." #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2743,16 +2699,16 @@ msgstr "RocketCDN desactivada" #. Translators: %s = date formatted using date_i18n() and get_option( #. 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "Válido apenas até %s!" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "Acelere o seu site com o seguinte:" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "" "High performance Content Delivery Network (CDN) with %1$sunlimited " "bandwidth%2$s" @@ -2761,7 +2717,7 @@ msgstr "" "ilimitada%2$s" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "" "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "" @@ -2769,7 +2725,7 @@ msgstr "" "automaticamente" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "" "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in" " our plugin" @@ -2777,12 +2733,12 @@ msgstr "" "Integração do WP Rocket: A opção da CDN é %1$sconfigurada " "automaticamente%2$s no nosso plugin" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "Saiba mais sobre a RocketCDN" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "" "*$%1$s/month for 12 months then $%2$s/month. You can cancel your " "subscription at any time." @@ -2790,34 +2746,34 @@ msgstr "" "*$%1$s por mês durante 12 meses, depois $%2$s por mês. Pode cancelar a sua " "subscrição a qualquer momento." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "Facturado mensalmente" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "Começar" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "Reduzir este banner" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "" "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "" "Acelere o seu site com a RocketCDN, a Content Delivery Network do WP Rocket." -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "Saiba mais" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "A RocketCDN não funciona em domínios locais e em sites de staging." -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "Obter RocketCDN" @@ -2831,6 +2787,18 @@ msgid "" msgstr "" "Acelere o seu site com a RocketCDN, a Content Delivery Network do WP Rocket!" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "Demasiados pedidos." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "Resposta inválida." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "Tipo de pedido inválido." + #: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "Tarefas pendentes de processo do WP Rocket" @@ -2843,11 +2811,54 @@ msgstr "Limpar tarefas falhadas do WP Rocket" msgid "WP Rocket process on submit jobs" msgstr "Processo do WP Rocket ao submeter tarefas" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Performance Hints data" +msgstr "Limpar dados das dicas de desempenho" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Performance Hints data of this URL" +msgstr "Limpar dados das dicas de desempenho deste URL" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Performance Hints" +msgstr "Dicas de desempenho" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +msgid "Clear" +msgstr "Limpar" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "" +"This action will clear data for Optimize Critical Images and Lazy Render " +"Content." +msgstr "" +"Estação irá limpar os dados da optimização de imagens críticas e da " +"apresentação diferida de conteúdo." + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "" +"%1$s: As imagens críticas e os dados de apresentação diferida foram limpos!" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "Erro de script" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "Tempo limite de script" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "Não foi possível determinar um tempo limite válido: %s." + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "A cada minuto" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "Regenerar CSS do caminho crítico" @@ -2875,7 +2886,6 @@ msgstr "%l para usar esta funcionalidade." msgid "Publish the %s" msgstr "Publique o(a) %s" -#. translators: %s = post type. #: inc/Engine/CriticalPath/Admin/Post.php:223 msgid "Enable Load CSS asynchronously in WP Rocket settings" msgstr "Active o carregamento assíncrono do CSS nas opções do WP Rocket" @@ -2890,7 +2900,7 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "O CSS crítico de %1$s não foi gerado. Erro: %2$s" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "empty response." @@ -2899,7 +2909,7 @@ msgstr "" "devolveu uma resposta vazia." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an empty " "response." @@ -2908,19 +2918,19 @@ msgstr "" "vazia." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "O CSS crítico de %1$s para dispositivos móveis não foi gerado." #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "O CSS crítico de %1$s não foi gerado." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "invalid response code." @@ -2929,7 +2939,7 @@ msgstr "" "devolveu um código de resposta inválido." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an invalid " "response code." @@ -2938,8 +2948,8 @@ msgstr "" "resposta inválido." #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "Erro: %1$s" @@ -3026,38 +3036,38 @@ msgid "Critical CSS file cannot be deleted" msgstr "Não foi possível eliminar o ficheiro de CSS crítico" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "O CSS crítico de %1$s para dispositivos móveis não foi gerado." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "Está em curso a geração do CSS crítico de %s." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "O CSS crítico de %s para dispositivos móveis foi gerado." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "O CSS crítico de %s foi gerado." -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "Ficheiro de CSS crítico eliminado com sucesso." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "Foi ultrapassado o tempo de execução da geração do CSS crítico de %1$s para " "dispositivos móveis. Tente de novo pouco mais tarde." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "Foi ultrapassado o tempo de execução da geração do CSS crítico de %1$s. " @@ -3189,39 +3199,39 @@ msgid "Unlimited" msgstr "Sem limite de" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "%s de desconto" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "Promoção %s!" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "Rápido! A oferta termina em:" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "Minutos" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "Segundos" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "Actualize agora" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "A funcionalidade de optimizar entrega do CSS está desactivada." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "" "You can no longer use the Remove Unused CSS or Load CSS asynchronously " "options." @@ -3230,7 +3240,7 @@ msgstr "" "CSS já não podem ser utilizadas." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "" "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, " "which addresses a PageSpeed Insights recommendation and improves your page " @@ -3240,26 +3250,26 @@ msgstr "" "de CSS, para cumprir a recomendação do PageSpeed Insights e melhorar o " "desempenho da sua página." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "Renove agora" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "Em breve irá perder acesso a algumas funcionalidades." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "" "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" "Precisa de uma %1$slicença activa para continuar a optimizar a entrega do " "CSS%2$s." -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "" "The Remove Unused CSS and Load CSS asynchronously features are great options" " to address the PageSpeed Insights recommendations and improve your website " @@ -3270,17 +3280,17 @@ msgstr "" "Insights e melhorar o desempenho do seu site." #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "" "Estas funcionalidades serão %1$sautomaticamente desactivadas em %3$s%2$s." -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "A sua licença do WP Rocket está expirada!" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "" "Your website could be much faster if it could take advantage of our %1$snew " "features and enhancements%2$s. 🚀" @@ -3289,7 +3299,7 @@ msgstr "" "%1$snovas funcionalidades e melhorias%2$s. 🚀" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "" "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access" " to product updates and support." @@ -3297,12 +3307,12 @@ msgstr "" "A %1$slicença do WP Rocket está prestes a expirar%2$s: em breve deixará de " "ter acesso às actualizações e suporte do produto." -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "Acelere mais sites" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "" "You can use WP Rocket on more websites by upgrading your license. To " "upgrade, simply pay the %1$sprice difference%2$s between your current and " @@ -3313,24 +3323,24 @@ msgstr "" "actual e a nova, como demostrado abaixo." #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "" "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "" "%1$sAtenção%2$s: Actualizar a licença não altera a sua data de expiração" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "Poupe $%s" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "%s sites" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "Actualizar para %s" @@ -3342,19 +3352,6 @@ msgstr "" "Pode usar o WP Rocket em mais sites ao actualizar a sua licença (apenas paga" " a diferença de preço entre a sua licença actual e a nova)." -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "%1$s: As imagens críticas foram limpas!" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 -msgid "Script error" -msgstr "Erro de script" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 -msgid "Script timeout" -msgstr "Tempo limite de script" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "Carregar imagens em diferido" @@ -3367,15 +3364,15 @@ msgstr "Carregar iframes/vídeos em diferido" msgid "LazyLoad CSS backgrounds" msgstr "Carregar fundos CSS em diferido" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "Dados analíticos e anúncios" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "Plugins" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "Temas" @@ -3423,17 +3420,22 @@ msgstr "Minificar/combinar JavaScript" msgid "Minify CSS" msgstr "Minificar CSS" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Remove Unused CSS" +msgstr "Remover CSS não utilizado" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, #. %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 msgid "" "%1$s: Could not create the %2$s table in the database which is necessary for" -" the Remove Unused CSS feature to work. Please reach out to %3$sour " -"support%4$s." +" the Remove Unused CSS feature to work. Please check our " +"%3$sdocumentation%4$s." msgstr "" "%1$s: Não foi possível criar a tabela %2$s na base de dados, necessária para" -" o funcionamento da opção de Remover CSS não utilizado. Por favor contacte o" -" %3$snosso suporte%4$s." +" o funcionamento da opção de Remover CSS não utilizado. Por favor consulte a" +" nossa %3$sdocumentação%4$s." #. translators: %1$s = plugin name. #: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:274 @@ -3441,7 +3443,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "%1$s: A cache do CSS utilizado foi limpa!" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "" "%1$s: The preload service is now active. After the initial preload it will " "continue to cache all your pages whenever they are purged. No further action" @@ -3460,29 +3462,17 @@ msgstr "Tarefas pendentes do pré-carregamento do WP Rocket" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "Reverter tarefas falhadas de pré-carregamento do WP Rocket" -#: inc/Engine/Saas/Admin/AdminBar.php:77 -#: inc/Engine/Saas/Admin/AdminBar.php:198 -msgid "Clear Critical Images" -msgstr "Limpar imagens críticas" - -#: inc/Engine/Saas/Admin/AdminBar.php:164 -msgid "Clear Critical Images of this URL" -msgstr "Limpar imagens críticas deste URL" - -#: inc/Engine/Saas/Admin/AdminBar.php:167 -msgid "Clear Used CSS of this URL" -msgstr "Limpar CSS utilizado deste URL" - -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Critical Images Cache" -msgstr "Cache de imagens críticas" +#: inc/Engine/Saas/Admin/AdminBar.php:51 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +msgid "Clear RUCSS optimizations" +msgstr "Limpar optimizações de RUCSS" -#: inc/Engine/Saas/Admin/AdminBar.php:201 -msgid "Remove Used CSS Cache" -msgstr "Remover cache do CSS utilizado" +#: inc/Engine/Saas/Admin/AdminBar.php:106 +msgid "Clear RUCSS optimizations of this URL" +msgstr "Limpar optimizações de RUCSS deste URL" #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "" "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing " "your pages, the plugin is optimizing LCP and the images above the fold." @@ -3493,7 +3483,7 @@ msgstr "" #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of #. seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." @@ -3502,18 +3492,18 @@ msgstr "" "\t\t\t O WP Rocket irá continuar a gerar CSS utilizado até %2$s URL por %3$s segundo(s)." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" "Sugerimos activar o %1$spré-carregamento%2$s para resultados mais rápidos." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:180 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" "Para saber mais sobre o processo consulte a nossa %1$sdocumentação%2$s." -#: inc/Engine/Saas/Admin/Notices.php:246 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3525,13 +3515,13 @@ msgstr "" "desempenho do seu site." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:249 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "" "Clique aqui para obter uma licença Single do WP Rocket com %1$s de desconto!" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:302 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3541,11 +3531,11 @@ msgstr "" " acesso do WP Rocket às funcionalidades de SaaS. Os IP listados %1$saqui na " "nossa documentação%2$s devem ser adicionados às suas listas de permissões:" -#: inc/Engine/Saas/Admin/Notices.php:307 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "- No plugin de segurança, se estiver a utilizar algum" -#: inc/Engine/Saas/Admin/Notices.php:308 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "" "- Na firewall do servidor. O seu serviço de alojamento pode ajudar nesta " @@ -3933,7 +3923,7 @@ msgstr[2] "" " Rocket:" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" @@ -3942,7 +3932,7 @@ msgstr "" "%2$sdesactivar emojis%3$s do WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP " @@ -3952,7 +3942,7 @@ msgstr "" "%2$scompressão GZIP%3$s do WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser " @@ -3962,7 +3952,7 @@ msgstr "" "%2$scache do navegador%3$s do WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "" "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" @@ -3971,7 +3961,7 @@ msgstr "" " de páginas%3$s do WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile " @@ -4257,7 +4247,6 @@ msgstr "CNAME da CDN" msgid "Purges RocketCDN cached resources for your website. %s" msgstr "Limpa os recursos na cache da RocketCDN para o seu site. %s" -#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:63 #: views/settings/page-sections/cloudflare.php:36 #: views/settings/page-sections/sucuri.php:37 @@ -4294,7 +4283,6 @@ msgstr "Cache da Cloudflare" msgid "Purges cached resources for your website. %s" msgstr "Limpa os recursos da cache do seu site. %s" -#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:36 msgid "https://support.cloudflare.com/hc/en-us/articles/200169246" msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" @@ -4353,35 +4341,48 @@ msgstr "Data de expiração" msgid "View my account" msgstr "Ver a minha conta" -#: views/settings/page-sections/dashboard.php:137 +#: views/settings/page-sections/dashboard.php:130 views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "Rocket Analytics" + +#. translators: %1$s = opening tag, %2$s = closing tag. +#: views/settings/page-sections/dashboard.php:136 +msgid "" +"I agree to share anonymous data with the development team to help improve WP" +" Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" +"Concordo em partilhar informações anónimas com a equipa de desenvolvimento " +"para ajudar a melhorar o WP Rocket. %1$sQue informações recolhemos?%2$s" + +#: views/settings/page-sections/dashboard.php:154 msgid "Quick Actions" msgstr "Acções rápidas" -#: views/settings/page-sections/dashboard.php:144 +#: views/settings/page-sections/dashboard.php:161 msgid "Remove all cached files" msgstr "Remover todos os ficheiros em cache" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:181 +#: views/settings/page-sections/dashboard.php:187 msgid "Regenerate Critical CSS" msgstr "Regenerar CSS crítico" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:213 msgid "Frequently Asked Questions" msgstr "Perguntas frequentes" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:227 msgid "Still cannot find a solution?" msgstr "Ainda não conseguiu encontrar uma solução?" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:228 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" "Submeta um ticket e obtenha ajuda dos nossos simpáticos e experientes " "Rocketeers." -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:236 msgid "Ask support" msgstr "Pedir suporte" @@ -4402,41 +4403,59 @@ msgstr "" msgid "Save Changes and Optimize" msgstr "Guardar alterações e optimizar" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 msgid "" -"%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image " -"optimization.%2$s" +"%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" msgstr "" -"O %1$sWP ROCKET%2$s criou o %3$sIMAGIFY%4$s %1$spara obter a melhor " -"optimização de imagens.%2$s" +"%1$sO WP Rocket criou o IMAGIFY para dar ao seu site um aumento extra de " +"velocidade!%2$s" + +#: views/settings/page-sections/imagify.php:28 +msgid "Images can account for 50% of your loading time!" +msgstr "As imagens podem ser responsáveis por 50% do tempo de carregamento!" -#: views/settings/page-sections/imagify.php:24 +#: views/settings/page-sections/imagify.php:31 msgid "" -"Compress image to make your website faster, all while maintaining image " -"quality." +"Imagify automatically optimizes all your images, helping your website gain " +"precious seconds while saving you time. With just one click, it resizes, " +"compresses, and converts your images to WebP and AVIF formats without " +"sacrificing quality." msgstr "" -"Comprima as imagens para tornar o seu site mais rápido, sem comprometer a " -"sua qualidade." +"O Imagify optimiza automaticamente todas as suas imagens, ajudando o seu " +"site a ganhar segundos preciosos e poupando-lhe tempo. Com apenas um clique," +" redimensiona, comprime e converte as suas imagens para os formatos WebP e " +"AVIF sem sacrificar a qualidade." -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" -msgstr "Mais sobre o Imagify:" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" +msgstr "%1$sComprima%2$s todas as imagens com um clique" -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" -msgstr "Página do plugin Imagify" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" +msgstr "%1$sConverta%2$s imagens para WebP e Avif" -#: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" -msgstr "Site do Imagify" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "%1$sRedimensione%2$s as suas imagens em tempo real" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" +msgstr "" +"%1$sO plano gratuito%2$s inclui 20MB/mês (aproximadamente 200 imagens)" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" -msgstr "Comparativo de plugins de compressão de imagens" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" +msgstr "" +"%1$sInstale o Imagify, o optimizador de imagens mais fácil para " +"WordPress%2$s" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "Instalar Imagify" From 4ece73262caad71adfc226808736b0eb264a8e0b Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Fri, 13 Sep 2024 19:57:18 +0300 Subject: [PATCH 159/192] update text changes --- inc/Engine/Common/PerformanceHints/Admin/AdminBar.php | 8 ++++---- inc/Engine/Saas/Admin/AdminBar.php | 11 ++++++----- inc/common/admin-bar.php | 4 ++-- views/settings/page-sections/dashboard.php | 8 +++++--- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php index a4955dce84..955d7f1027 100644 --- a/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php +++ b/inc/Engine/Common/PerformanceHints/Admin/AdminBar.php @@ -41,7 +41,7 @@ public function add_clear_performance_menu_item( WP_Admin_Bar $wp_admin_bar ): v return; } - $title = __( 'Clear Performance Hints data', 'rocket' ); + $title = __( 'Clear Priority Elements', 'rocket' ); $action = 'rocket_clean_performance_hints'; $this->add_menu_to_admin_bar( @@ -76,7 +76,7 @@ public function add_clear_url_performance_hints_menu_item( WP_Admin_Bar $wp_admi $action = 'rocket_clean_performance_hints_url'; - $title = __( 'Clear Performance Hints data of this URL', 'rocket' ); + $title = __( 'Clear Priority Elements of this URL', 'rocket' ); $this->add_url_menu_item_to_admin_bar( $wp_admin_bar, @@ -97,10 +97,10 @@ public function display_dashboard_button() { $this->dashboard_button( $context, - __( 'Performance Hints', 'rocket' ), + __( 'Priority Elements', 'rocket' ), esc_html__( 'Clear', 'rocket' ), 'rocket_clean_performance_hints', - __( 'This action will clear data for Optimize Critical Images and Lazy Render Content.', 'rocket' ) + __( 'This action will clear the Critical Images and Lazily Rendered Content.', 'rocket' ) ); } } diff --git a/inc/Engine/Saas/Admin/AdminBar.php b/inc/Engine/Saas/Admin/AdminBar.php index 86c53a62ef..54c266918d 100644 --- a/inc/Engine/Saas/Admin/AdminBar.php +++ b/inc/Engine/Saas/Admin/AdminBar.php @@ -48,7 +48,7 @@ public function __construct( Options_Data $options, ContextInterface $rucss_url_ * @return void */ public function add_clean_saas_menu_item( $wp_admin_bar ) { - $title = __( 'Clear RUCSS optimizations', 'rocket' ); + $title = __( 'Clear Used CSS', 'rocket' ); $action = 'rocket_clean_saas'; if ( 'local' === wp_get_environment_type() ) { @@ -103,7 +103,7 @@ public function add_clean_url_menu_item( WP_Admin_Bar $wp_admin_bar ) { $action = 'rocket_clean_saas_url'; - $title = __( 'Clear RUCSS optimizations of this URL', 'rocket' ); + $title = __( 'Clear Used CSS of this URL', 'rocket' ); $this->add_url_menu_item_to_admin_bar( $wp_admin_bar, @@ -130,9 +130,10 @@ public function display_dashboard_button() { $this->dashboard_button( $this->rucss_url_context->is_allowed(), - __( 'Remove Unused CSS', 'rocket' ), - esc_html__( 'Clear RUCSS optimizations', 'rocket' ), - 'rocket_clean_saas' + __( 'Used CSS', 'rocket' ), + esc_html__( 'Clear', 'rocket' ), + 'rocket_clean_saas', + esc_html__( 'This action will clear the used CSS files.', 'rocket' ) ); } } diff --git a/inc/common/admin-bar.php b/inc/common/admin-bar.php index 342b97ce1e..eb42177741 100755 --- a/inc/common/admin-bar.php +++ b/inc/common/admin-bar.php @@ -88,7 +88,7 @@ function rocket_admin_bar( $wp_admin_bar ) { [ 'parent' => 'wp-rocket', 'id' => 'purge-all', - 'title' => (bool) get_rocket_option( 'manual_preload', false ) ? __( 'Clear and preload cache', 'rocket' ) : __( 'Clear cache', 'rocket' ), + 'title' => (bool) get_rocket_option( 'manual_preload', false ) ? __( 'Clear and Preload Cache', 'rocket' ) : __( 'Clear Cache', 'rocket' ), ] ); @@ -151,7 +151,7 @@ function rocket_admin_bar( $wp_admin_bar ) { [ 'parent' => 'wp-rocket', 'id' => 'purge-all', - 'title' => (bool) get_rocket_option( 'manual_preload', false ) ? __( 'Clear and preload cache', 'rocket' ) : __( 'Clear cache', 'rocket' ), + 'title' => (bool) get_rocket_option( 'manual_preload', false ) ? __( 'Clear and Preload Cache', 'rocket' ) : __( 'Clear Cache', 'rocket' ), 'href' => wp_nonce_url( admin_url( 'admin-post.php?action=' . $action . '&type=all' . $referer ), $action . '_all' ), ] ); diff --git a/views/settings/page-sections/dashboard.php b/views/settings/page-sections/dashboard.php index 6204e93571..3068cbb2da 100644 --- a/views/settings/page-sections/dashboard.php +++ b/views/settings/page-sections/dashboard.php @@ -22,6 +22,7 @@ defined( 'ABSPATH' ) || exit; +$manual_preload = (bool) get_rocket_option( 'manual_preload', false ); ?>
@@ -158,18 +159,19 @@
-

+

+

render_action_button( 'link', 'purge_cache', [ - 'label' => (bool) get_rocket_option( 'manual_preload', false ) ? __( 'Clear and preload cache', 'rocket' ) : __( 'Clear cache', 'rocket' ), + 'label' => $manual_preload ? __( 'Clear and preload', 'rocket' ) : __( 'Clear', 'rocket' ), 'parameters' => [ 'type' => 'all', ], 'attributes' => [ - 'class' => 'wpr-button wpr-button--icon wpr-button--small wpr-icon-trash', + 'class' => 'wpr-button wpr-button--icon wpr-button--small wpr-icon-trash wpr-button--no-min-width', ], ] ); From 010dc12615e1986146e2aa0e17e0e527393b2dff Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Fri, 13 Sep 2024 20:06:33 +0300 Subject: [PATCH 160/192] update the pot file --- languages/rocket.pot | 966 ++++++++++++++++++++++--------------------- 1 file changed, 499 insertions(+), 467 deletions(-) diff --git a/languages/rocket.pot b/languages/rocket.pot index d1a6ee8b7e..3238be2852 100644 --- a/languages/rocket.pot +++ b/languages/rocket.pot @@ -2,14 +2,14 @@ # This file is distributed under the same license as the WP Rocket plugin. msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha2\n" +"Project-Id-Version: WP Rocket 3.17-alpha3\n" "Report-Msgid-Bugs-To: http://wp-rocket.me/\n" "Last-Translator: WP Media (http://wp-rocket.me/)\n" "Language-Team: WP Media (http://www.transifex.com/projects/p/wp-media/) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" +"POT-Creation-Date: 2024-09-13T20:01:15+03:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.7.1\n" "X-Domain: rocket\n" @@ -45,10 +45,10 @@ msgstr "" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 #: inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "Your site is hosted on %s, we have enabled Varnish auto-purge for compatibility." msgstr "" @@ -175,45 +175,35 @@ msgstr "" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to previous settings:" msgstr "" -#: inc/Addon/Cloudflare/Subscriber.php:661 +#: inc/Addon/Cloudflare/Subscriber.php:632 #: inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " @@ -319,7 +309,7 @@ msgstr "" #: inc/admin/admin.php:96 #: inc/admin/admin.php:117 #: inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "" @@ -352,19 +342,19 @@ msgid "Settings imported and saved." msgstr "" #: inc/admin/options.php:102 -#: inc/Engine/Admin/Settings/Page.php:571 +#: inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "" #: inc/admin/options.php:103 -#: inc/Engine/Admin/Settings/Page.php:725 +#: inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "" #: inc/admin/options.php:104 -#: inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "" @@ -377,22 +367,22 @@ msgid "Excluded Delay JavaScript Files" msgstr "" #: inc/admin/options.php:107 -#: inc/Engine/Admin/Settings/Page.php:1229 +#: inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "" #: inc/admin/options.php:108 -#: inc/Engine/Admin/Settings/Page.php:1243 +#: inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "" #: inc/admin/options.php:109 -#: inc/Engine/Admin/Settings/Page.php:1249 +#: inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "" #: inc/admin/options.php:110 -#: inc/Engine/Admin/Settings/Page.php:1530 +#: inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "" @@ -413,9 +403,6 @@ msgstr "" #: inc/admin/ui/meta-boxes.php:37 #: inc/admin/ui/notices.php:671 -#: inc/common/admin-bar.php:91 -#: inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 msgid "Clear cache" msgstr "" @@ -541,17 +528,16 @@ msgid "%s: User cache cleared." msgstr "" #: inc/admin/ui/notices.php:662 -#: inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 -#: views/settings/page-sections/dashboard.php:46 +#: inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 +#: views/settings/page-sections/dashboard.php:47 msgid "Dismiss this notice" msgstr "" #: inc/admin/ui/notices.php:682 -#: inc/Engine/Saas/Admin/AdminBar.php:84 -#: inc/Engine/Saas/Admin/AdminBar.php:202 +#: inc/Engine/Saas/Admin/AdminBar.php:51 msgid "Clear Used CSS" msgstr "" @@ -619,8 +605,8 @@ msgstr "" #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 #: inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "" @@ -638,8 +624,12 @@ msgstr "" #: inc/common/admin-bar.php:91 #: inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 -msgid "Clear and preload cache" +msgid "Clear and Preload Cache" +msgstr "" + +#: inc/common/admin-bar.php:91 +#: inc/common/admin-bar.php:154 +msgid "Clear Cache" msgstr "" #: inc/common/admin-bar.php:131 @@ -670,7 +660,7 @@ msgid "Documentation" msgstr "" #: inc/deprecated/3.2.php:52 -#: views/settings/page-sections/imagify.php:36 +#: views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "" @@ -776,7 +766,7 @@ msgstr "" #. translators: 1 and 3 are link openings, 2 is a link closing. #: inc/deprecated/3.11.php:279 -#: inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "" @@ -856,7 +846,7 @@ msgid "Choose a file from your computer (maximum size: %s)" msgstr "" #: inc/deprecated/deprecated.php:1294 -#: inc/Engine/Admin/Settings/Render.php:422 +#: inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "" @@ -952,8 +942,8 @@ msgid "Static Files" msgstr "" #: inc/deprecated/deprecated.php:1773 -#: inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "" @@ -963,24 +953,24 @@ msgid "Advanced" msgstr "" #: inc/deprecated/deprecated.php:1775 -#: inc/Engine/Admin/Settings/Page.php:1345 +#: inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "" #: inc/deprecated/deprecated.php:1776 -#: inc/Engine/Admin/Settings/Page.php:1051 +#: inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "" #: inc/deprecated/deprecated.php:1789 -#: inc/Engine/Admin/Settings/Page.php:357 -#: views/settings/page-sections/dashboard.php:80 +#: inc/Engine/Admin/Settings/Page.php:368 +#: views/settings/page-sections/dashboard.php:81 msgid "License" msgstr "" @@ -1006,27 +996,27 @@ msgid "weekly" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "" @@ -1068,937 +1058,910 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "" +#: inc/Engine/Admin/Settings/Page.php:278 #: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 #: inc/functions/admin.php:550 msgid "Unavailable" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:435 -#: views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "I agree to share anonymous data with the development team to help improve WP Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "%1$s Minification is currently activated in Autoptimize. If you want to use %2$s’s minification, disable this option in Autoptimize." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "%1$s Minification is currently activated in Autoptimize. If you want to use %2$s’s minification, disable those options in Autoptimize." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "If you have problems after activating this option, copy and paste the default exclusions to quickly resolve issues:" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "Also, please check our %1$sdocumentation%2$s for a list of compatibility exclusions." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "Internal scripts are excluded by default to prevent issues. Remove them to take full advantage of this option." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "If you notice any errors on your website after having activated this setting, just deactivate it again, and your site will be back to normal." -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "Internal: The domain part of the URL will be stripped automatically. Use (.*).css wildcards to exclude all CSS files located at a specific path." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "3rd Party: Use either the full URL path or only the domain name, to exclude external CSS. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "Optimize CSS delivery eliminates render-blocking CSS on your website. Only one method can be selected. Remove Unused CSS is recommended for optimal performance, but limited only to the users with active license." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "Optimize CSS delivery eliminates render-blocking CSS on your website. Only one method can be selected. Remove Unused CSS is recommended for optimal performance." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "Optimize CSS Delivery features are disabled on local environments. %1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "Removes unused CSS per page and helps to reduce page size and HTTP requests. Recommended for best performance. Test thoroughly! %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "If you notice any errors on your website after having activated this setting, just deactivate it again, and your site will be back to normal." +msgstr "" + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "Specify CSS filenames, IDs or classes that should not be removed (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "Load CSS asynchronously is currently handled by the %1$s plugin. If you want to use WP Rocket’s load CSS asynchronously option, disable the %1$s plugin." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "Provides a fallback if auto-generated critical path CSS is incomplete. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "Combine JavaScript files combines your site’s internal, 3rd party and inline JS reducing HTTP requests. Not recommended if your site uses HTTP/2. %1$sMore info%2$s" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "For compatibility and best results, this option is disabled when delay javascript execution is enabled." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "Specify patterns of inline JavaScript to be excluded from concatenation (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "Specify URLs of JavaScript files to be excluded from minification and concatenation (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "Internal: The domain part of the URL will be stripped automatically. Use (.*).js wildcards to exclude all JS files located at a specific path." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "3rd Party: Use either the full URL path or only the domain name, to exclude external JS. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "Load JavaScript deferred eliminates render-blocking JS on your site and can improve load time. %1$sMore info%2$s" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "Specify URLs or keywords of JavaScript files to be excluded from defer (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "Improves performance by delaying the loading of JavaScript files until user interaction (e.g. scroll, click). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "When using the Delay JavaScript Execution, you might experience delay loading elements located in the viewport that need to appear immediately - e.g. slider, header, menu." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "If you need instant visibility, click below on files that should NOT be delayed. This selection will help users interact with the elements straight away." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "Specify URLs or keywords that can identify inline or JavaScript files to be excluded from delaying execution (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "It can improve actual and perceived loading time as images, iframes, and videos will be loaded only as they enter (or about to enter) the viewport and reduces the number of HTTP requests. %1$sMore Info%2$s" msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s LazyLoad, disable this option in %2$s." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "Add missing width and height attributes to images. Helps prevent layout shifts and improve the reading experience for your visitors. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "LazyLoad for images is currently activated in %2$s. If you want to use %1$s’s LazyLoad, disable this option in %2$s." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "This can significantly improve your loading time if you have a lot of YouTube videos on a page." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from the image or iframe code to be excluded (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "When you enable preloading WP Rocket will automatically detect your sitemaps and save all URLs to the database. The plugin will make sure that your cache is always preloaded." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "Link preloading improves the perceived load time by downloading a page when a user hovers over the link. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "DNS prefetching can make external files load faster, especially on mobile networks" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "Improves performance by helping browsers discover fonts in CSS files. %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "Specify URLs to be excluded from the preload feature (one per line). %1$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "Specify external hosts to be prefetched (no http:, one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "Specify urls of the font files to be preloaded (one per line). Fonts must be hosted on your own domain, or the domain you have specified on the CDN tab." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "The domain part of the URL will be stripped automatically.
Allowed font extensions: otf, ttf, svg, woff, woff2." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "
Cart, checkout and \"my account\" pages set in %1$s%2$s%3$s will be detected and never cached by default." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "Cache files older than the specified lifespan will be deleted.
Enable %1$spreloading%2$s for the cache to be rebuilt automatically after lifespan expiration." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "%1$sCache for query strings%2$s enables you to force caching for specific GET parameters." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "Reduce lifespan to 10 hours or less if you notice issues that seem to appear periodically. %1$sWhy?%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "The domain part of the URL will be stripped automatically.
Use (.*) wildcards to address multiple URLs under a given path." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "Specify full or partial IDs of cookies that, when set in the visitor's browser, should prevent a page from getting cached (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "Specify user agent strings that should never see cached pages (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "Specify URLs you always want purged from cache whenever you update any post or page (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "Post revisions and drafts will be permanently deleted. Do not use this option if you need to retain revisions or drafts." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "Transients are temporary options; they are safe to remove. They will be automatically regenerated as your plugins require them." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "" msgstr[1] "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "" #. translators: %s is the number of revisions found in the database. It's a formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s) you provide." msgstr "" #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "Not required for services like Cloudflare and Sucuri. Please see our available %1$sAdd-ons%2$s." msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings is not required for %2$l to work on your site." msgid_plural "%1$s%2$l Add-ons%3$s are currently enabled. Configuration of the CDN settings is not required for %2$l to work on your site." msgstr[0] "" msgstr[1] "" -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "The domain part of the URL will be stripped automatically.
Use (.*) wildcards to exclude all files of a given file type located at a specific path." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "Reducing or disabling the Heartbeat API’s activity can help save some of your server’s resources." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "Reducing activity will change Heartbeat frequency from one hit each minute to one hit every 2 minutes." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "One-Click Add-ons are features extending available options without configuration needed. Switch the option \"on\" to enable from this screen." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "If you need to create a dedicated set of cache files for each logged-in WordPress user, you must activate this add-on." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "User cache is great when you have user-specific or restricted content on your website.
%1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "Provide your account email, global API key, and domain to use options such as clearing the Cloudflare cache and enabling optimal settings with WP Rocket." msgstr "" #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just activate the official Cloudflare plugin and configure it. WP Rocket will automatically enable compatibility." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "Varnish cache will be purged each time WP Rocket clears its cache to ensure content is always up-to-date.
%1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "" #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "Enable this option if you would like WP Rocket to serve WebP images to compatible browsers. Please note that WP Rocket cannot create WebP images for you. To create WebP images we recommend %1$sImagify%2$s. %3$sMore info%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "Temporarily activate development mode on your website. This setting will automatically turn off after 3 hours. %1$sLearn more%2$s" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "Automatically enhances your Cloudflare configuration for speed, performance grade and compatibility." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "Should only be used with Cloudflare's flexible SSL feature. URLs of static files (CSS, JS, images) will be rewritten to use // instead of http:// or https://." msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "Firewall API key (for plugin), must be in format {32 characters}/{32 characters}:" msgstr "" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "" -#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: option a tag, %5$s: opening a tag. -#: inc/Engine/Admin/Settings/Page.php:2295 -msgid "%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our brand new feature %3$sOptimize critical images%5$s is automatically activated now! Also, the Cache tab was removed but the existing features will remain working, %4$ssee more here%5$s." +#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 +msgid "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New feature: %3$sLazy Render Content%4$s. Check out our documentation to learn more about it." msgstr "" #: inc/Engine/Admin/Settings/Settings.php:361 @@ -2009,25 +1972,25 @@ msgstr "" msgid "Sorry! Adding /(.*) in Advanced Rules > Never Cache URL(s) was not saved because it disables caching and optimizations for every page on your site." msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:172 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:198 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "" -#: inc/Engine/Admin/Settings/Subscriber.php:216 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "" @@ -2035,49 +1998,49 @@ msgstr "" msgid "WP Rocket Expired Cache Interval" msgstr "" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "The WP_CACHE constant needs to be set to true for WP Rocket cache to work properly" msgstr "" -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "" #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "" #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2133,64 +2096,64 @@ msgid "RocketCDN disabled" msgstr "" #. Translators: %s = date formatted using date_i18n() and get_option( 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "High performance Content Delivery Network (CDN) with %1$sunlimited bandwidth%2$s" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in our plugin" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "*$%1$s/month for 12 months then $%2$s/month. You can cancel your subscription at any time." msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "" @@ -2202,6 +2165,18 @@ msgstr "" msgid "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network!" msgstr "" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "" + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "" + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "" + #: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "" @@ -2214,11 +2189,51 @@ msgstr "" msgid "WP Rocket process on submit jobs" msgstr "" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Priority Elements" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Priority Elements of this URL" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Priority Elements" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "This action will clear the Critical Images and Lazily Rendered Content." +msgstr "" + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "" + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "" @@ -2260,40 +2275,40 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "Critical CSS for %1$s on mobile not generated. Error: The API returned an empty response." msgstr "" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "Critical CSS for %1$s not generated. Error: The API returned an empty response." msgstr "" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "" #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "" #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "Critical CSS for %1$s on mobile not generated. Error: The API returned an invalid response code." msgstr "" #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "Critical CSS for %1$s not generated. Error: The API returned an invalid response code." msgstr "" #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "" @@ -2360,36 +2375,36 @@ msgid "Critical CSS file cannot be deleted" msgstr "" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "" -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "" #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" @@ -2485,112 +2500,112 @@ msgid "Unlimited" msgstr "" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "You can no longer use the Remove Unused CSS or Load CSS asynchronously options." msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, which addresses a PageSpeed Insights recommendation and improves your page performance." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "The Remove Unused CSS and Load CSS asynchronously features are great options to address the PageSpeed Insights recommendations and improve your website performance." msgstr "" #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "" -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "Your website could be much faster if it could take advantage of our %1$snew features and enhancements%2$s. 🚀" msgstr "" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access to product updates and support." msgstr "" -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "You can use WP Rocket on more websites by upgrading your license. To upgrade, simply pay the %1$sprice difference%2$s between your current and new licenses, as shown below." msgstr "" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "" @@ -2598,19 +2613,6 @@ msgstr "" msgid "You can use WP Rocket on more websites by upgrading your license (you will only pay the price difference between your current and new licenses)." msgstr "" -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 -msgid "Script error" -msgstr "" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 -msgid "Script timeout" -msgstr "" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "" @@ -2623,15 +2625,15 @@ msgstr "" msgid "LazyLoad CSS backgrounds" msgstr "" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "" @@ -2675,9 +2677,13 @@ msgstr "" msgid "Minify CSS" msgstr "" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +msgid "Remove Unused CSS" +msgstr "" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 -msgid "%1$s: Could not create the %2$s table in the database which is necessary for the Remove Unused CSS feature to work. Please reach out to %3$sour support%4$s." +msgid "%1$s: Could not create the %2$s table in the database which is necessary for the Remove Unused CSS feature to work. Please check our %3$sdocumentation%4$s." msgstr "" #. translators: %1$s = plugin name. @@ -2686,7 +2692,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "%1$s: The preload service is now active. After the initial preload it will continue to cache all your pages whenever they are purged. No further action is needed." msgstr "" @@ -2698,68 +2704,59 @@ msgstr "" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "" -#: inc/Engine/Saas/Admin/AdminBar.php:77 -#: inc/Engine/Saas/Admin/AdminBar.php:198 -msgid "Clear Critical Images" -msgstr "" - -#: inc/Engine/Saas/Admin/AdminBar.php:164 -msgid "Clear Critical Images of this URL" -msgstr "" - -#: inc/Engine/Saas/Admin/AdminBar.php:167 +#: inc/Engine/Saas/Admin/AdminBar.php:106 msgid "Clear Used CSS of this URL" msgstr "" -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Critical Images Cache" +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" msgstr "" -#: inc/Engine/Saas/Admin/AdminBar.php:201 -msgid "Remove Used CSS Cache" +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." msgstr "" #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing your pages, the plugin is optimizing LCP and the images above the fold." msgstr "" #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." msgstr "" #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:180 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" -#: inc/Engine/Saas/Admin/Notices.php:246 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "We couldn't generate the used CSS because you're using a nulled version of WP Rocket. You need an active license to use the Remove Unused CSS feature and further improve your website's performance." msgstr "" #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:249 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:302 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "It seems a security plugin or the server's firewall prevents WP Rocket from accessing the SaaS features. IPs listed %1$shere in our documentation%2$s should be added to your allowlists:" msgstr "" -#: inc/Engine/Saas/Admin/Notices.php:307 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "" -#: inc/Engine/Saas/Admin/Notices.php:308 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "" @@ -3017,31 +3014,31 @@ msgstr[0] "" msgstr[1] "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP compression%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser caching%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" msgstr "" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile optimization%3$s" msgstr "" @@ -3299,76 +3296,98 @@ msgstr "" msgid "Clear all Cloudflare cache files" msgstr "" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "" -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "To guarantee fast websites, WP Rocket automatically applies 80% of web performance best practices." msgstr "" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "We also enable options that provide immediate benefits to your website." msgstr "" -#: views/settings/page-sections/dashboard.php:45 +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" msgstr "" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "" +#: views/settings/page-sections/dashboard.php:131 +#: views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "" + +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/dashboard.php:137 +msgid "I agree to share anonymous data with the development team to help improve WP Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" + +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "" -#: views/settings/page-sections/dashboard.php:144 -msgid "Remove all cached files" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "" + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." msgstr "" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "" + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "" + +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:230 msgid "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "" @@ -3384,32 +3403,45 @@ msgstr "" msgid "Save Changes and Optimize" msgstr "" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 -msgid "%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image optimization.%2$s" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 +msgid "%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" +msgstr "" + +#: views/settings/page-sections/imagify.php:28 +msgid "Images can account for 50% of your loading time!" msgstr "" -#: views/settings/page-sections/imagify.php:24 -msgid "Compress image to make your website faster, all while maintaining image quality." +#: views/settings/page-sections/imagify.php:31 +msgid "Imagify automatically optimizes all your images, helping your website gain precious seconds while saving you time. With just one click, it resizes, compresses, and converts your images to WebP and AVIF formats without sacrificing quality." msgstr "" -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" msgstr "" -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" msgstr "" -#: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" msgstr "" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" msgstr "" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "" From 1da69c9c323bdb8300bd64277c93e1763a973124 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Fri, 13 Sep 2024 20:13:36 +0300 Subject: [PATCH 161/192] update version to alpha4 --- wp-rocket.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp-rocket.php b/wp-rocket.php index 3e3efc2539..e513867de7 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.17-alpha3 + * Version: 3.17-alpha4 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.17-alpha3' ); +define( 'WP_ROCKET_VERSION', '3.17-alpha4' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' ); From 1c90eab3f38a5a52b14a80d46e017838c879a63e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Fri, 13 Sep 2024 22:55:00 +0000 Subject: [PATCH 162/192] Translate languages/rocket.pot in pt_PT 100% translated source file: 'languages/rocket.pot' on 'pt_PT'. --- languages/rocket-pt_PT.po | 116 ++++++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 50 deletions(-) diff --git a/languages/rocket-pt_PT.po b/languages/rocket-pt_PT.po index faad75bd3f..9e1930db42 100644 --- a/languages/rocket-pt_PT.po +++ b/languages/rocket-pt_PT.po @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.17-alpha3\n" +"Project-Id-Version: WP Rocket 3.17-alpha4\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-09-11T13:45:18+00:00\n" +"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Pedro Mendonça , 2024\n" "Language-Team: Portuguese (Portugal) (https://app.transifex.com/wp-media/teams/18133/pt_PT/)\n" @@ -460,8 +460,6 @@ msgid "More info" msgstr "Mais informações" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 -#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:167 msgid "Clear cache" msgstr "Limpar cache" @@ -650,11 +648,11 @@ msgstr "%s: A cache do utilizador foi limpa." #: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 #: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 #: inc/Engine/License/views/renewal-expired-banner.php:32 -#: views/settings/page-sections/dashboard.php:46 +#: views/settings/page-sections/dashboard.php:47 msgid "Dismiss this notice" msgstr "Descartar esta notificação" -#: inc/admin/ui/notices.php:682 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:51 msgid "Clear Used CSS" msgstr "Limpar CSS utilizado" @@ -764,10 +762,13 @@ msgstr "" "working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:167 -msgid "Clear and preload cache" +msgid "Clear and Preload Cache" msgstr "Limpar e pré-carregar cache" +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear Cache" +msgstr "Limpar cache" + #: inc/common/admin-bar.php:131 inc/functions/i18n.php:20 msgid "All languages" msgstr "Todos os idiomas" @@ -1130,7 +1131,7 @@ msgid "Tools" msgstr "Ferramentas" #: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 -#: views/settings/page-sections/dashboard.php:80 +#: views/settings/page-sections/dashboard.php:81 msgid "License" msgstr "Licença" @@ -2812,28 +2813,29 @@ msgid "WP Rocket process on submit jobs" msgstr "Processo do WP Rocket ao submeter tarefas" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 -msgid "Clear Performance Hints data" -msgstr "Limpar dados das dicas de desempenho" +msgid "Clear Priority Elements" +msgstr "Limpar elementos prioritários" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 -msgid "Clear Performance Hints data of this URL" -msgstr "Limpar dados das dicas de desempenho deste URL" +msgid "Clear Priority Elements of this URL" +msgstr " Limpar elementos prioritários deste URL" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 -msgid "Performance Hints" -msgstr "Dicas de desempenho" +msgid "Priority Elements" +msgstr "Elementos prioritários" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 msgid "Clear" msgstr "Limpar" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 msgid "" -"This action will clear data for Optimize Critical Images and Lazy Render " -"Content." +"This action will clear the Critical Images and Lazily Rendered Content." msgstr "" -"Estação irá limpar os dados da optimização de imagens críticas e da " -"apresentação diferida de conteúdo." +"Esta acção irá limpar as imagens críticas e os conteúdos de apresentação " +"diferida." #. translators: %1$s = plugin name. #: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 @@ -3421,7 +3423,6 @@ msgid "Minify CSS" msgstr "Minificar CSS" #: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -#: inc/Engine/Saas/Admin/AdminBar.php:133 msgid "Remove Unused CSS" msgstr "Remover CSS não utilizado" @@ -3462,14 +3463,17 @@ msgstr "Tarefas pendentes do pré-carregamento do WP Rocket" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "Reverter tarefas falhadas de pré-carregamento do WP Rocket" -#: inc/Engine/Saas/Admin/AdminBar.php:51 -#: inc/Engine/Saas/Admin/AdminBar.php:134 -msgid "Clear RUCSS optimizations" -msgstr "Limpar optimizações de RUCSS" - #: inc/Engine/Saas/Admin/AdminBar.php:106 -msgid "Clear RUCSS optimizations of this URL" -msgstr "Limpar optimizações de RUCSS deste URL" +msgid "Clear Used CSS of this URL" +msgstr "Limpar CSS utilizado deste URL" + +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" +msgstr "CSS utilizado" + +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." +msgstr "Esta acção irá limpar os ficheiros de CSS utilizados." #. translators: %1$s = plugin name, %2$s = number of seconds. #: inc/Engine/Saas/Admin/Notices.php:91 @@ -4291,19 +4295,19 @@ msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" msgid "Clear all Cloudflare cache files" msgstr "Limpar todos os ficheiros da cache da Cloudflare" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "Parabéns!" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "O WP Rocket já está activo e a funcionar." -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "O seu site já deve estar a carregar mais rapidamente!" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "To guarantee fast websites, WP Rocket automatically applies 80% of web " "performance best practices." @@ -4311,42 +4315,42 @@ msgstr "" "Para garantir sites mais rápidos o WP Rocket aplica automaticamente 80% das " "melhores práticas de desempenho da web." -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "We also enable options that provide immediate benefits to your website." msgstr "" "Também activamos opções que permitem benefícios imediatos para o seu site." -#: views/settings/page-sections/dashboard.php:45 +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" msgstr "Continue para as opções para optimizar ainda mais o seu site!" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "A minha conta" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "Actualizar informações" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "com" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "Data de expiração" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "Ver a minha conta" -#: views/settings/page-sections/dashboard.php:130 views/settings/page.php:75 +#: views/settings/page-sections/dashboard.php:131 views/settings/page.php:75 msgid "Rocket Analytics" msgstr "Rocket Analytics" #. translators: %1$s = opening tag, %2$s = closing tag. -#: views/settings/page-sections/dashboard.php:136 +#: views/settings/page-sections/dashboard.php:137 msgid "" "I agree to share anonymous data with the development team to help improve WP" " Rocket. %1$sWhat info will we collect?%2$s" @@ -4354,35 +4358,47 @@ msgstr "" "Concordo em partilhar informações anónimas com a equipa de desenvolvimento " "para ajudar a melhorar o WP Rocket. %1$sQue informações recolhemos?%2$s" -#: views/settings/page-sections/dashboard.php:154 +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "Acções rápidas" -#: views/settings/page-sections/dashboard.php:161 -msgid "Remove all cached files" -msgstr "Remover todos os ficheiros em cache" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "Ficheiros de cache" + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." +msgstr "Esta acção irá limpar e pré-carregar todos os ficheiros da cache." + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "Esta acção irá limpar todos os ficheiros de cache." + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "Limpar e pré-carregar" -#: views/settings/page-sections/dashboard.php:181 -#: views/settings/page-sections/dashboard.php:187 +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "Regenerar CSS crítico" -#: views/settings/page-sections/dashboard.php:213 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "Perguntas frequentes" -#: views/settings/page-sections/dashboard.php:227 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "Ainda não conseguiu encontrar uma solução?" -#: views/settings/page-sections/dashboard.php:228 +#: views/settings/page-sections/dashboard.php:230 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" "Submeta um ticket e obtenha ajuda dos nossos simpáticos e experientes " "Rocketeers." -#: views/settings/page-sections/dashboard.php:236 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "Pedir suporte" From c51b132e08c3a4b6ec7c5c1d1f2fc9b62d228c49 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 14 Sep 2024 18:42:02 +0000 Subject: [PATCH 163/192] Translate languages/rocket.pot in tr_TR 100% translated source file: 'languages/rocket.pot' on 'tr_TR'. --- languages/rocket-tr_TR.po | 118 +++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 52 deletions(-) diff --git a/languages/rocket-tr_TR.po b/languages/rocket-tr_TR.po index 730cff1b76..fc8e949ec1 100644 --- a/languages/rocket-tr_TR.po +++ b/languages/rocket-tr_TR.po @@ -8,9 +8,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.17-alpha3\n" +"Project-Id-Version: WP Rocket 3.17-alpha4\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-09-11T13:45:18+00:00\n" +"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: BouRock, 2024\n" "Language-Team: Turkish (Turkey) (https://app.transifex.com/wp-media/teams/18133/tr_TR/)\n" @@ -457,8 +457,6 @@ msgid "More info" msgstr "Daha fazla bilgi" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 -#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:167 msgid "Clear cache" msgstr "Önbelleği temizle" @@ -645,11 +643,11 @@ msgstr "%s: Kullanıcı önbelleği temizlendi." #: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 #: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 #: inc/Engine/License/views/renewal-expired-banner.php:32 -#: views/settings/page-sections/dashboard.php:46 +#: views/settings/page-sections/dashboard.php:47 msgid "Dismiss this notice" msgstr "Bu bildirimi anımsatma" -#: inc/admin/ui/notices.php:682 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:51 msgid "Clear Used CSS" msgstr "Kullanılan CSS’yi Temizle" @@ -757,9 +755,12 @@ msgstr "" "working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:167 -msgid "Clear and preload cache" -msgstr "Önbelleği temizle ve önyükle" +msgid "Clear and Preload Cache" +msgstr "Önbelleği Temizle ve Önyükle" + +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear Cache" +msgstr "Önbelleği Temizle" #: inc/common/admin-bar.php:131 inc/functions/i18n.php:20 msgid "All languages" @@ -1120,7 +1121,7 @@ msgid "Tools" msgstr "Araçlar" #: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 -#: views/settings/page-sections/dashboard.php:80 +#: views/settings/page-sections/dashboard.php:81 msgid "License" msgstr "Lisans" @@ -2798,28 +2799,27 @@ msgid "WP Rocket process on submit jobs" msgstr "Gönderme işlerinde WP Roket süreci" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 -msgid "Clear Performance Hints data" -msgstr "Performans İpuçları verilerini temizle" +msgid "Clear Priority Elements" +msgstr "Öncelikli Öğeleri Temizle" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 -msgid "Clear Performance Hints data of this URL" -msgstr "Bu URL’nin Performans İpuçları verilerini temizle" +msgid "Clear Priority Elements of this URL" +msgstr "Bu URL'nin Öncelikli Öğelerini Temizle" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 -msgid "Performance Hints" -msgstr "Performans İpuçları" +msgid "Priority Elements" +msgstr "Öncelikli Öğeler" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 msgid "Clear" msgstr "Temizle" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 msgid "" -"This action will clear data for Optimize Critical Images and Lazy Render " -"Content." -msgstr "" -"Bu eylem, Önemli Resimleri İyileştirmeye ve Lazy Render İçeriğine ilişkin " -"verileri temizleyecek." +"This action will clear the Critical Images and Lazily Rendered Content." +msgstr "Bu eylem, Önemli Resimleri ve Geç İşlenmiş İçeriği temizleyecek." #. translators: %1$s = plugin name. #: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 @@ -3402,7 +3402,6 @@ msgid "Minify CSS" msgstr "CSS’yi küçült" #: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -#: inc/Engine/Saas/Admin/AdminBar.php:133 msgid "Remove Unused CSS" msgstr "Kullanılmayan CSS’yi Kaldır" @@ -3442,14 +3441,17 @@ msgstr "WP Rocket Önyükleme bekleyen işler" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "WP Rocket Önyükleme, sıkışmış başarısız işleri geri alır" -#: inc/Engine/Saas/Admin/AdminBar.php:51 -#: inc/Engine/Saas/Admin/AdminBar.php:134 -msgid "Clear RUCSS optimizations" -msgstr "RUCSS iyileştirmelerini temizle" - #: inc/Engine/Saas/Admin/AdminBar.php:106 -msgid "Clear RUCSS optimizations of this URL" -msgstr "Bu URL’nin RUCSS iyileştirmelerini temizle" +msgid "Clear Used CSS of this URL" +msgstr "Bu URL’nin Kullanılan CSS’sini Temizle" + +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" +msgstr "Kullanılan CSS" + +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." +msgstr "Bu eylem, kullanılan CSS dosyalarını temizleyecek." #. translators: %1$s = plugin name, %2$s = number of seconds. #: inc/Engine/Saas/Admin/Notices.php:91 @@ -4265,19 +4267,19 @@ msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" msgid "Clear all Cloudflare cache files" msgstr "Tüm Cloudflare önbellek dosyalarını temizle" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "Tebrikler!" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "WP Rocket şu an aktif edildi ve halen sizin için çalışıyor." -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "Web siteniz artık daha hızlı yüklenmelidir!" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "To guarantee fast websites, WP Rocket automatically applies 80% of web " "performance best practices." @@ -4285,42 +4287,42 @@ msgstr "" "Hızlı web sitelerini garantilemek için en iyi WP Rocket web performans " "uygulamalarının %80’ini otomatik olarak uygular." -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "We also enable options that provide immediate benefits to your website." msgstr "" "Ayrıca web sitenize anında fayda sağlayan seçenekleri etkinleştiriyoruz." -#: views/settings/page-sections/dashboard.php:45 +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" msgstr "Sitenizi daha da iyileştirmek için seçeneklere devam edin!" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "Hesabım" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "Bilgiyi yenile" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "birlikte" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "Bitiş Tarihi" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "Hesabımı göster" -#: views/settings/page-sections/dashboard.php:130 views/settings/page.php:75 +#: views/settings/page-sections/dashboard.php:131 views/settings/page.php:75 msgid "Rocket Analytics" msgstr "Rocket Çözümsel" #. translators: %1$s = opening tag, %2$s = closing tag. -#: views/settings/page-sections/dashboard.php:136 +#: views/settings/page-sections/dashboard.php:137 msgid "" "I agree to share anonymous data with the development team to help improve WP" " Rocket. %1$sWhat info will we collect?%2$s" @@ -4328,35 +4330,47 @@ msgstr "" "WP Rocket’i iyileştirmeye yardımcı olmak için geliştirme ekibiyle isimsiz " "verileri paylaşmayı kabul ediyorum. %1$sNe tür bilgi toplayacağız?%2$s" -#: views/settings/page-sections/dashboard.php:154 +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "Hızlı Eylemler" -#: views/settings/page-sections/dashboard.php:161 -msgid "Remove all cached files" -msgstr "Tüm önbelleklenen dosyaları kaldırın" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "Önbellek dosyaları" + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." +msgstr "Bu eylem tüm önbellek dosyalarını temizleyecek ve önyükleme yapacak." + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "Bu eylem tüm önbellek dosyalarını temizleyecek." + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "Temizle ve önyükle" -#: views/settings/page-sections/dashboard.php:181 -#: views/settings/page-sections/dashboard.php:187 +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "Önemli CSS’yi yeniden oluştur" -#: views/settings/page-sections/dashboard.php:213 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "Sıkça Sorulan Sorular" -#: views/settings/page-sections/dashboard.php:227 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "Hala bir çözüm bulamadınız mı?" -#: views/settings/page-sections/dashboard.php:228 +#: views/settings/page-sections/dashboard.php:230 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" "Bir çağrı gönderin ve arkadaş yanlısı ve bilgili Roketçilerimizden yardım " "alın." -#: views/settings/page-sections/dashboard.php:236 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "Destek iste" From 29bc5c153e0ef97d000d81fe5f822adad7f00f5e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 14 Sep 2024 18:51:25 +0000 Subject: [PATCH 164/192] Translate languages/rocket.pot in tr_TR 100% translated source file: 'languages/rocket.pot' on 'tr_TR'. --- languages/rocket-tr_TR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-tr_TR.po b/languages/rocket-tr_TR.po index fc8e949ec1..db6d6fe27c 100644 --- a/languages/rocket-tr_TR.po +++ b/languages/rocket-tr_TR.po @@ -3451,7 +3451,7 @@ msgstr "Kullanılan CSS" #: inc/Engine/Saas/Admin/AdminBar.php:136 msgid "This action will clear the used CSS files." -msgstr "Bu eylem, kullanılan CSS dosyalarını temizleyecek." +msgstr "Bu eylem kullanılan CSS dosyalarını temizleyecek." #. translators: %1$s = plugin name, %2$s = number of seconds. #: inc/Engine/Saas/Admin/Notices.php:91 From 766475cec8ca9bf5c40a6d8b0167b7361a35853e Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Sat, 14 Sep 2024 18:51:36 +0000 Subject: [PATCH 165/192] Translate languages/rocket.pot in tr_TR 100% translated source file: 'languages/rocket.pot' on 'tr_TR'. --- languages/rocket-tr_TR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-tr_TR.po b/languages/rocket-tr_TR.po index db6d6fe27c..eac7b902f9 100644 --- a/languages/rocket-tr_TR.po +++ b/languages/rocket-tr_TR.po @@ -2819,7 +2819,7 @@ msgstr "Temizle" #: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 msgid "" "This action will clear the Critical Images and Lazily Rendered Content." -msgstr "Bu eylem, Önemli Resimleri ve Geç İşlenmiş İçeriği temizleyecek." +msgstr "Bu eylem Önemli Resimleri ve Geç İşlenmiş İçeriği temizleyecek." #. translators: %1$s = plugin name. #: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 From b95bef488947b94d1aad06e9700c42bec3ef2760 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 06:14:13 +0000 Subject: [PATCH 166/192] Translate languages/rocket.pot in fa_IR 100% translated source file: 'languages/rocket.pot' on 'fa_IR'. --- languages/rocket-fa_IR.po | 1047 +++++++++++++++++++------------------ 1 file changed, 538 insertions(+), 509 deletions(-) diff --git a/languages/rocket-fa_IR.po b/languages/rocket-fa_IR.po index b334d6bf46..b5bd934ee3 100644 --- a/languages/rocket-fa_IR.po +++ b/languages/rocket-fa_IR.po @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha2\n" -"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" -"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" +"Project-Id-Version: WP Rocket 3.17-alpha4\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" +"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Mohammad Yousefzadeh , 2024\n" "Language-Team: Persian (Iran) (https://app.transifex.com/wp-media/teams/18133/fa_IR/)\n" @@ -17,7 +17,7 @@ msgstr "" "Language: fa_IR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.7.1\n" +"X-Generator: WP-CLI 2.4.0\n" #. Plugin Name of the plugin msgid "WP Rocket" @@ -48,9 +48,9 @@ msgstr "https://wp-media.me" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "" "Your site is hosted on %s, we have enabled Varnish auto-purge for " @@ -181,41 +181,31 @@ msgstr "سطح کش CloudFlare به %s تنظیم شد" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "خطای فشرده‌سازی Cloudflare: %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "فشرده سازی %s Cloudflare" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "خطای بارگذار موشک Cloudflare: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "بارگذار موشک Cloudflare %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "CloudFlare خطای کش مرورگر: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "کش مرورگر کلادفلیر تنظیم شده به%s" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "%1$sموشک وردپرس:%2$sتنظیمات مناسب برای کلادفلیر فعال شد:" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "" "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to " "previous settings:" @@ -223,7 +213,7 @@ msgstr "" "%1$sموشک وردپرس:%2$sتنظیمات مناسب برای کلادفلیر غیرفعال شد و به تنظیمات قبلی" " بازگشت:" -#: inc/Addon/Cloudflare/Subscriber.php:661 inc/admin/options.php:165 +#: inc/Addon/Cloudflare/Subscriber.php:632 inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " msgstr "راکت وردپرس: " @@ -369,7 +359,7 @@ msgid "Settings" msgstr "تنظیمات" #: inc/admin/admin.php:96 inc/admin/admin.php:117 inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "خالی کردن این کش" @@ -402,17 +392,17 @@ msgstr "درون ریزی تنظیمات انجام نشد: محتوای فای msgid "Settings imported and saved." msgstr "تنظیمات درون‌ریزی و ذخیره شد." -#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:571 +#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "فایل‌های CSS مستثنی شده" -#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:725 +#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "حذف جاوا اسکریپت داخلی" -#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "مستثنی کردن فایل‌های جاوا اسکریپت" @@ -424,19 +414,19 @@ msgstr "به تعویق انداختن فایل های جاوا اسکریپت" msgid "Excluded Delay JavaScript Files" msgstr "فایل‌های جاوا اسکریپت تاخیری حذف شدند" -#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1229 +#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "آدرس‌(هایی) که هرگز کش نخواهند شد" -#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1243 +#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "عامل‌(های) کاربری هرگز کش نخواهند شد" -#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1249 +#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "URL (هایی) که همیشه پاک‌سازی شوند" -#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1530 +#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "مستثنی کردن فایل‌ها از CDN" @@ -456,8 +446,6 @@ msgid "More info" msgstr "اطلاعات بیشتر" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 -#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 msgid "Clear cache" msgstr "پاک کردن کش" @@ -632,16 +620,15 @@ msgstr "%s: کش شرط پاک شد." msgid "%s: User cache cleared." msgstr "%s: کش کاربر پاک شد." -#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 -#: views/settings/page-sections/dashboard.php:46 +#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 +#: views/settings/page-sections/dashboard.php:47 msgid "Dismiss this notice" msgstr "نادیده گرفتن این پیام." -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:84 -#: inc/Engine/Saas/Admin/AdminBar.php:202 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:51 msgid "Clear Used CSS" msgstr "پاکسازی CSSهای استفاده شده" @@ -720,8 +707,8 @@ msgstr "نصب دوباره نسخه %s" #: inc/classes/class-wp-rocket-requirements-check.php:203 #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "%s بازگشتن به نسخه قبلی" @@ -745,10 +732,13 @@ msgstr "" "working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 -msgid "Clear and preload cache" +msgid "Clear and Preload Cache" msgstr "حذف و پیش بارگذاری مجدد کش" +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear Cache" +msgstr "پاک کردن کش" + #: inc/common/admin-bar.php:131 inc/functions/i18n.php:20 msgid "All languages" msgstr "همه‌ی زبان‌ها" @@ -773,7 +763,7 @@ msgstr "تخلیه کش RocketCDN" msgid "Documentation" msgstr "مستندات" -#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:36 +#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "فعال‌سازی Imagify" @@ -913,7 +903,7 @@ msgstr "" " توانید این گزینه را برای بارگذاری اولیه آن تیک بزنید." #. translators: 1 and 3 are link openings, 2 is a link closing. -#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "%1$sبازگشت به موشک وردپرس%2$sیا %3$s رفتن به برگه افزونه‌ها%2$s" @@ -993,7 +983,7 @@ msgstr "قبل از بارگذاری فایل درون‌ریزی باید خط msgid "Choose a file from your computer (maximum size: %s)" msgstr "انتخاب فایل از رایانه شما (حداکثر حجم: %s)" -#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:422 +#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "بارگذاری فایل و درون‌ریزی تنظیمات" @@ -1076,8 +1066,8 @@ msgstr "پایه" msgid "Static Files" msgstr "فایل‌های استاتیک" -#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "شبکه تحویل محتوا CDN" @@ -1086,22 +1076,22 @@ msgstr "شبکه تحویل محتوا CDN" msgid "Advanced" msgstr "پیشرفته" -#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1345 +#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "پایگاه داده" -#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1051 +#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "پیش بارگذاری" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "ابزارها" -#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:357 -#: views/settings/page-sections/dashboard.php:80 +#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 +#: views/settings/page-sections/dashboard.php:81 msgid "License" msgstr "کد لایسنس" @@ -1142,27 +1132,27 @@ msgid "weekly" msgstr "هفتگی" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "بازبینی‌ها" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "پیش نویس خودکار" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "نوشته‌های داخل زباله دان" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "دیدگاه‌های اسپم" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "دیدگاه‌های زباله‌دان" @@ -1214,63 +1204,46 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "بازسازی مجدد تنظیمات پرونده های راکت وردپرس" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "ذخیره تغییرات" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "اعتبار لایسنس" -#: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 inc/functions/admin.php:550 +#: inc/Engine/Admin/Settings/Page.php:278 +#: inc/Engine/Admin/Settings/Page.php:279 inc/functions/admin.php:550 msgid "Unavailable" msgstr "دردسترس نیست" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "کلید API" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "ایمیل" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "پیشخوان" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "دریافت راهنمایی، اطلاعات حساب کاربری" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "وضعیت من" - -#: inc/Engine/Admin/Settings/Page.php:435 views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "تجزیه و تحلیل موشک" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "" -"I agree to share anonymous data with the development team to help improve WP" -" Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" -"من با اشتراک گذاری داده‌های ناشناس با تیم توسعه برای گسترش موشک وردپرس " -"موافقم. %1$sچه اطلاعاتی را جمع آوری می‌کنیم؟%2$s" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "بهینه‌سازی فایل" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "بهینه‌سازی CSS و JS" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable this option in Autoptimize." @@ -1279,17 +1252,17 @@ msgstr "" "اگر مایل به استفاده از فشرده‌ساز %2$s هستید، گزینه‌های آن را در بهینه‌ساز " "خودکار غیرفعال کنید." -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "فایل‌های CSS" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "فایل‌های جاوا اسکریپت" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable those options in Autoptimize." @@ -1298,7 +1271,7 @@ msgstr "" "اگر مایل به استفاده از فشرده‌ساز %2$s هستید، گزینه‌های آن را در بهینه‌ساز " "خودکار غیرفعال کنید." -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "" "If you have problems after activating this option, copy and paste the " "default exclusions to quickly resolve issues:" @@ -1307,14 +1280,14 @@ msgstr "" " جای‌گذاری کنید تا مشکلات به سرعت حل شوند:" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "" "Also, please check our %1$sdocumentation%2$s for a list of compatibility " "exclusions." msgstr "" "همچنین، لطفاً%1$sاسناد%2$sما را برای فهرستی از استثناهای سازگاری بررسی کنید." -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "" "Internal scripts are excluded by default to prevent issues. Remove them to " "take full advantage of this option." @@ -1323,53 +1296,31 @@ msgstr "" "استفاده کامل از این گزینه، آنها را حذف کنید." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "" "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" "اگر این باعث مشکل می شود، موارد استثنای پیش فرض پیدا شده را بازیابی کنید " "%1$s اینجا %2$s" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "فشرده‌سازی فایل‌های CSS" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "" "فشرده‌سازی فایل‌های CSS حجم را با استفاده از حذف کامنت‌ها و فضاهای خالی کاهش" " می‌دهد." -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "این ممکن است بعضی چیزها را خراب کند!" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "" -"If you notice any errors on your website after having activated this " -"setting, just deactivate it again, and your site will be back to normal." -msgstr "" -"اگر پس از فعال‌سازی این تنظیمات در سایت خود با خطایی مواجه شدید، فقط آن " -"تنظیم را غیرفعال کرده تا سایت به وضعیت عادی بازگردد." - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "فعال‌سازی فشرده‌ساز CSS" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "" "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" "آدرس استایل های CSS برای صرف نظر از فشرده سازی را وارد کنید ( هر آدرس در یک " "خط)." -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).css wildcards to exclude all CSS files located at a " @@ -1379,7 +1330,7 @@ msgstr "" "همه فایل های CSS که در یک مسیر خاص قرار دارند ، از (.*). css استفاده کنید." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external CSS. %1$sMore info%2$s" @@ -1387,12 +1338,12 @@ msgstr "" "شخص 3rd:برای حذف CSS خارجی ، از مسیر URL کامل یا فقط از نام" " دامنه استفاده کنید.%1$sراهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "بهینه‌سازی تحویل CSS" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1402,7 +1353,7 @@ msgstr "" "فقط یک روش را می توان انتخاب کرد. برای عملکرد مطلوب حذف CSS استفاده نشده " "توصیه می شود. اما فقط محدود برای افرادی است که لایسنس فعال دارند." -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1413,20 +1364,19 @@ msgstr "" "توصیه می شود." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "" "Optimize CSS Delivery features are disabled on local environments. %1$sLearn" " more%2$s" msgstr "" "ویژگی بهینه سازی تحویل CSS در محیط محلی غیرفعال است.%1$sبیشتر بخوانید%2$s" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" -msgstr "حذف CSS بدون استفاده" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" +msgstr "حذف CSS بدون استفاده (RUCSS)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "" "Removes unused CSS per page and helps to reduce page size and HTTP requests." " Recommended for best performance. Test thoroughly! %1$sMore info%2$s" @@ -1434,15 +1384,29 @@ msgstr "" "حذف CSS بلااستفاده در هر برگه و کمک به کاهش حجم و درخواست HTTP صفحه. توصیه " "شده برای عملکرد بهتر. امتحان کنید.%1$sاطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "این ممکن است بعضی چیزها را خراب کند!" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "" +"If you notice any errors on your website after having activated this " +"setting, just deactivate it again, and your site will be back to normal." +msgstr "" +"اگر پس از فعال‌سازی این تنظیمات در سایت خود با خطایی مواجه شدید، فقط آن " +"تنظیم را غیرفعال کرده تا سایت به وضعیت عادی بازگردد." + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "حذف CSS های بدون استفاده را فعال کنید" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "لیست بدون خطر CSS" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "" "Specify CSS filenames, IDs or classes that should not be removed (one per " "line)." @@ -1450,13 +1414,13 @@ msgstr "" "نام فایل های CSS ، شناسه ها یا کلاس هایی را که نباید حذف شوند (یکی در هر خط)" " مشخص کنید." -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "CSS را به صورت غیر همزمان بارگذاری کنید" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "" "Load CSS asynchronously is currently handled by the %1$s plugin. If you want" @@ -1467,19 +1431,19 @@ msgstr "" "غیرفعال کنید." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "" "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" "مسیر بحرانی CSS را ایجاد می کند و CSS را به صورت نا همزمان بارگذاری می " "کند.%1$sاطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "CSSهای معوق بحرانی" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "" "Provides a fallback if auto-generated critical path CSS is incomplete. " "%1$sMore info%2$s" @@ -1487,22 +1451,18 @@ msgstr "" "اگر مسیرهای بحرانی تولید شده خودکار CSS ناقص بود، یک تعویق ارائه دهید " "%1$sاطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "فشرده‌سازی فایل‌های جاوا اسکریپت" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "" "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "" "فشرده‌سازی فایل‌های جاوا اسکریپت حجم را با استفاده از حذف کامنت‌ها و فضاهای " "خالی کاهش می‌دهد." -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "فعال‌سازی فشرده‌سازی جاوا اسکریپت" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "" "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" @@ -1510,7 +1470,7 @@ msgstr "" "جاوا اسکریپت را فعال کنید)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "" "Combine JavaScript files combines your site’s internal, 3rd party and inline" " JS reducing HTTP requests. Not recommended if your site uses HTTP/2. " @@ -1520,8 +1480,7 @@ msgstr "" "درخواست های HTTP را کاهش می دهد. اگر سایت شما از HTTP/2 استفاده می کند توصیه" " نمی شود. %1$sراهنمایی%2$s" -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "" "For compatibility and best results, this option is disabled when delay " "javascript execution is enabled." @@ -1529,12 +1488,12 @@ msgstr "" "برای سازگاری و بهترین نتایج ، این گزینه با فعال کردن تأخیر در اجرای جاوا " "اسکریپت غیرفعال می شود." -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "فعال‌سازی ادغام جاوا اسکریپت" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "" "Specify patterns of inline JavaScript to be excluded from concatenation (one" " per line). %1$sMore info%2$s" @@ -1542,7 +1501,7 @@ msgstr "" "برای مستثنی کردن فایل‌های جاوا اسکریپت از ادغام و فشرده سازی، آدرس آن را " "اینجا وارد کنید.(هرخط یک آدرس).%1$sاطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "" "Specify URLs of JavaScript files to be excluded from minification and " "concatenation (one per line)." @@ -1550,7 +1509,7 @@ msgstr "" "نشانی های وب فایلهای جاوا اسکریپت را مشخص کنید تا از کوچک سازی و اتصال (یکی " "در هر خط) حذف شوند." -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).js wildcards to exclude all JS files located at a " @@ -1560,7 +1519,7 @@ msgstr "" "js برای حذف تمام فایل های JS واقع در یک مسیر خاص استفاده کنید." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external JS. %1$sMore info%2$s" @@ -1568,13 +1527,13 @@ msgstr "" "شخص 3rd :برای حذف JS خارجی ، از مسیر URL کامل یا فقط نام " "دامنه استفاده کنید.%1$sراهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "بارگذاری جاوا اسکریپت به صورت تاخیری" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "" "Load JavaScript deferred eliminates render-blocking JS on your site and can " "improve load time. %1$sMore info%2$s" @@ -1584,7 +1543,7 @@ msgstr "" " بیشتر%2$s" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "" "Specify URLs or keywords of JavaScript files to be excluded from defer (one " "per line). %1$sMore info%2$s" @@ -1592,13 +1551,13 @@ msgstr "" "برای مستثنی کردن فایل‌های جاوا اسکریپت از تعویق، آدرس آن را اینجا وارد " "کنید(هرخط یک آدرس).%1$sاطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "تاخیر اجرای جاوا اسکریپت" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "" "Improves performance by delaying the loading of JavaScript files until user " "interaction (e.g. scroll, click). %1$sMore info%2$s" @@ -1606,11 +1565,11 @@ msgstr "" "با تأخیر در بارگذاری فایل های جاوا اسکریپت تا تعامل کاربر (به عنوان مثال " "پیمایش ، کلیک) ، عملکرد را بهبود می بخشد.%1$sراهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "موارد استثنا با یک کلیک" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "" "When using the Delay JavaScript Execution, you might experience delay " "loading elements located in the viewport that need to appear immediately - " @@ -1620,7 +1579,7 @@ msgstr "" "واقع در ویوپورت را تجربه کنید که باید فورا ظاهر شوند - به عنوان مثال: " "اسلایدر، سربرگ، فهرست." -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "" "If you need instant visibility, click below on files that should NOT be " "delayed. This selection will help users interact with the elements straight " @@ -1630,7 +1589,7 @@ msgstr "" "کلیک کنید. این انتخاب به کاربران کمک می کند تا فوراً با عناصر تعامل داشته " "باشند." -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "" "Specify URLs or keywords that can identify inline or JavaScript files to be " "excluded from delaying execution (one per line)." @@ -1638,24 +1597,24 @@ msgstr "" "نشانی های اینترنتی یا کلمات کلیدی را مشخص کنید که بتوانند درون خطی یا فایل " "های جاوا اسکریپت را شناسایی کنند تا از تأخیر اجرا حذف شوند (یکی در هر خط)." -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "رسانه" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "بارگذاری تنبل، ابعاد تصویر" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "بهینه‌سازی خودکار" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "بارگزاری تنبل" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "" "It can improve actual and perceived loading time as images, iframes, and " "videos will be loaded only as they enter (or about to enter) the viewport " @@ -1667,7 +1626,7 @@ msgstr "" "%1$sاطلاعات بیشتر%2$s" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "" "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s " "LazyLoad, disable this option in %2$s." @@ -1675,12 +1634,12 @@ msgstr "" "بارگذاری تنبل در حال حاضر فعال است در%2$s. اگر می خواهید از بارگذاری تنبل " "موشک وردپرس استفاده کنید، این گزینه %2$s را غیرفعال کنید." -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "ابعاد تصویر" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "" "Add missing width and height attributes to images. Helps prevent layout " "shifts and improve the reading experience for your visitors. %1$sMore " @@ -1689,12 +1648,12 @@ msgstr "" "ویژگی های عرض و ارتفاع را به تصاویر بدون آن اضافه کنید. به جلوگیری از تغییر " "چیدمان و بهبود تجربه خواندن برای بازدیدکنندگان کمک می کند.%1$s راهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "فعال‌سازی برای تصاویر" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "" "LazyLoad for images is currently activated in %2$s. If you want to use " "%1$s’s LazyLoad, disable this option in %2$s." @@ -1702,25 +1661,25 @@ msgstr "" "در حال حاضر بارگذاری تنبل تصاویر در %2$s فعال است. اگر می خواهید از " "%1$sبارگذاری تنبل استفاده کنید. این گزینه را در %2$s غیرفعال کنید." -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "فعالسازی برای تصاویر پس ضمینه CSS" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "فعال سازی برای آی‌فریم‌ها و ویدیوها" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "جایگزینی آی‌فریم یوتیوب با تصویر پیش‌نمایش" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "جایگزین iframe YouTube با تصویر پیش نمایش با %2$s سازگار نیست." #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "" "This can significantly improve your loading time if you have a lot of " "YouTube videos on a page." @@ -1728,12 +1687,12 @@ msgstr "" "در صورتی که تعداد زیادی ویدیو از یوتیوب داخل صفحه خود داشته باشید، این گزینه" " به طور قابل ملاحظه‌ای سرعت شما را افزایش خواهد داد." -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "تصاویر یا iframe های مستثنی شده" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "" "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from" " the image or iframe code to be excluded (one per line). %1$sMore info%2$s" @@ -1741,20 +1700,20 @@ msgstr "" "کلمات کلیدی (مانند نام فایل تصویر ، کلاس CSS ، دامنه) را از تصویر یا کد " "iframe حذف کنید (یکی در هر خط) مشخص کنید.%1$sراهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "افزودن ابعاد به تصاویر بدون ابعاد" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "ایجاد فایل کش، پیش بارگذاری فونت‌ها" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "پیش‌بارگذاری کش" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "" "When you enable preloading WP Rocket will automatically detect your sitemaps" " and save all URLs to the database. The plugin will make sure that your " @@ -1764,12 +1723,12 @@ msgstr "" " را شناسایی می کند و همه URL ها را در پایگاه داده ذخیره می کند. این افزونه " "مطمئن می شود که کش شما همیشه از قبل بارگذاری شده است." -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "لینک‌های پیش بارگذاری" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "" "Link preloading improves the perceived load time by downloading a page when " "a user hovers over the link. %1$sMore info%2$s" @@ -1777,11 +1736,11 @@ msgstr "" "پیش بارگذاری لینک با بارگیری صفحه ای که کاربر روی لینک موس خود را قرار می " "دهد ، زمان بارگذاری را بهبود می بخشد. %1$sراهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "پیش‌دریافت درخواست DNS" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "" "DNS prefetching can make external files load faster, especially on mobile " "networks" @@ -1789,12 +1748,12 @@ msgstr "" "پیش‌دریافت درخواست DNS باعث افزایش سرعت بارگذاری فایل‌های خارجی به خصوص بر " "روی شبکه‌های موبایلی خواهد شد" -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "پیش بارگذاری فونت‌ها" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "" "Improves performance by helping browsers discover fonts in CSS files. " "%1$sMore info%2$s" @@ -1802,16 +1761,16 @@ msgstr "" "با کمک به مرورگرها برای کشف فونت در فایل های CSS ، عملکرد را بهبود می " "بخشد.%1$sراهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "فعالسازی پیش پارگذاری" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "مستثنی کردن URL ها" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "" "Specify URLs to be excluded from the preload feature (one per line). " "%1$sMore info%2$s" @@ -1819,11 +1778,11 @@ msgstr "" "برای مستثنی کردن URLها از پیش بارگذاری وارد کنید (یکی در هر خط).%1$sاطلاعات " "بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "آدرس‌ها برای پیش‌دریافت" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "" "Specify external hosts to be prefetched (no http:, one per " "line)" @@ -1831,11 +1790,11 @@ msgstr "" "میزبان‌های خارجی را برای واکشی مشخص کنید(بدونhttp:، یکی درهر " "خط)" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "فونت‌ها برای پیش بارگذاری" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "" "Specify urls of the font files to be preloaded (one per line). Fonts must be" " hosted on your own domain, or the domain you have specified on the CDN tab." @@ -1844,7 +1803,7 @@ msgstr "" "کنید.فونت ها باید در دامنه خود یا دامنه ای که در برگه CDN مشخص کرده اید " "میزبانی شوند." -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "" "The domain part of the URL will be stripped automatically.
Allowed font " "extensions: otf, ttf, svg, woff, woff2." @@ -1852,51 +1811,51 @@ msgstr "" "بخش دامنه URL به طور خودکار برداشته می شود.
پسوند فونت های مجاز شامل: " "otf, ttf, svg, woff, woff2." -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "پیش بارگذاری لینک را فعال کنید" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "قوانین پیشرفته" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "قوانین کش دقیق" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "" "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "برگه‌های حساس مثل ورود\\خروج باید از کش مستثنی شوند." -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "ووکامرس" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "دانلود آسان دیجیتال EDD" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "iThemes Exchange" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "Jigoshop" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "WP-Shop" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing #. tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "" "
Cart, checkout and \"my account\" pages set in " "%1$s%2$s%3$s will be detected and never cached by default." @@ -1905,12 +1864,12 @@ msgstr "" "%1$s%2$s%3$s تعیین شده‌اند تشخیص داده خواهند شد و به صورت " "پیش‌فرض هرگز کش نخواهند شد." -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "طول عمر کش" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "" "Cache files older than the specified lifespan will be deleted.
Enable " "%1$spreloading%2$s for the cache to be rebuilt automatically after lifespan " @@ -1919,16 +1878,16 @@ msgstr "" "فایل های کش قدیمی تر از طول عمر مشخص شده حذف می شوند.
فعال کردن%1$sپیش " "بارگذاری%2$s برای کش باعث ایجاد خودکار آن بعد از دوره پایان عمر آن می شود." -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "کوکی‌هایی که هرگز کش نخواهند شد" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "کش کردن کوئری استرینگ‌(ها)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "" "%1$sCache for query strings%2$s enables you to force caching for specific " "GET parameters." @@ -1936,14 +1895,14 @@ msgstr "" "%1$sکش کردن کوئری استرینگ‌ها%2$s باعث می‌شوند که پارامترهای متد GET به اجبار" " کش شوند." -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "" "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" "مدت زمانی که بعد از آن کش عمومی پاک می‌شود را تعیین کنید
(0 = نامحدود)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "" "Reduce lifespan to 10 hours or less if you notice issues that seem to appear" " periodically. %1$sWhy?%2$s" @@ -1951,27 +1910,27 @@ msgstr "" "اگر به طور متناوب خطاهایی را مشاهده می‌کنید طول عمر کش را به 10 ساعت یا کمتر" " کاهش دهید. %1$sچرا؟%2$s" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "ساعت‌" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "روزها" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "" "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" "آدرس برگه‌ها یا نوشته‌هایی که هرگز نباید کش شوند را تعیین کنید (در هر خط " "یکی)" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to address multiple URLs under a given path." @@ -1979,7 +1938,7 @@ msgstr "" "قسمت نام دامنه آدرس به صورت خودکار حذف خواهد شد.
از (.*) برای تعیین چند" " آدرس از یک مسیر استفاده کنید." -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "" "Specify full or partial IDs of cookies that, when set in the visitor's " "browser, should prevent a page from getting cached (one per line)" @@ -1987,18 +1946,18 @@ msgstr "" "شناسه های کامل یا جزئی کوکی ها را مشخص کنید که وقتی در مرورگر بازدیدکننده " "تنظیم می شوند ، از ذخیره شدن صفحه جلوگیری شود (یکی در هر خط)" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "" "Specify user agent strings that should never see cached pages (one per line)" msgstr "" "رشته‌های user agentی که هرگز نباید صفحات را کش شده مشاهده کنند را تعیین کنید" " (در هر خط یکی)" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "برای تشخص قسمت‌های مختلف رشته user agent از (.*)استفاده کنید." -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "" "Specify URLs you always want purged from cache whenever you update any post " "or page (one per line)" @@ -2006,19 +1965,19 @@ msgstr "" "آدرس‌هایی که مایل هستید فارغ از اینکه نوشته یا برگه‌ای بروزرسانی شده، همیشه " "از کش حذف شوند را تعیین کنید (در هر خط یکی)" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "کوئری استرینگ‌ها برای کش شدن را تعیین کنید (در هر خط یکی)" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "بهینه‌سازی، کاهش نفخ" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "پاک‌سازی نوشته" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "" "Post revisions and drafts will be permanently deleted. Do not use this " "option if you need to retain revisions or drafts." @@ -2026,19 +1985,19 @@ msgstr "" "نوشته‌های بازبینی و پیش‌نویس به طور دائم حذف خواهند شد. اگر به نگه‌داری " "بازبینی‌ها و پیش‌نویس‌ها نیاز دارید این گزینه را استفاده نکنید." -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "پاک‌سازی دیدگاه‌ها" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "دیدگا‌ه‌های اسپم و داخل زباله‌دان به طور دائم حذف خواهند شد." -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "پاک‌سازی داده‌های گذرا" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "" "Transients are temporary options; they are safe to remove. They will be " "automatically regenerated as your plugins require them." @@ -2046,21 +2005,21 @@ msgstr "" "داده‌های گذرا تنظیمات موقتی هستند. حذف آن‌ها ایمن است. در صورتی که افزونه‌ها" " به این داده‌ها نیاز داشته باشند به صورت خودکار ایجاد خواهند شد." -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "پاک‌سازی پایگاه داده" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "بهینه سازی جداول دیتابیس" -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "پاک‌سازی خودکار" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "%s بازبینی در پایگاه داده شما وجود دارد." @@ -2068,7 +2027,7 @@ msgstr[1] "%s بازبینی در پایگاه داده شما وجود دارد #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "%s پیش‌نویس در پایگاه داده شما وجود دارد." @@ -2076,7 +2035,7 @@ msgstr[1] "%s پیش‌نویس در پایگاه داده شما وجود دا #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "%s نوشته داخل زباله‌دان در پایگاه داده شما وجود دارد." @@ -2084,7 +2043,7 @@ msgstr[1] "%s نوشته داخل زباله‌دان در پایگاه داده #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "%s دیدگاه اسپم در پایگاه داده شما وجود دارد." @@ -2092,61 +2051,61 @@ msgstr[1] "%s دیدگاه اسپم در پایگاه داده شما وجود #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "%s دیدگاه در زباله‌دان شما وجود دارد." msgstr[1] "%s دیدگاه در زباله‌دان شما وجود دارد." -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "همه داده‌های گذرا" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "%s داده گذرا در پایگاه داده شما وجود دارد." msgstr[1] "%s داده گذرا در پایگاه داده شما وجود دارد." -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "بهینه‌سازی جدول‌ها" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "%s جدول برای بهینه‌سازی در پایگاه داده شما وجود دارد." msgstr[1] "%s جدول برای بهینه‌سازی در پایگاه داده شما وجود دارد." -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "برنامه‌ریزی پاک‌سازی خودکار" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "دوره تکرار" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "روزانه" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "هفتگی" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "ماهیانه" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "CDN خود را سازگار کنید" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "" "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s)" " you provide." @@ -2155,7 +2114,7 @@ msgstr "" "شما تعیین کرده‌اید بازنویسی خواهند شد." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "" "Not required for services like Cloudflare and Sucuri. Please see our " "available %1$sAdd-ons%2$s." @@ -2165,7 +2124,7 @@ msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = #. closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "" "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings " "is not required for %2$l to work on your site." @@ -2179,28 +2138,28 @@ msgstr[1] "" "%1$s%2$l افزودنی%3$s اکنون فعال است. پیکربندی تنظیمات CDN برای %2$l ضروری " "نیست." -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "فعالسازی شبکه تحویل محتوا" -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "CNAME (های) CDN" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "CNAME (ها) را اینجا تعیین کنید" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "" "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" "آدرس فایل‌(هایی) که نباید از طریق CDN بارگذاری شوند را تعیین کنید.(هرخط یک " "آدرس)" -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to exclude all files of a given file type located at a specific " @@ -2209,16 +2168,16 @@ msgstr "" "قسمت نام دامنه آدرس به صورت خودکار حذف خواهد شد.
برای مستثنی کردن همه " "فایل‌های هم نوع موجود در یک مسیر از (.*) استفاده کنید." -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "ضربان Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "کنترل API سرویس WordPress Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "" "Reducing or disabling the Heartbeat API’s activity can help save some of " "your server’s resources." @@ -2226,11 +2185,11 @@ msgstr "" "کاهش یا غیرفعال کردن فعالیت Heartbeat API می تواند به ذخیره برخی از منابع " "سرور شما کمک کند." -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "کاهش یا غیرفعال کردن فعالیت Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Reducing activity will change Heartbeat frequency from one hit each minute " "to one hit every 2 minutes." @@ -2238,55 +2197,55 @@ msgstr "" "با کاهش فعالیت ، فرکانس Heartbeat از یک ضربه در هر دقیقه به یک ضربه در هر 2 " "دقیقه تغییر می کند." -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" "با غیرفعال کردن کامل Heartbeat ممکن است افزونه ها و قالب ها با استفاده از " "این API خراب شوند." -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "محدود نکنید" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "کاهش فعالیت" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "غیرفعال‌سازی" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "کنترل Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "رفتار در پس زمینه" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "رفتار در ویرایشگر نوشته" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "رفتار در frontend" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "افزودنی‌ها" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "افزودن ویژگی‌های بیشتر" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "افزودنی‌های موشک با یک کلیک" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "" "One-Click Add-ons are features extending available options without " "configuration needed. Switch the option \"on\" to enable from this screen." @@ -2295,21 +2254,21 @@ msgstr "" "به تنظیمات جدید گسترش می‌دهند. برای فعال‌سازی گزینه \"فعال\" را از این صفحه " "فعال کنید." -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "افزودنی‌های موشک" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "" "افزودنی‌های موشک ویژگی‌های تکمیلی هستند که گزینه‌های موجود فعلی را گسترش " "می‌دهند." -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "کش کاربر" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "" "If you need to create a dedicated set of cache files for each logged-in " "WordPress user, you must activate this add-on." @@ -2318,7 +2277,7 @@ msgstr "" " وردپرس دارید، باید این افزونه را فعال کنید." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "" "User cache is great when you have user-specific or restricted content on " "your website.
%1$sLearn more%2$s" @@ -2326,16 +2285,16 @@ msgstr "" "حافظه پنهان کاربر زمانی عالی است که محتوای خاص کاربر یا محدود شده در وب سایت" " خود داشته باشید.
%1$sاطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "حساب کاربری Cloudflare خود را با این افزودنی ادغام کنید." -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "" "Provide your account email, global API key, and domain to use options such " "as clearing the Cloudflare cache and enabling optimal settings with WP " @@ -2346,7 +2305,7 @@ msgstr "" "تعیین کنید." #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "" "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just " "activate the official Cloudflare plugin and configure it. WP Rocket will " @@ -2356,17 +2315,17 @@ msgstr "" "پلاگین رسمی کلادفلیر را فعال کرده و آن را پیکربندی کنید. موشک وردپرس به طور " "خودکار سازگاری را فعال می کند." -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "وارنیش" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "" "اگر بر روی سرور شما وارنیش اجرا شده است، باید این افزودنی را فعال کنید." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "" "Varnish cache will be purged each time WP Rocket clears its cache to ensure " "content is always up-to-date.
%1$sLearn more%2$s" @@ -2374,16 +2333,16 @@ msgstr "" "هر بار که موشک وردپرس کش خود را پاک‌سازی می‌کند، کش وارنیش هم به منظور " "اطمینان از به روز بودن محتوا، پاک خواهد شد.
%1$sکسب اطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "سازگاری WebP" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "بهبود سازگاری مرورگر با تصاویر WebP." #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "" "Enable this option if you would like WP Rocket to serve WebP images to " "compatible browsers. Please note that WP Rocket cannot create WebP images " @@ -2395,11 +2354,11 @@ msgstr "" "WebP را برای شما ایجاد کند. برای ایجاد تصاویر WebP توصیه می کنیم از " "%1$sImagify%2$s استفاده کنید. %3$sراهنمایی%2$s" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "کش Sucuri را حذف کن هنگامی که کش موشک وردپرس را حذف می کنید." -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "" "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is " "cleared." @@ -2407,49 +2366,49 @@ msgstr "" "کلید API خود را برای پاک کردن کش Sucuri هنگام پاک شدن کش موشک وردپرس ارائه " "دهید." -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "Sucuri" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "با این افزونه کش Sucuri را همگام سازی کنید." -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "اعتبارهای Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "تنظیمات Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "کلید API عمومی:" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "پیدا کردن کلید API شما" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "ایمیل حساب کاربری" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "شناسه ناحیه" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "حالت توسعه" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "" "Temporarily activate development mode on your website. This setting will " "automatically turn off after 3 hours. %1$sLearn more%2$s" @@ -2457,21 +2416,21 @@ msgstr "" "حالت توسعه به طور موقت بر روی وبسایت خود فعال کنید. این تنظیم بعد از گذشت 3 " "ساعت غیرفعال خواهد شد. %1$sکسب اطلاعات بیشتر%2$s" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "تنظیمات بهینه‌سازی" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "" "Automatically enhances your Cloudflare configuration for speed, performance " "grade and compatibility." msgstr "افزایش خودکار تنظیمات Cloudflare جهت سرعت، بهره‌وری و هماهنگی بیشتر." -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "پروتکل نسبی" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "" "Should only be used with Cloudflare's flexible SSL feature. URLs of static " "files (CSS, JS, images) will be rewritten to use // instead of http:// or " @@ -2481,11 +2440,11 @@ msgstr "" "(CSS, JS, images) جهت استفاده از // به جای http:// یا https:// بازنویسی " "خواهند شد." -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "اعتبارهای Sucuri" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "" "Firewall API key (for plugin), must be in format {32 characters}/{32 " @@ -2494,23 +2453,21 @@ msgstr "" "شناسه API فایروال (برای افزونه)، باید در فرمت {32 characters}/{32 " "characters}:" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "پیدا کردن کلید API شما" #. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: -#. opening a tag, %4$s: option a tag, %5$s: opening a tag. -#: inc/Engine/Admin/Settings/Page.php:2295 +#. opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 msgid "" -"%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our " -"brand new feature %3$sOptimize critical images%5$s is automatically " -"activated now! Also, the Cache tab was removed but the existing features " -"will remain working, %4$ssee more here%5$s." +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " +"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " +"more about it." msgstr "" -"%1$sراکت وردپرس:%2$sافزونه به نسخه 3.16 بروزرسانی شد. ویژگی جدید ما%3$sبهینه" -" سازی تصاویر بحرانی است.%5$sکه به صورت خودکار فعال می باشد! همچنین تب کش حذف" -" شده اما همچنان عملکردش باقی مانده است%4$sاطلاعات بیشتر%5$s." +"%1$sراکت وردپرس:%2$sبه نسخه 3.17 بروزرسانی شد. ویژگی جدید:%3$sرندر تنبل " +"محتوا%4$s. مستندات ما را برای راهنمایی بیشتر مطالعه کنید." #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" @@ -2528,25 +2485,25 @@ msgstr "" "متاسفیم! افزودن/(.*) در قوانین پیشرفته > هرگز کش نکن URL(s) ذخیره نشد به " "دلیل اینکه کش و بهینه سازی برای هر برگه در سایت شما غیرفعال است." -#: inc/Engine/Admin/Settings/Subscriber.php:172 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "درون‌ریزی، برون‌ریزی، عقب‌گرد" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "بهینه‌سازی تصویر" -#: inc/Engine/Admin/Settings/Subscriber.php:198 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "تصاویر خود را فشرده کنید" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "آموزش‌ها" -#: inc/Engine/Admin/Settings/Subscriber.php:216 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "شروع به کار و نحوه فیلمبرداری" @@ -2554,53 +2511,53 @@ msgstr "شروع به کار و نحوه فیلمبرداری" msgid "WP Rocket Expired Cache Interval" msgstr "مدت زمان کش موشک وردپرس به اتمام رسیده است" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "مقدار WP_CACHE" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "کش" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "" "The WP_CACHE constant needs to be set to true for WP Rocket cache to work " "properly" msgstr "مقدار WP_CACHE باید true باشد تا کش موشک وردپرس به درستی کار کند" -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "مقدار WP_CACHE به true تنظیم شده است" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "مقدار WP_CACHE تنظیم نشده است" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "مقدار WP_CACHE به false تنظیم شده است" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "تاریخ صورتحساب بعدی" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "بدون اشتراک" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "اشتراک RocketCDN شما اکنون فعال است." #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing #. tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "" "برای استفاده از RocketCDN ، بجای CNAME خود از %1$s%2$s%3$s استفاده کنید." #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2662,29 +2619,29 @@ msgstr "RocketCDN غیرفعال شد" #. Translators: %s = date formatted using date_i18n() and get_option( #. 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "تا %s معتبر است!" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "سرعت بخشیدن به وب سایت شما به لطف:" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "" "High performance Content Delivery Network (CDN) with %1$sunlimited " "bandwidth%2$s" msgstr "بیشترین عملکرد شبکه توزیع محتوا (CDN) با%1$s پهنای باند نامحدود%2$s" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "" "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "پیکربند آسنا:%1$sبهترین تنظیمات CDN %2$s بطور خودکار اعمال می شود" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "" "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in" " our plugin" @@ -2692,12 +2649,12 @@ msgstr "" "ادغام موشک وردپرس: گزینه CDN بصورت خودکار%1$sپیکربندی می شود%2$s در افزونه " "ما" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "اطلاعات بیشتر راجع به RocketCDN" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "" "*$%1$s/month for 12 months then $%2$s/month. You can cancel your " "subscription at any time." @@ -2705,34 +2662,34 @@ msgstr "" "*$%1$s/ماه برای 12 ماه آنگاه $%2$s/ماه. شما می توانید اشتراک خود را هرگاه که" " خواستید لغو کنید." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "صورتحساب ماهانه" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "شروع کنید" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "حذف این بنر" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "" "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "" "با RocketCDN، شبکه تحویل محتوای WP Rocket سرعت سایت خود را افزایش دهید." -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "ادامه مطلب" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "سرویس RocketCDN در دامنه محلی و سایت های آزمایشی دردسترس نیست." -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "خرید RocketCDN" @@ -2746,6 +2703,18 @@ msgid "" msgstr "" "با RocketCDN، شبکه تحویل محتوای WP Rocket سرعت سایت خود را افزایش دهید!" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "درخواست های خیلی زیاد." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "پاسخ معتبر نیست" + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "نوع درخواست معتبر نیست." + #: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "WP Rocket کارهای معلق را پردازش می کند" @@ -2758,11 +2727,52 @@ msgstr "WP Rocket کارهای ناموفق را پاک کرد" msgid "WP Rocket process on submit jobs" msgstr "فرآیند WP Rocket در ارسال کارها" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Priority Elements" +msgstr "پاک کردن عناصر اولویت" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Priority Elements of this URL" +msgstr "عناصر اولویت این URL را پاک کنید" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Priority Elements" +msgstr "عناصر اولویت" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear" +msgstr "پاک کردن" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "" +"This action will clear the Critical Images and Lazily Rendered Content." +msgstr "این عمل تصاویر بحرانی و محتوای رندر تنبل شده را پاک می کند." + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "%1$s:تصاویر بحرانی و داده رندر تنبل پاکسازی شد!" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "خطای اسکریپت" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "وقفه اسکریپت" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "تعیین یک زمان قطع معتبر ممکن نبود:%s." + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "هر دقیقه" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "بازسازی مسیر بحرانی CSS" @@ -2789,7 +2799,6 @@ msgstr "%l برای استفاده از این ویژگی." msgid "Publish the %s" msgstr "انتشار %s" -#. translators: %s = post type. #: inc/Engine/CriticalPath/Admin/Post.php:223 msgid "Enable Load CSS asynchronously in WP Rocket settings" msgstr "فعالسازی بارگیری CSS بصورت نابهنگام توسط تنظیمات موشک وردپرس" @@ -2804,7 +2813,7 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "CSS بحرانی برای %1$s تولید نشده است. خطا: %2$s" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "empty response." @@ -2812,26 +2821,26 @@ msgstr "" "CSS بحرانی برای %1$s موبایل ایجاد نشده است. خطا: API پاسخ خالی بر می گرداند." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an empty " "response." msgstr "CSS بحرانی برای %1$s تولید نشده است خطا: API پاسخ خالی بر می گرداند." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "CSS بحرانی برای %1$s در موبایل تولید شد." #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "CSS بحرانی برای %1$s. تولید نشد." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "invalid response code." @@ -2840,7 +2849,7 @@ msgstr "" "گرداند." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an invalid " "response code." @@ -2848,8 +2857,8 @@ msgstr "" "CSS بحرانی برای %1$s تولید نشده است.خطا: API پاسخ نامعتبر بر می گرداند." #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "خطا: %1$s" @@ -2933,36 +2942,36 @@ msgid "Critical CSS file cannot be deleted" msgstr "CSS بحرانی نمی تواند حذف شود" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "CSS بحرانی موبایل برای %1$s تولید نشد." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "CSS بحرانی برای %s در حال پردازش است." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "CSS بحرانی موبایل برای %s ایجاد شد." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "CSS بحرانی برای %s. تولید شد." -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "CSS بحرانی با موفقیت حذف شد." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "استایل CSS بحرانی موباید برای %1$s متوقف شد. مجدد تلاش کنید." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "CSS بحرانی برای %1$s وقفه افتاده است. لطفا کمی بعدتر مجدد امتحان کنید." @@ -3088,39 +3097,39 @@ msgid "Unlimited" msgstr "نامحدود" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "%s تخفیف" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "%s پیشنهاد زنده است!" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "عجله کنید! تخفیف پایان میابد در:" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "دقایق" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "ثانیه" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "اکنون ارتقاء دهید" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "ویژگی Optimize CSS Delivery غیرفعال است." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "" "You can no longer use the Remove Unused CSS or Load CSS asynchronously " "options." @@ -3129,7 +3138,7 @@ msgstr "" "استفاده کنید." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "" "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, " "which addresses a PageSpeed Insights recommendation and improves your page " @@ -3138,25 +3147,25 @@ msgstr "" "شما به %1$sلایسنس فعال%2$sبرای قابلیت Optimize CSS Delivery نیاز دارید،که به" " توصیه PageSpeed Insights پرداخته و عملکرد صفحه شما را بهبود می بخشد." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "تمدید کنید" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "به زودی دسترسی به برخی از ویژگی ها را از دست خواهید داد." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "" "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" "شما به لایسنس%1$sفعال نیاز دارید تا بهینه سازی تحویل css ادامه یابد%2$s." -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "" "The Remove Unused CSS and Load CSS asynchronously features are great options" " to address the PageSpeed Insights recommendations and improve your website " @@ -3167,16 +3176,16 @@ msgstr "" "هستند." #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "این ویژگی ها%1$s به طور خودکار غیرفعال می شوند در%3$s%2$s." -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "لایسنس شما نامعتبر است!" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "" "Your website could be much faster if it could take advantage of our %1$snew " "features and enhancements%2$s. 🚀" @@ -3185,7 +3194,7 @@ msgstr "" "سازی%2$s. 🚀" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "" "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access" " to product updates and support." @@ -3193,12 +3202,12 @@ msgstr "" "لایسنس%1$s افزونه شما در حال انقضاء%2$sاست: به زودی دسترسی به بروزرسانی " "محصول و پشتیبانی را نخواهید داشت." -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "سایت های بیشتری را پرسرعت کنید" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "" "You can use WP Rocket on more websites by upgrading your license. To " "upgrade, simply pay the %1$sprice difference%2$s between your current and " @@ -3209,23 +3218,23 @@ msgstr "" "پرداخت نمایید." #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "" "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "%1$sN.B.%2$s: ارتقاء لایسنس شما تفاوتی در تاریخ انقضاء ایجاد نمی کند" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "ذخیره$%s" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "%s سایت" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "ارتقاء به %s" @@ -3237,19 +3246,6 @@ msgstr "" "می توانید با ارتقاء لایسنس از موشک وردپرس در وب سایت های بیشتری استفاده کنید" " (فقط تفاوت قیمت بین لایسنس های فعلی و جدید خود را پرداخت خواهید کرد)." -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "%1$s:تصاویر بحرانی حذف شدند!" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 -msgid "Script error" -msgstr "خطای اسکریپت" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 -msgid "Script timeout" -msgstr "وقفه اسکریپت" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "باگذاری با تاخیر تصاویر" @@ -3262,15 +3258,15 @@ msgstr "بارگذاری با تاخیر آی‌‌فریم‌ها\\ویدیوه msgid "LazyLoad CSS backgrounds" msgstr "بارگذاری تنبل پس ضمینه CSS" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "آنالیتیکس / تبلیغات" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "افزونه ها" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "قالب ها" @@ -3317,17 +3313,20 @@ msgstr "فشرده کردن/ترکیب جاوا اسکریپت" msgid "Minify CSS" msgstr "فشرده‌سازی CSS" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +msgid "Remove Unused CSS" +msgstr "حذف CSS بدون استفاده" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, #. %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 msgid "" "%1$s: Could not create the %2$s table in the database which is necessary for" -" the Remove Unused CSS feature to work. Please reach out to %3$sour " -"support%4$s." +" the Remove Unused CSS feature to work. Please check our " +"%3$sdocumentation%4$s." msgstr "" -"%1$s: نمی تواند ایجاد شود%2$s جدول در پایگاه داده که نیاز است برای حذف CSS " -"های بلا استفاده برای کارکرد صحیح آن. لطفا برای اطلاعات بیشتر%3$sپشتیبانی " -"ما%4$sتماس بگیرید." +"%1$s:نمی تواند ایجاد کند%2$s جدول در پایگاه داده که برای حذف CSS بلااستفاده " +"کار کند. لطفا مستندات%3$sدراینجا%4$sبررسی کنید." #. translators: %1$s = plugin name. #: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:274 @@ -3335,7 +3334,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "%1$s: کش CSS استفاده شده پاک شد!" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "" "%1$s: The preload service is now active. After the initial preload it will " "continue to cache all your pages whenever they are purged. No further action" @@ -3353,29 +3352,20 @@ msgstr "کارهای معلق پیش بارگذاری" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "پیش بارگذاری برگرداندن کارهای ناموفق گیر کرده است" -#: inc/Engine/Saas/Admin/AdminBar.php:77 -#: inc/Engine/Saas/Admin/AdminBar.php:198 -msgid "Clear Critical Images" -msgstr "پاکسازی تصاویر بحرانی" - -#: inc/Engine/Saas/Admin/AdminBar.php:164 -msgid "Clear Critical Images of this URL" -msgstr "پاکسازی تصاویر این url" - -#: inc/Engine/Saas/Admin/AdminBar.php:167 +#: inc/Engine/Saas/Admin/AdminBar.php:106 msgid "Clear Used CSS of this URL" msgstr "پاکسازی CSS استفاده شده برای این URL" -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Critical Images Cache" -msgstr "کش تصاویر بحرانی" +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" +msgstr "CSS استفاده شده" -#: inc/Engine/Saas/Admin/AdminBar.php:201 -msgid "Remove Used CSS Cache" -msgstr "حذف کش CSS استفاده شده" +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." +msgstr "این عمل همه فایل های CSS استفاده شده را حذف می کند." #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "" "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing " "your pages, the plugin is optimizing LCP and the images above the fold." @@ -3385,7 +3375,7 @@ msgstr "" #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of #. seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." @@ -3394,16 +3384,16 @@ msgstr "" "\t\t\tWP Rocket به تولید CSS استفاده شده تا حداکثر ادامه خواهد داد%2$surlها هر%3$sثانیه()." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "ما پیشنهاد می کنیم %1$sپیش بارگذاری%2$s برای نتایج سریعتر فعال کنید." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:180 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "برای یادگیری پروسه %1$sمستندات%2$s مارا بخوانید." -#: inc/Engine/Saas/Admin/Notices.php:246 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3414,12 +3404,12 @@ msgstr "" "بیشتر عملکرد وب سایت خود، به یک مجوز فعال نیاز دارید." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:249 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "برای دریافت لایسنس %1$sتخفیفی اینجا کلیک کنید!" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:302 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3429,11 +3419,11 @@ msgstr "" "های SaaS جلوگیری می کند. لیست آیپی ها%1$sمستندات اینجا%2$sباید به لیست " "مجازتان اضافله شود:" -#: inc/Engine/Saas/Admin/Notices.php:307 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "- در افزونه امنیت، اگر شما از یکی از آن ها استفاده کنید" -#: inc/Engine/Saas/Admin/Notices.php:308 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "- در فایروال سرور. شرکت هاست شما کمکتان می کند" @@ -3803,7 +3793,7 @@ msgstr[0] "لطفا گزینه %s را برای تداخل با ویژگی ها msgstr[1] "لطفا گزینه %s را برای تداخل با ویژگی های موشک وردپرس غیرفعال کنید:" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" @@ -3812,7 +3802,7 @@ msgstr "" "ایموجی%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP " @@ -3821,7 +3811,7 @@ msgstr "" "%1$s %2$sGZIP compression%3$s تداخل با موشک وردپرس %2$sGZIP compression%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser " @@ -3830,14 +3820,14 @@ msgstr "" "%1$s %2$sbrowser caching%3$sتداخل با موشک وردپرس %2$sbrowser caching%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "" "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" msgstr "%1$s %2$spage caching%3$s تداخل با موشک وردپرس %2$spage caching%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile " @@ -4107,7 +4097,6 @@ msgstr "CDN CNAME" msgid "Purges RocketCDN cached resources for your website. %s" msgstr "تخلیه منابع کش شده RocketCDN برای وب سایت شما.%s" -#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:63 #: views/settings/page-sections/cloudflare.php:36 #: views/settings/page-sections/sucuri.php:37 @@ -4144,7 +4133,6 @@ msgstr "کش Cloudflare" msgid "Purges cached resources for your website. %s" msgstr "پاک‌سازی منابع کش شده برای وب‌سایت شما. %s" -#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:36 msgid "https://support.cloudflare.com/hc/en-us/articles/200169246" msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" @@ -4153,19 +4141,19 @@ msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" msgid "Clear all Cloudflare cache files" msgstr "پاک‌سازی فایل‌های کش Cloudflare" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "تبریک می‌گوییم!" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "راکت وردپرس با موفیت فعال شده و بطور کامل کار می کند." -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "وب سایت شما باید سریعتر بارگیری شود!" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "To guarantee fast websites, WP Rocket automatically applies 80% of web " "performance best practices." @@ -4173,64 +4161,89 @@ msgstr "" "گارانتی سرعت بالای سایت،موشک وردپرس خودکار 80% o عملکرد سایت را بهبود می " "بخشد." -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "We also enable options that provide immediate benefits to your website." msgstr "" "ما همچنین گزینه هایی را که مزایای فوری وب سایت شما را ارائه می دهند فعال می " "کنیم." -#: views/settings/page-sections/dashboard.php:45 +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" msgstr "گزینه‌ها را برای بهینه سازی بیشتر وبسایت خود مشاهده نمایید!" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "حساب من" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "نوسازی اطلاعات" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "با" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "تاریخ انقضا" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "مشاهده حساب من" +#: views/settings/page-sections/dashboard.php:131 views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "تجزیه و تحلیل موشک" + +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/dashboard.php:137 +msgid "" +"I agree to share anonymous data with the development team to help improve WP" +" Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" +"من با اشتراک گذاری داده‌های ناشناس با تیم توسعه برای گسترش موشک وردپرس " +"موافقم. %1$sچه اطلاعاتی را جمع آوری می‌کنیم؟%2$s" + +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "عملیات سریع" -#: views/settings/page-sections/dashboard.php:144 -msgid "Remove all cached files" -msgstr "حذف همه فایل‌های کش شده" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "فایل های کش شده" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." +msgstr "این عمل فایل های کش شده و پیش بارگذاری را حذف می کند." + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "این عمل همه فایل های کش شده را حذف می کند." + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "پاکسازی و پیش بارگذاری" + +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "بازسازی مسیر قطعی CSS" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "سوالات متداول" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "هنوز مشکل شما حل نشده است؟" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:230 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "تیکی ارسال کنید و از پشتیبان‌های با دانش ما کمک بگیرید." -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "درخواست پشتیبانی" @@ -4248,39 +4261,55 @@ msgstr "" msgid "Save Changes and Optimize" msgstr "ذخیره تغییرات و بهینه سازی" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 -msgid "" -"%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image " -"optimization.%2$s" -msgstr "" -"%1$sموشک وردپرس%2$sساخته شده%3$sIMAGIFY%4$s %1$sبرای بهینه سازی تصاویر.%2$s" - -#: views/settings/page-sections/imagify.php:24 +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 msgid "" -"Compress image to make your website faster, all while maintaining image " -"quality." +"%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" msgstr "" -"فشرده سازی تصویر برای سریعتر شدن وب سایت شما ، در عین حفظ کیفیت تصویر." - -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" -msgstr "بیشتر در Imagify:" - -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" -msgstr "برگه افزونه Imagify" +"%1$sراکت وردپرس IMAGIFY ایجاد کرد تا به سایت شما سرعت مضاعفی بدهد!%2$s" #: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" -msgstr "سایت Imagify" - -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" -msgstr "نقدوبررسی افزونه فشرده سازی تصویر" - -#: views/settings/page-sections/imagify.php:38 +msgid "Images can account for 50% of your loading time!" +msgstr "تصاویر می توانند 50 درصد از زمان بارگذاری شما را تشکیل دهند!" + +#: views/settings/page-sections/imagify.php:31 +msgid "" +"Imagify automatically optimizes all your images, helping your website gain " +"precious seconds while saving you time. With just one click, it resizes, " +"compresses, and converts your images to WebP and AVIF formats without " +"sacrificing quality." +msgstr "" +"Imagify به طور خودکار تمام تصاویر شما را بهینه می کند و به وب سایت شما کمک " +"می کند تا ثانیه های ارزشمندی را بدست آورد و در عین حال در زمان شما صرفه جویی" +" کند. تنها با یک کلیک، تصاویر شما را بدون افت کیفیت به فرمت های WebP و AVIF " +"تغییر اندازه، فشرده و تبدیل می کند." + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" +msgstr "%1$sفشرده%2$sهمه تصاویر با یک کلیک" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" +msgstr "%1$sتبدیل%2$sتصاویر به WebP و Avif" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "%1$sتغییرسایز%2$sتصاویر شما" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" +msgstr "%1$sپلن رایگان%2$sشامل 20مگ/ماهانه (حدود 200 تصویر)" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" +msgstr "%1$sنصب Imagify، راحترین بهینه سازی تصویر وردپرس%2$s" + +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "نصب Imagify" From 0cea94cdc95b9af8591d533f0044b804bbb03b94 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 08:42:15 +0000 Subject: [PATCH 167/192] Translate languages/rocket.pot in fr_FR 100% translated source file: 'languages/rocket.pot' on 'fr_FR'. --- languages/rocket-fr_FR.po | 1047 +++++++++++++++++++------------------ 1 file changed, 539 insertions(+), 508 deletions(-) diff --git a/languages/rocket-fr_FR.po b/languages/rocket-fr_FR.po index c0303e87fc..b1ed4346c9 100644 --- a/languages/rocket-fr_FR.po +++ b/languages/rocket-fr_FR.po @@ -6,9 +6,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha2\n" -"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" -"POT-Creation-Date: 2024-05-06T13:28:35+03:00\n" +"Project-Id-Version: WP Rocket 3.17-alpha4\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" +"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Romain • WP Rocket , 2024\n" "Language-Team: French (France) (https://app.transifex.com/wp-media/teams/18133/fr_FR/)\n" @@ -18,7 +18,7 @@ msgstr "" "Language: fr_FR\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.7.1\n" +"X-Generator: WP-CLI 2.4.0\n" #. Plugin Name of the plugin msgid "WP Rocket" @@ -49,9 +49,9 @@ msgstr "https://wp-media.me" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "" "Your site is hosted on %s, we have enabled Varnish auto-purge for " @@ -182,41 +182,31 @@ msgstr "Niveau de cache de Cloudflare défini à %s" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "Erreur de la minification CloudFlare : %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "Minification CloudFlare %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "Erreur du Rocket Loader de CloudFlare : %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "Rocket Loader de CloudFlare %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "Erreur du cache navigateur CloudFlare : %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "Cache navigateur de Cloudflare réglé sur %s " #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "%1$sWP Rocket :%2$s Réglages optimaux activés pour Cloudflare :" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "" "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to " "previous settings:" @@ -224,7 +214,7 @@ msgstr "" "%1$sWP Rocket :%2$s Réglages optimaux désactivés pour Cloudflare, retour aux" " réglages précédents :" -#: inc/Addon/Cloudflare/Subscriber.php:661 inc/admin/options.php:165 +#: inc/Addon/Cloudflare/Subscriber.php:632 inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " msgstr "WP Rocket :" @@ -384,7 +374,7 @@ msgid "Settings" msgstr "Réglages" #: inc/admin/admin.php:96 inc/admin/admin.php:117 inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "Vider ce cache" @@ -418,17 +408,17 @@ msgstr "L'import des réglages a échoué : type de fichier incorrect." msgid "Settings imported and saved." msgstr "Réglages importés et sauvegardés." -#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:571 +#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "Fichiers CSS à exclure" -#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:725 +#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "JavaScript inline exclu" -#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "Fichiers JavaScript exclus" @@ -440,19 +430,19 @@ msgstr "Charger le JavaScript en différé" msgid "Excluded Delay JavaScript Files" msgstr "Fichiers JavaScript exclus du report de l'éxecution" -#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1229 +#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "Ne jamais mettre en cache ces URL(s)" -#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1243 +#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "Ne jamais mettre en cache ces User Agents" -#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1249 +#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "Toujours purger ces URL(s)" -#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1530 +#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "Exclure des fichiers du CDN" @@ -473,8 +463,6 @@ msgid "More info" msgstr "Plus d'infos" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 -#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 msgid "Clear cache" msgstr "Vider le cache" @@ -657,16 +645,15 @@ msgstr "%s : Cache Terme vidé." msgid "%s: User cache cleared." msgstr "%s : Cache Utilisateur vidé." -#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 -#: views/settings/page-sections/dashboard.php:46 +#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 +#: views/settings/page-sections/dashboard.php:47 msgid "Dismiss this notice" msgstr "Ne pas tenir compte de cet avertissement." -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:84 -#: inc/Engine/Saas/Admin/AdminBar.php:202 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:51 msgid "Clear Used CSS" msgstr "Purger le CSS utilisé" @@ -748,8 +735,8 @@ msgstr "Réinstaller la version %s" #: inc/classes/class-wp-rocket-requirements-check.php:203 #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "Retour à la version %s" @@ -781,10 +768,13 @@ msgstr "" "pas/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 -msgid "Clear and preload cache" +msgid "Clear and Preload Cache" msgstr "Vider et précharger le cache" +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear Cache" +msgstr "Vider le cache" + #: inc/common/admin-bar.php:131 inc/functions/i18n.php:20 msgid "All languages" msgstr "Toutes les langues" @@ -809,7 +799,7 @@ msgstr "Purger le cache de RocketCDN" msgid "Documentation" msgstr "Documentation" -#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:36 +#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "Activer Imagify" @@ -955,7 +945,7 @@ msgstr "" "Vous pouvez cocher l'option pour l'inclure dans le préchargement." #. translators: 1 and 3 are link openings, 2 is a link closing. -#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "%1$sRetour à WP Rocket%2$s ou %3$sà la page des Plugins%2$s" @@ -1037,7 +1027,7 @@ msgstr "" msgid "Choose a file from your computer (maximum size: %s)" msgstr "Choisissez un fichier sur votre ordinateur (taille maximum : %s)" -#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:422 +#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "Envoyer le fichier et importer les réglages" @@ -1120,8 +1110,8 @@ msgstr "Options de base" msgid "Static Files" msgstr "Fichiers Statiques" -#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "CDN" @@ -1130,22 +1120,22 @@ msgstr "CDN" msgid "Advanced" msgstr "Options avancées" -#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1345 +#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "Base de données" -#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1051 +#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "Préchargement" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "Outils" -#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:357 -#: views/settings/page-sections/dashboard.php:80 +#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 +#: views/settings/page-sections/dashboard.php:81 msgid "License" msgstr "Licence" @@ -1188,27 +1178,27 @@ msgid "weekly" msgstr "hebdomadaire" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "Révisions" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "Brouillons auto" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "Contenus dans la corbeille" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "Commentaires indésirables" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "Commentaires à la corbeille" @@ -1262,64 +1252,46 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "Regénérer les fichiers de configuration de WP Rocket maintenant" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "Enregistrer les modifications" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "Valider la licence" -#: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 inc/functions/admin.php:550 +#: inc/Engine/Admin/Settings/Page.php:278 +#: inc/Engine/Admin/Settings/Page.php:279 inc/functions/admin.php:550 msgid "Unavailable" msgstr "Indisponible" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "Clé API" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "Adresse e-mail" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "Tableau de bord" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "Aide, info du compte" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "Ma situation" - -#: inc/Engine/Admin/Settings/Page.php:435 views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "Rocket Analytics" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "" -"I agree to share anonymous data with the development team to help improve WP" -" Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" -"J'accepte de partager des données anonymes avec l'équipe de développement " -"pour aider à améliorer WP Rocket. %1$sQuelles informations collecterons-nous" -" ?%2$s" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "Optimisation des fichiers" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "Optimisez CSS & JS" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable this option in Autoptimize." @@ -1328,17 +1300,17 @@ msgstr "" "Autoptimize. Si vous souhaitez utiliser la minification de " "%2$s, désactivez ces options dans Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "Fichiers CSS" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "Fichiers JavaScript" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable those options in Autoptimize." @@ -1347,7 +1319,7 @@ msgstr "" "Autoptimize. Si vous souhaitez utiliser la minification de " "%2$s, désactivez ces options dans Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "" "If you have problems after activating this option, copy and paste the " "default exclusions to quickly resolve issues:" @@ -1356,7 +1328,7 @@ msgstr "" "collez les exclusions par défaut pour résoudre rapidement les problèmes :" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "" "Also, please check our %1$sdocumentation%2$s for a list of compatibility " "exclusions." @@ -1364,7 +1336,7 @@ msgstr "" "Veuillez également consulter notre %1$sdocumentation%2$s pour une liste " "d'exclusions de compatibilité." -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "" "Internal scripts are excluded by default to prevent issues. Remove them to " "take full advantage of this option." @@ -1373,53 +1345,30 @@ msgstr "" "Supprimez-les pour profiter pleinement de cette option." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "" "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" "En cas de problème, rétablissez les exclusions par défaut que vous trouverez" " %1$sici%2$s" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "Minifier les fichiers CSS" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "" "Supprime les espace et les commentaires afin de réduire la taille des " "fichiers CSS." -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "Ceci pourrait casser des choses sur votre site !" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "" -"If you notice any errors on your website after having activated this " -"setting, just deactivate it again, and your site will be back to normal." -msgstr "" -"Si vous remarquez des problèmes sur votre site Web après avoir activé cette " -"option, il vous suffit simplement de la désactiver et votre site sera de " -"nouveau normal." - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "Activer la minification CSS" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "" "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" "Indiquez l’URL des fichiers CSS à exclure de la minification (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).css wildcards to exclude all CSS files located at a " @@ -1430,7 +1379,7 @@ msgstr "" " fichiers CSS pour un chemin donné." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external CSS. %1$sMore info%2$s" @@ -1439,12 +1388,12 @@ msgstr "" "le nom de domaine, pour exclure les fichiers CSS externes. %1$sPlus " "d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "Optimiser le chargement du CSS" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1454,7 +1403,7 @@ msgstr "" "site Web. Une seule méthode peut être sélectionnée. La méthode Supprimer les" " CSS inutilisés est recommandée pour des performances optimales." -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1465,7 +1414,7 @@ msgstr "" "les CSS inutilisés est recommandée pour des performances optimales." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "" "Optimize CSS Delivery features are disabled on local environments. %1$sLearn" " more%2$s" @@ -1473,13 +1422,12 @@ msgstr "" "Les options Optimiser le chargement CSS sont désactivées en local. %1$sEn " "savoir plus%2$s" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" -msgstr "Supprimer les ressources CSS inutilisées" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" +msgstr "Supprimer les ressources CSS inutilisées (RUCSS)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "" "Removes unused CSS per page and helps to reduce page size and HTTP requests." " Recommended for best performance. Test thoroughly! %1$sMore info%2$s" @@ -1488,15 +1436,30 @@ msgstr "" "pages et les requêtes HTTP. Recommandé pour de meilleures performances. " "Testez-le rigoureusement ! %1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "Ceci pourrait casser des choses sur votre site !" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "" +"If you notice any errors on your website after having activated this " +"setting, just deactivate it again, and your site will be back to normal." +msgstr "" +"Si vous remarquez des problèmes sur votre site Web après avoir activé cette " +"option, il vous suffit simplement de la désactiver et votre site sera de " +"nouveau normal." + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "Activer Supprimer les ressources CSS inutilisées" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "Liste des exceptions CSS" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "" "Specify CSS filenames, IDs or classes that should not be removed (one per " "line)." @@ -1504,13 +1467,13 @@ msgstr "" "Indiquez les noms de fichiers CSS, les ID ou les classes qui ne doivent pas " "être supprimés (un par ligne)." -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "Chargement asynchrone du CSS" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "" "Load CSS asynchronously is currently handled by the %1$s plugin. If you want" @@ -1521,19 +1484,19 @@ msgstr "" "Rocket, désactivez le plugin %1$s." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "" "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" "Génère le Critical Path CSS et charge les CSS de manière asynchrone. " "%1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "Critical CSS de secours" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "" "Provides a fallback if auto-generated critical path CSS is incomplete. " "%1$sMore info%2$s" @@ -1541,22 +1504,18 @@ msgstr "" "Fourni un critical path CSS de secours si celui auto-généré est " "incomplet.%1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "Minifier les fichiers JS" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "" "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "" "Supprime les espace et les commentaires afin de réduire la taille des " "fichiers JS." -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "Activer la minification JavaScript" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "" "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" @@ -1564,7 +1523,7 @@ msgstr "" "pouvoir séléctionner)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "" "Combine JavaScript files combines your site’s internal, 3rd party and inline" " JS reducing HTTP requests. Not recommended if your site uses HTTP/2. " @@ -1574,8 +1533,7 @@ msgstr "" "seul fichier, réduisant le nombre de requêtes HTTP. Ces réglages ne sont pas" " recommandés si votre site utilise HTTP/2. %1$sPlus d'infos%2$s" -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "" "For compatibility and best results, this option is disabled when delay " "javascript execution is enabled." @@ -1584,12 +1542,12 @@ msgstr "" "cette option est désactivée lorsque l'option Reporter l'exécution JavaScript" " est activée." -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "Activer la combinaison JavaScript" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "" "Specify patterns of inline JavaScript to be excluded from concatenation (one" " per line). %1$sMore info%2$s" @@ -1597,7 +1555,7 @@ msgstr "" "Indiquez les patterns du code JavaScript inline à exclure de la " "concaténation (un par ligne).%1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "" "Specify URLs of JavaScript files to be excluded from minification and " "concatenation (one per line)." @@ -1605,7 +1563,7 @@ msgstr "" "Indiquez l’URL des fichiers JavaScript à exclure de la minification et de la" " concaténation (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).js wildcards to exclude all JS files located at a " @@ -1616,7 +1574,7 @@ msgstr "" "fichiers JS pour un chemin donné." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external JS. %1$sMore info%2$s" @@ -1625,13 +1583,13 @@ msgstr "" "le nom de domaine, pour exclure les fichiers JS externes. %1$sPlus " "d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "Charger le JavaScript en différé" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "" "Load JavaScript deferred eliminates render-blocking JS on your site and can " "improve load time. %1$sMore info%2$s" @@ -1640,7 +1598,7 @@ msgstr "" "chargement perçu. %1$sPlus d'infos%2$s" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "" "Specify URLs or keywords of JavaScript files to be excluded from defer (one " "per line). %1$sMore info%2$s" @@ -1648,13 +1606,13 @@ msgstr "" "Indiquez les URLs ou des mots-clés des fichiers JavaScript à exclure du " "chargement différé (une par ligne). %1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "Reporter l'exécution JavaScript" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "" "Improves performance by delaying the loading of JavaScript files until user " "interaction (e.g. scroll, click). %1$sMore info%2$s" @@ -1663,11 +1621,11 @@ msgstr "" " jusqu'à l'interaction avec l'utilisateur (ex: défilement, clic). %1$sPlus " "d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "Exclusions en un clic" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "" "When using the Delay JavaScript Execution, you might experience delay " "loading elements located in the viewport that need to appear immediately - " @@ -1677,7 +1635,7 @@ msgstr "" "peut que le chargement d'éléments qui doivent apparaître immédiatement soit " "retardé - ex. : un slider, un en-tête, un menu." -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "" "If you need instant visibility, click below on files that should NOT be " "delayed. This selection will help users interact with the elements straight " @@ -1687,7 +1645,7 @@ msgstr "" "fichiers qui ne doivent PAS être reportés. Cela permettra aux utilisateurs " "d'interagir immédiatement avec ces éléments." -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "" "Specify URLs or keywords that can identify inline or JavaScript files to be " "excluded from delaying execution (one per line)." @@ -1695,24 +1653,24 @@ msgstr "" "Indiquez les URLs ou les mots-clés qui permettent d'identifier les fichiers " "JavaScript ou le JS inline à exclure du report d'exécution (un par ligne)." -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "Média" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "LazyLoad, dimensions des images" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "Autoptimize" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "LazyLoad" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "" "It can improve actual and perceived loading time as images, iframes, and " "videos will be loaded only as they enter (or about to enter) the viewport " @@ -1724,7 +1682,7 @@ msgstr "" "HTTP.%1$sPlus d'infos%2$s" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "" "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s " "LazyLoad, disable this option in %2$s." @@ -1732,12 +1690,12 @@ msgstr "" "Le Lazyload est actuellement activé dans %2$s. Si vous souhaitez utiliser le" " Lazyload de WP Rocket, désactivez cette option dans %2$s." -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "Dimensions des images" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "" "Add missing width and height attributes to images. Helps prevent layout " "shifts and improve the reading experience for your visitors. %1$sMore " @@ -1747,12 +1705,12 @@ msgstr "" "d'éviter les changements de mise en page et d'améliorer l'expérience de " "lecture de vos visiteurs. %1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "Activer pour les images" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "" "LazyLoad for images is currently activated in %2$s. If you want to use " "%1$s’s LazyLoad, disable this option in %2$s." @@ -1760,27 +1718,27 @@ msgstr "" "Le Lazyload est actuellement activé dans %2$s. Si vous souhaitez utiliser le" " Lazyload de %1$s, désactivez cette option dans %2$s." -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "Activer pour les images background CSS" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "Activer sur les iframes et vidéos" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "Remplacer l'iframe Youtube par une image d'aperçu" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "" "Remplacer l'iframe Youtube par une image d’aperçu n’est pas compatible avec " "%2$s." #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "" "This can significantly improve your loading time if you have a lot of " "YouTube videos on a page." @@ -1788,12 +1746,12 @@ msgstr "" "Cela peut considérablement améliorer votre chargement si vous avez beaucoup " "de vidéos Youtube sur une page." -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "Images ou iframes exclues" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "" "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from" " the image or iframe code to be excluded (one per line). %1$sMore info%2$s" @@ -1802,20 +1760,20 @@ msgstr "" "images ou le code de l'iframe à exclure (une par ligne). %1$sPlus " "d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "Ajouter les dimensions d'image manquantes" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "Générez le cache, préchargez les polices" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "Préchargement du cache" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "" "When you enable preloading WP Rocket will automatically detect your sitemaps" " and save all URLs to the database. The plugin will make sure that your " @@ -1825,12 +1783,12 @@ msgstr "" " sitemaps et enregistre toutes les URLs dans la base de données. L'extension" " s'assurera que votre cache est toujours préchargé." -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "Préchargement des liens" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "" "Link preloading improves the perceived load time by downloading a page when " "a user hovers over the link. %1$sMore info%2$s" @@ -1839,11 +1797,11 @@ msgstr "" "téléchargeant une page lorsqu'un utilisateur survole le lien. %1$sPlus " "d'info%2$s" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "Préchargement des requêtes DNS" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "" "DNS prefetching can make external files load faster, especially on mobile " "networks" @@ -1851,12 +1809,12 @@ msgstr "" "Le préchargement des requêtes DNS peut permettre aux ressources externes de " "charger plus rapidement, surtout sur les réseaux mobiles." -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "Préchargement des polices" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "" "Improves performance by helping browsers discover fonts in CSS files. " "%1$sMore info%2$s" @@ -1864,16 +1822,16 @@ msgstr "" "Améliore les performances en aidant les navigateurs à découvrir les polices " "contenues dans les fichiers CSS. %1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "Activer le préchargement" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "URLs à exclure" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "" "Specify URLs to be excluded from the preload feature (one per line). " "%1$sMore info%2$s" @@ -1881,11 +1839,11 @@ msgstr "" "Indiquez les URL à exclure du préchargement (une par ligne). %1$sPlus " "d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "URLs à précharger" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "" "Specify external hosts to be prefetched (no http:, one per " "line)" @@ -1893,11 +1851,11 @@ msgstr "" "Indiquez les hôtes externes à précharger (sans http:, un par " "ligne)" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "Polices à précharger" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "" "Specify urls of the font files to be preloaded (one per line). Fonts must be" " hosted on your own domain, or the domain you have specified on the CDN tab." @@ -1906,7 +1864,7 @@ msgstr "" "polices doivent être hébergées sur votre propre domaine, ou le domaine que " "vous avez spécifié dans l'onglet CDN." -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "" "The domain part of the URL will be stripped automatically.
Allowed font " "extensions: otf, ttf, svg, woff, woff2." @@ -1914,53 +1872,53 @@ msgstr "" "Le nom de domaine sera supprimé automatiquement de l’URL.
Extensions de " "police autorisées : otf, ttf, svg, woff, woff2." -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "Activer le préchargement des liens" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "Règles avancées" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "Affinez les règles du cache" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "" "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "" "Les pages sensibles telles que les URLs de connexion / déconnexion " "personnalisées doivent être exclues du cache." -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "WooCommerce" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "Easy Digital Downloads" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "iThemes Exchange" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "Jigoshop" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "WP-Shop" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing #. tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "" "
Cart, checkout and \"my account\" pages set in " "%1$s%2$s%3$s will be detected and never cached by default." @@ -1969,12 +1927,12 @@ msgstr "" "%1$s%2$s%3$s seront automatiquement détectées et exclues du" " cache par défaut." -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "Délai de nettoyage du cache" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "" "Cache files older than the specified lifespan will be deleted.
Enable " "%1$spreloading%2$s for the cache to be rebuilt automatically after lifespan " @@ -1984,16 +1942,16 @@ msgstr "" "supprimés.
Activez %1$sle préchargement%2$s pour que le cache soit " "rechargé automatiquement après ce délai." -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "Ne jamais mettre en cache ces Cookies" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "Cacher les Query String(s)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "" "%1$sCache for query strings%2$s enables you to force caching for specific " "GET parameters." @@ -2001,7 +1959,7 @@ msgstr "" "%1$sCacher les Query Strings%2$s vous permet de forcer la mise en cache de " "paramètres GET spécifiques." -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "" "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" @@ -2009,7 +1967,7 @@ msgstr "" "illimité)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "" "Reduce lifespan to 10 hours or less if you notice issues that seem to appear" " periodically. %1$sWhy?%2$s" @@ -2017,27 +1975,27 @@ msgstr "" "Réduisez ce délai à 10 heures ou moins si vous remarquez des problèmes " "apparaissant seulement périodiquement.%1$sPourquoi ?%2$s" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "Heures" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "Jours" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "" "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" "Indiquez les URLs des pages ou des articles qui doivent être exclues de la " "mise en cache (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to address multiple URLs under a given path." @@ -2046,7 +2004,7 @@ msgstr "" "expressions régulières (.*) pour exclure plusieurs URLs pour un chemin " "donné." -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "" "Specify full or partial IDs of cookies that, when set in the visitor's " "browser, should prevent a page from getting cached (one per line)" @@ -2054,20 +2012,20 @@ msgstr "" "Indiquez les IDs des cookies qui, lorsqu'ils sont déposés dans le navigateur" " du visiteur, devraient empêcher la mise en cache de la page (un par ligne)" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "" "Specify user agent strings that should never see cached pages (one per line)" msgstr "" "Indiquez les chaînes de user agent qui ne devraient jamais voir les pages " "mises en cache (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "" "Utilisez les expressions régulières (.*) détecter les parties des chaînes " "des UA." -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "" "Specify URLs you always want purged from cache whenever you update any post " "or page (one per line)" @@ -2075,20 +2033,20 @@ msgstr "" "Indiquez les URLs dont vous voulez systématiquement vider le cache lorsque " "vous mettez à jour n'importe quel article ou page (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "" "Indiquez les query strings qui peuvent être mises en cache (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "Optimisez & nettoyez" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "Nettoyage des contenus" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "" "Post revisions and drafts will be permanently deleted. Do not use this " "option if you need to retain revisions or drafts." @@ -2096,19 +2054,19 @@ msgstr "" "Les révisions et les brouillons seront supprimés définitivement. N'utilisez " "pas cette option si vous souhaitez conserver vos révisions et brouillons." -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "Nettoyage des commentaires" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "Les Spams et les commentaires mis à la corbeille seront supprimés" -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "Nettoyage des transients" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "" "Transients are temporary options; they are safe to remove. They will be " "automatically regenerated as your plugins require them." @@ -2117,21 +2075,21 @@ msgstr "" "risque. Elles seront automatiquement régénérées si vos plugins en ont " "besoin." -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "Nettoyage de la base de données" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "Réduit les tables de la base de données" -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "Nettoyage automatique" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "%s révision dans votre base de données." @@ -2140,7 +2098,7 @@ msgstr[2] "%s révisions dans votre base de données." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "%s brouillon dans votre base de données." @@ -2149,7 +2107,7 @@ msgstr[2] "%s brouillons dans votre base de données." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "%s contenu à la corbeille dans votre base de données." @@ -2158,7 +2116,7 @@ msgstr[2] "%s contenus à la corbeille dans votre base de données." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "%s commentaire indésirable dans votre base de données." @@ -2167,64 +2125,64 @@ msgstr[2] "%s commentaires indésirables dans votre base de données." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "%s commentaire mis à la corbeille dans votre base de données." msgstr[1] "%s commentaires mis à la corbeille dans votre base de données." msgstr[2] "%s commentaires mis à la corbeille dans votre base de données." -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "Tous les transients" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "%s transient dans votre base de données." msgstr[1] "%s transients dans votre base de données." msgstr[2] "%s transients dans votre base de données." -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "Optimiser les tables" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "%s table à optimiser dans votre base de données." msgstr[1] "%s tables à optimiser dans votre base de données." msgstr[2] "%s tables à optimiser dans votre base de données." -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "Planifier le nettoyage automatique" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "Fréquence" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "Journalier" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "Hebdomadaire" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "Mensuel" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "Intégrez votre CDN" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "" "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s)" " you provide." @@ -2233,7 +2191,7 @@ msgstr "" "écrites avec le CNAME fourni." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "" "Not required for services like Cloudflare and Sucuri. Please see our " "available %1$sAdd-ons%2$s." @@ -2243,7 +2201,7 @@ msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = #. closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "" "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings " "is not required for %2$l to work on your site." @@ -2262,28 +2220,28 @@ msgstr[2] "" "paramètres CDN n’est pas nécessaire pour que %2$l fonctionnent sur votre " "site." -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "Activer le Content Delivery Network." -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "CNAME(s) CDN" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "Indiquez le(s) CNAME(s) ci-dessous" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "" "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" "Indiquez les URLs des fichiers qui ne doivent pas être servies par le CDN " "(une par ligne)." -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to exclude all files of a given file type located at a specific " @@ -2293,16 +2251,16 @@ msgstr "" "expressions régulières (.*) pour exclure plusieurs URLs pour un chemin " "donné." -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "Contrôlez l'API WordPress Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "" "Reducing or disabling the Heartbeat API’s activity can help save some of " "your server’s resources." @@ -2310,11 +2268,11 @@ msgstr "" "Réduire ou désactiver l’activité de l’API Heartbeat peut permettre " "d’économiser certaines ressources de votre serveur." -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "Réduire ou désactiver l'activité Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Reducing activity will change Heartbeat frequency from one hit each minute " "to one hit every 2 minutes." @@ -2322,55 +2280,55 @@ msgstr "" "La réduction de l'activité fera passer la fréquence Heartbeat d'un coup " "toutes les minutes à un coup toutes les 2 minutes." -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" "La désactivation complète de Heartbeat peut endommager les plugins et les " "thèmes utilisant cette API." -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "Ne pas limiter" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "Réduire l'activité" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "Désactiver" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "Contrôler Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "Comportement en Backend" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "Comportement dans l’éditeur d'article" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "Comportement en Frontend" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "Add-ons" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "Ajoutez des fonctionnalités" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "One-click Rocket Add-ons" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "" "One-Click Add-ons are features extending available options without " "configuration needed. Switch the option \"on\" to enable from this screen." @@ -2379,21 +2337,21 @@ msgstr "" "disponibles sans besoin de configuration. Mettez l'option sur \"ON\" pour " "l'activer depuis cet écran." -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "Rocket Add-ons" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "" "Ce sont de simples fonctionnalités complémentaires étendant les option déjà " "disponibles." -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "Cache utilisateur" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "" "If you need to create a dedicated set of cache files for each logged-in " "WordPress user, you must activate this add-on." @@ -2402,7 +2360,7 @@ msgstr "" "chaque utilisateur connecté à WordPress, vous devez activer cet add-on." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "" "User cache is great when you have user-specific or restricted content on " "your website.
%1$sLearn more%2$s" @@ -2410,16 +2368,16 @@ msgstr "" "Le cache utilisateur est parfait si vous avez du contenu spécifique ou " "restreint pour les utilisateurs de votre site.
%1$sEn savoir plus%2$s" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "CloudFlare" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "Intégrez votre compte Cloudflare avec cet add-on" -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "" "Provide your account email, global API key, and domain to use options such " "as clearing the Cloudflare cache and enabling optimal settings with WP " @@ -2430,7 +2388,7 @@ msgstr "" "réglages optimaux pour WP Rocket." #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "" "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just " "activate the official Cloudflare plugin and configure it. WP Rocket will " @@ -2440,16 +2398,16 @@ msgstr "" " suffit d'activer le plugin officiel Cloudflare et de le configurer. WP " "Rocket activera automatiquement la compatibilité." -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "Varnish" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "Si votre serveur utilise Varnish, vous devez activer cet add-on" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "" "Varnish cache will be purged each time WP Rocket clears its cache to ensure " "content is always up-to-date.
%1$sLearn more%2$s" @@ -2458,16 +2416,16 @@ msgstr "" "pour vous assurer que le contenu soit toujours à jour.
%1$sEn savoir " "plus%2$s" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "Compatibilité WebP" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "Améliore la compatibilité des navigateurs pour les images WebP." #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "" "Enable this option if you would like WP Rocket to serve WebP images to " "compatible browsers. Please note that WP Rocket cannot create WebP images " @@ -2479,11 +2437,11 @@ msgstr "" "d'images WebP pour vous. Pour créer des images WebP, nous vous recommandons " "%1$sImagify%2$s. %3$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "Effacez le cache Sucuri lorsque le cache de WP Rocket est effacé." -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "" "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is " "cleared." @@ -2491,49 +2449,49 @@ msgstr "" "Fournissez votre clé API pour vider le cache Sucuri lorsque le cache de WP " "Rocket est effacé." -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "Sucuri" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "Synchronisez le cache Sucuri avec cet add-on." -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "Accès CloudFlare" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "Réglages CloudFlare" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "Clé API globale :" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "Trouver votre clé API" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "E-mail du compte" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "Zone ID" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "Mode développement" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "" "Temporarily activate development mode on your website. This setting will " "automatically turn off after 3 hours. %1$sLearn more%2$s" @@ -2541,11 +2499,11 @@ msgstr "" "Active temporairement le mode développement sur votre site. Ce réglage se " "désactivera automatiquement après 3 heures. %1$sEn savoir plus%2$s" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "Réglages optimaux" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "" "Automatically enhances your Cloudflare configuration for speed, performance " "grade and compatibility." @@ -2553,11 +2511,11 @@ msgstr "" "Améliore automatiquement votre configuration Cloudflare pour le temps de " "chargement, les notes de performance et la compatibilité." -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "Protocol relatif" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "" "Should only be used with Cloudflare's flexible SSL feature. URLs of static " "files (CSS, JS, images) will be rewritten to use // instead of http:// or " @@ -2567,11 +2525,11 @@ msgstr "" "URLs de vos fichiers statiques (CSS, JS, images) seront ré-écrites pour " "utiliser // au lieu de http:// ou https:// ." -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "Accès Sucuri" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "" "Firewall API key (for plugin), must be in format {32 characters}/{32 " @@ -2580,24 +2538,22 @@ msgstr "" "La clé API du pare-feu (pour cette extension) doit être au format {32 " "caractères}/{32 caractères} :" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "Trouver votre clé API" #. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: -#. opening a tag, %4$s: option a tag, %5$s: opening a tag. -#: inc/Engine/Admin/Settings/Page.php:2295 +#. opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 msgid "" -"%1$sWP Rocket:%2$s the plugin has been updated to the 3.16 version. Our " -"brand new feature %3$sOptimize critical images%5$s is automatically " -"activated now! Also, the Cache tab was removed but the existing features " -"will remain working, %4$ssee more here%5$s." +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " +"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " +"more about it." msgstr "" -"%1$sWP Rocket :%2$s le plugin a été mis à jour vers la version 3.16. Notre " -"nouvelle fonctionnalité %3$sOptimiser les images essentielles%5$s est " -"automatiquement activée ! L'onglet Cache a également été supprimé, mais les " -"fonctionnalités habituelles sont toujours présentes, %4$sen savoir plus%5$s." +"%1$sWP Rocket :%2$s le plugin a été mis à jour vers la version 3.17. " +"Nouvelle fonctionnalité : %3$s Rendu différé automatique %4$s. Consultez " +"notre documentation pour en savoir plus." #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" @@ -2616,25 +2572,25 @@ msgstr "" "ces URL(s) n'a pas été sauvegardé car cette valeur désactive le cache et les" " optimisations sur toutes les pages du site." -#: inc/Engine/Admin/Settings/Subscriber.php:172 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "Importez, exportez, restaurez" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "Optimisation des images" -#: inc/Engine/Admin/Settings/Subscriber.php:198 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "Compressez vos images" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "Tutoriels" -#: inc/Engine/Admin/Settings/Subscriber.php:216 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "Prise en main et tutos vidéos" @@ -2642,15 +2598,15 @@ msgstr "Prise en main et tutos vidéos" msgid "WP Rocket Expired Cache Interval" msgstr "Intervalle de cache de WP Rocket expiré" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "valeur de WP_CACHE" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "Cache" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "" "The WP_CACHE constant needs to be set to true for WP Rocket cache to work " "properly" @@ -2658,38 +2614,38 @@ msgstr "" "La constante WP_CACHE doit être définie à true pour que le cache de WP " "Rocket fonctionne correctement" -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "WP_CACHE est réglée sur true" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "WP_CACHE n’est pas définie" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "WP_CACHE est réglée sur false" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "Prochaine date de facturation" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "Pas d'abonnement" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "Votre abonnement RocketCDN est actuellement actif." #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing #. tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "Pour utiliser RocketCDN, remplacez votre CNAME par %1$s%2$s%3$s." #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2759,16 +2715,16 @@ msgstr "RocketCDN désactivé" #. Translators: %s = date formatted using date_i18n() and get_option( #. 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "Valable uniquement jusqu'au %s !" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "Accélérez votre site web grâce à :" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "" "High performance Content Delivery Network (CDN) with %1$sunlimited " "bandwidth%2$s" @@ -2777,7 +2733,7 @@ msgstr "" "illimitée%2$s" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "" "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "" @@ -2785,7 +2741,7 @@ msgstr "" "automatiquement appliqués" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "" "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in" " our plugin" @@ -2793,12 +2749,12 @@ msgstr "" "Intégration à WP Rocket : l'option CDN est %1$sautomatiquement " "configurée%2$s dans notre plugin" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "En savoir plus sur RocketCDN" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "" "*$%1$s/month for 12 months then $%2$s/month. You can cancel your " "subscription at any time." @@ -2806,33 +2762,33 @@ msgstr "" "*%1$s$/mois pour 12 mois puis %2$s$/mois. Vous pouvez résilier votre " "abonnement à tout moment." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "Facturation mensuelle" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "S'abonner" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "Réduire cette bannière" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "" "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "Accélérez votre site web grâce à RocketCDN, le CDN de WP Rocket." -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "En savoir plus" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "RocketCDN n'est pas disponible en local et sur les sites tests." -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "Obtenir RocketCDN" @@ -2845,6 +2801,18 @@ msgid "" "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network!" msgstr "Accélérez votre site web grâce à RocketCDN, le CDN de WP Rocket." +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "Trop de requêtes." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "Réponse non valide." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "Type de requête non valide." + #: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "WP Rocket traite les tâches en attente" @@ -2857,11 +2825,52 @@ msgstr "WP Rocket efface les tâches qui ont échoué" msgid "WP Rocket process on submit jobs" msgstr "WP Rocket traite les tâches en cours" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Priority Elements" +msgstr "Vider les Éléments prioritaires" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Priority Elements of this URL" +msgstr "Vider les Éléments prioritaires pour cet URL" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Priority Elements" +msgstr "Éléments prioritaires" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear" +msgstr "Vider" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "" +"This action will clear the Critical Images and Lazily Rendered Content." +msgstr "Cette action videra les Images critiques et le Rendu différé." + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "%1$s : Images Critiques et Rendu différé effacés !" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "Erreur du script" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "Timeout du script" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "Il n'a pas été possible de déterminer une échéance valable : %s." + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "Chaque minute" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "Régénérer Critical path CSS" @@ -2890,7 +2899,6 @@ msgstr "%l pour utiliser cette fonction." msgid "Publish the %s" msgstr "Publié le %s" -#. translators: %s = post type. #: inc/Engine/CriticalPath/Admin/Post.php:223 msgid "Enable Load CSS asynchronously in WP Rocket settings" msgstr "Activez Chargement Asynchrone du CSS dans les réglages de WP Rocket" @@ -2905,7 +2913,7 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "Le Critical CSS pour %1$s n'a pas été généré. Erreur : %2$s" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "empty response." @@ -2914,7 +2922,7 @@ msgstr "" "réponse vide." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an empty " "response." @@ -2923,19 +2931,19 @@ msgstr "" "réponse vide." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "Le Critical CSS pour %1$s sur mobile n'a pas été généré." #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "Le Critical CSS pour %1$s n'a pas été généré." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "invalid response code." @@ -2944,7 +2952,7 @@ msgstr "" "renvoyé une réponse vide." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an invalid " "response code." @@ -2953,8 +2961,8 @@ msgstr "" "réponse vide." #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "Erreur : %1$s" @@ -3043,38 +3051,38 @@ msgid "Critical CSS file cannot be deleted" msgstr "Le fichier Critical CSS ne peut être supprimé" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "Le Critical CSS mobile pour %1$s n'a pas été généré." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "Critical CSS pour %s en cours." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "Critical CSS mobile pour %s généré." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "Critical CSS pour %s généré." -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "Le fichier Critical CSS a bien été supprimé." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "Timeout pour le Critical CSS mobile de%1$s. Veuillez réessayer un peu plus " "tard." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "Timeout pour le Critical CSS de%1$s. Veuillez réessayer un peu plus tard." @@ -3209,39 +3217,39 @@ msgid "Unlimited" msgstr "Illimité" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "- %s" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "La promo %s est en ligne !" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "Dépêchez-vous ! Le deal se termine dans :" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "Minutes" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "secondes" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "Mettez à niveau maintenant" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "L'option Optimiser le chargement du CSS est désactivée." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "" "You can no longer use the Remove Unused CSS or Load CSS asynchronously " "options." @@ -3250,7 +3258,7 @@ msgstr "" "inutilisées ou Chargement asynchrone du CSS." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "" "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, " "which addresses a PageSpeed Insights recommendation and improves your page " @@ -3260,26 +3268,26 @@ msgstr "" "chargement de votre CSS, ce qui répond à une recommandation de PageSpeed " "Insights et améliore les performances de vos pages." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "Renouveler maintenant" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "Vous perdrez bientôt l'accès à certaines options." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "" "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" "Vous avez besoin d'une %1$slicence active pour continuer à optimiser le " "chargement de votre CSS%2$s." -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "" "The Remove Unused CSS and Load CSS asynchronously features are great options" " to address the PageSpeed Insights recommendations and improve your website " @@ -3291,16 +3299,16 @@ msgstr "" " site Web." #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "Ces options seront %1$sautomatiquement désactivées le %3$s%2$s." -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "Votre licence WP Rocket est expirée !" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "" "Your website could be much faster if it could take advantage of our %1$snew " "features and enhancements%2$s. 🚀" @@ -3309,7 +3317,7 @@ msgstr "" "nos %1$s nouvelles fonctionnalités et améliorations%2$s.🚀" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "" "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access" " to product updates and support." @@ -3317,12 +3325,12 @@ msgstr "" "Votre %1$slicence WP Rocket est sur le point d'expirer%2$s : vous perdrez " "bientôt l'accès aux mises à jour et au support." -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "Accélérez plus de sites web" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "" "You can use WP Rocket on more websites by upgrading your license. To " "upgrade, simply pay the %1$sprice difference%2$s between your current and " @@ -3333,7 +3341,7 @@ msgstr "" "entre votre licence actuelle et la nouvelle, comme indiqué ci-dessous." #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "" "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "" @@ -3341,17 +3349,17 @@ msgstr "" "d'expiration" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "Économisez %s$" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "%s sites" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "Mettez à niveau vers %s" @@ -3364,19 +3372,6 @@ msgstr "" "mettant à niveau votre licence (vous ne paierez que la différence de prix " "entre votre licence actuelle et la nouvelle)." -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "%1$s : Images Critiques effacées !" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:131 -msgid "Script error" -msgstr "Erreur du script" - -#: inc/Engine/Media/AboveTheFold/AJAX/Controller.php:134 -msgid "Script timeout" -msgstr "Timeout du script" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "LazyLoad sur les images" @@ -3389,15 +3384,15 @@ msgstr "LazyLoad sur les iframes et vidéos" msgid "LazyLoad CSS backgrounds" msgstr "LazyLoad background CSS" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "Analyses & publicités" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "Extensions" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "Thèmes" @@ -3445,17 +3440,21 @@ msgstr "Minifier / Combiner le JavaScript" msgid "Minify CSS" msgstr "Minifier les fichiers CSS" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +msgid "Remove Unused CSS" +msgstr "Supprimer les ressources CSS inutilisées" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, #. %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 msgid "" "%1$s: Could not create the %2$s table in the database which is necessary for" -" the Remove Unused CSS feature to work. Please reach out to %3$sour " -"support%4$s." +" the Remove Unused CSS feature to work. Please check our " +"%3$sdocumentation%4$s." msgstr "" "%1$s: Impossible de créer la %2$s table nécessaire au fonctionnement de " -"Supprimer les Ressources CSS inutilisées dans la base de données. " -"%3$sVeuillez contacter notre support%4$s." +"Supprimer les Ressources CSS inutilisées dans la base de données. Veuillez " +"consulter %3$snotre documentation%4$s." #. translators: %1$s = plugin name. #: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:274 @@ -3463,7 +3462,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "%1$s: Cache du CSS utilisé vidée !" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "" "%1$s: The preload service is now active. After the initial preload it will " "continue to cache all your pages whenever they are purged. No further action" @@ -3482,40 +3481,31 @@ msgid "WP Rocket Preload revert stuck failed jobs" msgstr "" "Le Prechargement de WP Rocket rétablit les tâches bloquées qui ont échoué" -#: inc/Engine/Saas/Admin/AdminBar.php:77 -#: inc/Engine/Saas/Admin/AdminBar.php:198 -msgid "Clear Critical Images" -msgstr "Réinitialiser les images critiques" - -#: inc/Engine/Saas/Admin/AdminBar.php:164 -msgid "Clear Critical Images of this URL" -msgstr "Réinitialiser les images critiques pour cette URL" - -#: inc/Engine/Saas/Admin/AdminBar.php:167 +#: inc/Engine/Saas/Admin/AdminBar.php:106 msgid "Clear Used CSS of this URL" msgstr "Nettoyer le CSS utilisé pour cet URL" -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Critical Images Cache" -msgstr "Cache des images citiques" +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" +msgstr "CSS utilisé" -#: inc/Engine/Saas/Admin/AdminBar.php:201 -msgid "Remove Used CSS Cache" -msgstr "Supprimer le cache du CSS utilisé" +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." +msgstr "Cette action effacera les fichiers CSS utilisés." #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "" "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing " "your pages, the plugin is optimizing LCP and the images above the fold." msgstr "" -"%1$s : Veuillez patienter %2$s scrondes. La Suppression des ressources CSS " +"%1$s : Veuillez patienter %2$s secondes. La Suppression des ressources CSS " "inutilisées traite vos pages, le plugin optimise le LCP et les images au-" "dessus de la ligne de flottaison." #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of #. seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." @@ -3524,19 +3514,19 @@ msgstr "" "\t\t\tWP Rocket continuera à générer les CSS utilisés pour un maximum de %2$s URL par %3$s seconde(s)." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" "Nous vous suggérons d'activer le %1$sPréchargement%2$s pour obtenir des " "résultats plus rapides." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:180 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" "Pour en savoir plus sur le processus, consultez notre %1$sdocumentation%2$s." -#: inc/Engine/Saas/Admin/Notices.php:246 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3548,13 +3538,13 @@ msgstr "" "performances de votre site Web." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:249 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "" "Cliquez ici pour obtenir une licence Single de WP Rocket à moins %1$s !" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:302 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3564,11 +3554,11 @@ msgstr "" "Rocket d'accéder aux options SaaS. Les IP répertoriées %1$sdans notre " "documentation%2$s doivent être autorisées :" -#: inc/Engine/Saas/Admin/Notices.php:307 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "- Dans le plugin de sécurité, si vous en utilisez un" -#: inc/Engine/Saas/Admin/Notices.php:308 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "" "- Dans le pare-feu du serveur. Votre hébergeur peut vous aider à le faire" @@ -3962,7 +3952,7 @@ msgstr[2] "" " fonctions de WP Rocket :" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" @@ -3971,7 +3961,7 @@ msgstr "" " emojis%3$s de WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP " @@ -3981,7 +3971,7 @@ msgstr "" "Gzip%3$s de WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser " @@ -3991,7 +3981,7 @@ msgstr "" "navigateur %3$s de WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "" "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" @@ -4000,7 +3990,7 @@ msgstr "" " cache de page %3$s de WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile " @@ -4284,7 +4274,6 @@ msgstr "CNAME CDN" msgid "Purges RocketCDN cached resources for your website. %s" msgstr "Purge les ressources mises en cache de votre RocketCDN. %s" -#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:63 #: views/settings/page-sections/cloudflare.php:36 #: views/settings/page-sections/sucuri.php:37 @@ -4321,7 +4310,6 @@ msgstr "Cache de CloudFlare" msgid "Purges cached resources for your website. %s" msgstr "Purge les ressources mises en cache de votre site web. %s" -#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:36 msgid "https://support.cloudflare.com/hc/en-us/articles/200169246" msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" @@ -4330,19 +4318,19 @@ msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" msgid "Clear all Cloudflare cache files" msgstr "Vider le cache CloudFlare" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "Félicitations !" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "WP Rocket est maintenant activé et travaille déjà pour vous." -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "Votre site devrait être déjà plus rapide !" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "To guarantee fast websites, WP Rocket automatically applies 80% of web " "performance best practices." @@ -4350,67 +4338,93 @@ msgstr "" "Pour des sites web plus rapides, WP Rocket applique automatiquement 80 % des" " bonnes pratiques en matière de performance web." -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "We also enable options that provide immediate benefits to your website." msgstr "" "Nous activons aussi les options qui profitent immédiatement à votre site." -#: views/settings/page-sections/dashboard.php:45 +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" msgstr "" "Continuez avec les options si vous souhaitez optimiser encore plus votre " "site !" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "Mon compte" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "Actualiser" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "avec" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "Date d'expiration" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "Mon compte" +#: views/settings/page-sections/dashboard.php:131 views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "Rocket Analytics" + +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/dashboard.php:137 +msgid "" +"I agree to share anonymous data with the development team to help improve WP" +" Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" +"J'accepte de partager des données anonymes avec l'équipe de développement " +"pour aider à améliorer WP Rocket. %1$sQuelles informations collecterons-nous" +" ?%2$s" + +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "Actions rapides" -#: views/settings/page-sections/dashboard.php:144 -msgid "Remove all cached files" -msgstr "Supprimer tous les fichiers du cache" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "Fichiers de cache" + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." +msgstr "Cette action effacera et préchargera tous les fichiers du cache." + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "Cette action effacera tous les fichiers du cache." + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "Effacer et précharger" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "Régénérer le Critical CSS" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "Foire aux questions" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "Toujours pas trouvé de solution ?" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:230 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" "Envoyez un ticket ci-dessous et obtenez l'aide de nos sympathiques " "Rocketeers." -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "Demandez au Support" @@ -4427,41 +4441,58 @@ msgstr "Toute optimisation faite de la base de donnée est irréversible." msgid "Save Changes and Optimize" msgstr "Sauvegarder et optimiser" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 msgid "" -"%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image " -"optimization.%2$s" +"%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" msgstr "" -"%1$sWP ROCKET%2$s a créé %3$sIMAGIFY%4$s %1$spour une optimisation d'image " -"de première classe.%2$s" +"%1$sWP Rocket a créé IMAGIFY pour donner un coup de pouce à la vitesse de " +"votre site web !%2$s" -#: views/settings/page-sections/imagify.php:24 +#: views/settings/page-sections/imagify.php:28 +msgid "Images can account for 50% of your loading time!" +msgstr "Les images peuvent représenter 50 % du temps de chargement !" + +#: views/settings/page-sections/imagify.php:31 msgid "" -"Compress image to make your website faster, all while maintaining image " -"quality." +"Imagify automatically optimizes all your images, helping your website gain " +"precious seconds while saving you time. With just one click, it resizes, " +"compresses, and converts your images to WebP and AVIF formats without " +"sacrificing quality." msgstr "" -"Compressez vos images pour rendre votre site Web plus rapide, tout en " -"maintenant leurs qualités." +"Imagify optimise automatiquement toutes vos images, permettant ainsi à votre" +" site web de gagner de précieuses secondes tout en vous faisant gagner du " +"temps. En un seul clic, il redimensionne, compresse et convertit vos images " +"aux formats WebP et AVIF sans sacrifier la qualité." -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" -msgstr "Plus sur Imagify :" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" +msgstr "%1$sCompresser%2$s toutes vos images en un seul clic" -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" -msgstr "Page du plugin" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" +msgstr "%1$sConvertir%2$s images vers WebP et Avif" -#: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" -msgstr "Site web Imagify" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "%1$sRedimensionner%2$s vos images à la volée" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" -msgstr "Comparatif des plugins de compression d'images" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" +msgstr "%1$sPlan gratuit%2$s comprend 20MB/mois (environ 200 images)" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" +msgstr "" +"%1$sInstaller Imagify, le plus simple des optimiseurs d'images pour " +"WordPress%2$s" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "Installer Imagify" From b104f24c6008c50078d920938e67fc1038602d64 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 08:42:34 +0000 Subject: [PATCH 168/192] Translate languages/rocket.pot in fr_FR 100% translated source file: 'languages/rocket.pot' on 'fr_FR'. --- languages/rocket-fr_FR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-fr_FR.po b/languages/rocket-fr_FR.po index b1ed4346c9..445940680f 100644 --- a/languages/rocket-fr_FR.po +++ b/languages/rocket-fr_FR.po @@ -4402,7 +4402,7 @@ msgstr "Cette action effacera tous les fichiers du cache." #: views/settings/page-sections/dashboard.php:169 msgid "Clear and preload" -msgstr "Effacer et précharger" +msgstr "Vider et précharger" #: views/settings/page-sections/dashboard.php:183 #: views/settings/page-sections/dashboard.php:189 From 1a3cd19c1418c4a51e9bd4b51766ed81805e08a3 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:46:43 +0000 Subject: [PATCH 169/192] Translate languages/rocket.pot in de_DE 100% translated source file: 'languages/rocket.pot' on 'de_DE'. --- languages/rocket-de_DE.po | 1040 +++++++++++++++++++------------------ 1 file changed, 547 insertions(+), 493 deletions(-) diff --git a/languages/rocket-de_DE.po b/languages/rocket-de_DE.po index fd5d9ad83d..da47ee189a 100644 --- a/languages/rocket-de_DE.po +++ b/languages/rocket-de_DE.po @@ -4,14 +4,14 @@ # Caspar Hübinger, 2020 # Rico Michael , 2021 # Ben_Mew , 2023 -# Romain • WP Rocket , 2023 +# Romain • WP Rocket , 2024 # Christian Herrmann, 2024 # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha1\n" +"Project-Id-Version: WP Rocket 3.17-alpha4\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-04-29T20:40:45+00:00\n" +"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Christian Herrmann, 2024\n" "Language-Team: German (Germany) (https://app.transifex.com/wp-media/teams/18133/de_DE/)\n" @@ -53,9 +53,9 @@ msgstr "https://wp-media.me" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "" "Your site is hosted on %s, we have enabled Varnish auto-purge for " @@ -187,41 +187,31 @@ msgstr "Cloudflare Cache Level: %s" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "Fehler mit Cloudflare Minification: %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "Cloudflare Minification: %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "Fehler mit Cloudflare RocketLoader: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "Cloudflare RocketLoader: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "Fehler mit CloudFlare Browser Cache: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "Cloudflare-Browsercache auf %s eingestellt" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "%1$sWP Rocket:%2$s Optimale Einstellungen für Cloudflare aktiviert:" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "" "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to " "previous settings:" @@ -229,7 +219,7 @@ msgstr "" "%1$sWP Rocket:%2$s Optimale Einstellungen für Cloudflare wurden deaktiviert " "und die vorherigen Einstellungen wiederhergestellt:" -#: inc/Addon/Cloudflare/Subscriber.php:661 inc/admin/options.php:165 +#: inc/Addon/Cloudflare/Subscriber.php:632 inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " msgstr "WP Rocket: " @@ -381,7 +371,7 @@ msgid "Settings" msgstr "Einstellungen" #: inc/admin/admin.php:96 inc/admin/admin.php:117 inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "Diesen Cache leeren" @@ -415,17 +405,17 @@ msgstr "Import der Einstellungen fehlgeschlagen: Unerwarteter Dateiinhalt." msgid "Settings imported and saved." msgstr "Einstellungen importiert und gespeichert." -#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:571 +#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "CSS-Ausnahmen" -#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:725 +#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "Ausgenommenes Inline JavaScript" -#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "JavaScript-Ausnahmen" @@ -437,19 +427,19 @@ msgstr "JavaScript-Dateien aufschieben" msgid "Excluded Delay JavaScript Files" msgstr "Ausgenommene verzögerte JavaScript-Dateien" -#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1229 +#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "Nie cachen (URLs)" -#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1243 +#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "Nie cachen (User Agents)" -#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1249 +#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "Immer löschen (URLs)" -#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1530 +#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "Dateien vom CDN ausschließen" @@ -469,8 +459,6 @@ msgid "More info" msgstr "Mehr erfahren" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 -#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 msgid "Clear cache" msgstr "Cache leeren" @@ -654,16 +642,15 @@ msgstr "%s: Cache für Begriff geleert." msgid "%s: User cache cleared." msgstr "%s: Cache für Benutzer/-in geleert." -#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 -#: views/settings/page-sections/dashboard.php:46 +#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 +#: views/settings/page-sections/dashboard.php:47 msgid "Dismiss this notice" msgstr "Diese Meldung ausblenden" -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:80 -#: inc/Engine/Saas/Admin/AdminBar.php:198 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:51 msgid "Clear Used CSS" msgstr "Benutztes CSS leeren" @@ -743,8 +730,8 @@ msgstr " Version %s wiederherstellen" #: inc/classes/class-wp-rocket-requirements-check.php:203 #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "%s Update zurückrollen" @@ -772,10 +759,13 @@ msgstr "" "working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 -msgid "Clear and preload cache" +msgid "Clear and Preload Cache" msgstr "Cache leeren und vorladen" +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear Cache" +msgstr "Cache leeren" + #: inc/common/admin-bar.php:131 inc/functions/i18n.php:20 msgid "All languages" msgstr "Alle Sprachen" @@ -800,7 +790,7 @@ msgstr "RocketCDN-Cache leeren" msgid "Documentation" msgstr "Dokumentation" -#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:36 +#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "Imagify aktivieren" @@ -943,7 +933,7 @@ msgstr "" "Aktiviere diese Option, um den Cache damit zu füllen." #. translators: 1 and 3 are link openings, 2 is a link closing. -#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "%1$sZurück zu WP Rocket%2$s oder %3$szur Plugins-Seite gehen%2$s" @@ -1025,7 +1015,7 @@ msgstr "" msgid "Choose a file from your computer (maximum size: %s)" msgstr "Wähle eine Datei von deinem Computer (maximale Größe: %s)" -#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:422 +#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "Datei hochladen und Einstellungen importieren." @@ -1108,8 +1098,8 @@ msgstr "Basis" msgid "Static Files" msgstr "Statische Dateien" -#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "CDN" @@ -1118,22 +1108,22 @@ msgstr "CDN" msgid "Advanced" msgstr "Erweitert" -#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1345 +#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "Datenbank" -#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1051 +#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "Cache füllen" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:170 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "Werkzeuge" -#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:357 -#: views/settings/page-sections/dashboard.php:80 +#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 +#: views/settings/page-sections/dashboard.php:81 msgid "License" msgstr "Lizenz" @@ -1175,27 +1165,27 @@ msgid "weekly" msgstr "wöchentlich" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "Revisionen" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "Automatisch erstellte Entwürfe" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "Gelöschte Einträge (Papierkorb)" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "Spam-Kommentare" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "Gelöschte Kommentare (Papierkorb)" @@ -1247,64 +1237,46 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "Konfigurationsdateien von WP-Rocket jetzt regenerieren" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "Änderungen speichern" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "Lizenz prüfen" -#: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 inc/functions/admin.php:550 +#: inc/Engine/Admin/Settings/Page.php:278 +#: inc/Engine/Admin/Settings/Page.php:279 inc/functions/admin.php:550 msgid "Unavailable" msgstr "Server nicht erreichbar" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "API-Schlüssel" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "E-Mail-Adresse" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "Dashboard" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "Konto-Übersicht, Hilfe" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "Mein Status" - -#: inc/Engine/Admin/Settings/Page.php:435 views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "Rocket Analytics" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "" -"I agree to share anonymous data with the development team to help improve WP" -" Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" -"Ich erlaube dem Entwicklungsteam von WP Rocket, anonyme Daten aus meiner " -"Installation zum Zweck der Produktverbesserung zu erheben. %1$sWelche Daten " -"werden gesammelt?%2$s" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "Datei-Optimierung" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "CSS und JS optimieren" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable this option in Autoptimize." @@ -1313,17 +1285,17 @@ msgstr "" "Falls du die Minifizierung von %2$sbenutzen willst, deaktiviere diese Option" " in Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "CSS-Dateien" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "JavaScript-Dateien" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable those options in Autoptimize." @@ -1332,7 +1304,7 @@ msgstr "" "Wenn du die Minifizierung von %2$s nutzen möchtest, deaktiviere die " "entsprechenden Einstellungen in Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "" "If you have problems after activating this option, copy and paste the " "default exclusions to quickly resolve issues:" @@ -1341,7 +1313,7 @@ msgstr "" "Standardexklusionen und füge sie ein, um diese schnell zu beheben:" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "" "Also, please check our %1$sdocumentation%2$s for a list of compatibility " "exclusions." @@ -1349,7 +1321,7 @@ msgstr "" "Bitte lies auch unsere %1$sDokumentation%2$s mit einer Liste von Exklusionen" " aus Kompatibilitätsgründen." -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "" "Internal scripts are excluded by default to prevent issues. Remove them to " "take full advantage of this option." @@ -1358,52 +1330,29 @@ msgstr "" "verhindern. Entferne sie, um diese Funktion voll auszureizen." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "" "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" "Falls das zu Schwierigkeiten führt, stelle die Standardexklusionen wieder " "her, die du %1$shier%2$s findest" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "CSS minifizieren" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "Entfernt Leerzeilen und Kommentare zur Reduzierung der Datei-Größe." -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "Dies könnte Probleme bereiten!" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "" -"If you notice any errors on your website after having activated this " -"setting, just deactivate it again, and your site will be back to normal." -msgstr "" -"Falls du nach der Aktivierung dieser Einstellung Unregelmäßigkeiten auf " -"deiner Website bemerken solltest, deaktiviere sie einfach wieder, und deine " -"Site wird wieder normal aussehen." - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "Verstanden, aktiviere „CSS minifizieren“" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "" "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" "Gib die URLs der CSS-Dateien an, die nicht minifiziert werden sollen (eine " "pro Zeile)." -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).css wildcards to exclude all CSS files located at a " @@ -1414,7 +1363,7 @@ msgstr "" "in einem angegebenen Pfad befinden." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external CSS. %1$sMore info%2$s" @@ -1422,12 +1371,12 @@ msgstr "" "Drittanbieter: Benutze entweder den vollständigen URL-Pfad " "oder nur den Domainnamen, um externes CSS auszunehmen. %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "CSS-Darstellung optimieren" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1438,7 +1387,7 @@ msgstr "" " wird für die beste Leistung empfohlen, aber kann nur von Benutzern mit " "einer aktiven Lizenz eingesetzt werden." -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1449,7 +1398,7 @@ msgstr "" "entfernen wird für die beste Leistung empfohlen." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "" "Optimize CSS Delivery features are disabled on local environments. %1$sLearn" " more%2$s" @@ -1457,13 +1406,12 @@ msgstr "" "Funktionen zur optimierten CSS-Darstellung sind auf lokalen Umgebungen " "deaktiviert. %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" -msgstr "Nicht benutztes CSS entfernen" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" +msgstr "Unbenutztes CSS entfernen (RUCSS)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "" "Removes unused CSS per page and helps to reduce page size and HTTP requests." " Recommended for best performance. Test thoroughly! %1$sMore info%2$s" @@ -1472,15 +1420,30 @@ msgstr "" "die Anzahl von HTTP-Anfragen zu reduzieren. Empfohlen für die beste " "Leistung. Ausführlich testen! %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "Dies könnte Probleme bereiten!" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "" +"If you notice any errors on your website after having activated this " +"setting, just deactivate it again, and your site will be back to normal." +msgstr "" +"Falls du nach der Aktivierung dieser Einstellung Unregelmäßigkeiten auf " +"deiner Website bemerken solltest, deaktiviere sie einfach wieder, und deine " +"Site wird wieder normal aussehen." + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "Unbenutztes CSS entfernen aktivieren" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "CSS-Safelist" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "" "Specify CSS filenames, IDs or classes that should not be removed (one per " "line)." @@ -1488,13 +1451,13 @@ msgstr "" "Gib CSS-Dateinamen, IDs oder Klassen an, die nicht entfernt werden sollen " "(eine pro Zeile)." -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "CSS-Dateien asynchron laden" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "" "Load CSS asynchronously is currently handled by the %1$s plugin. If you want" @@ -1505,19 +1468,19 @@ msgstr "" "willst, deaktiviere das Plugin %1$s." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "" "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" "Erzeugt CSS für den kritischen Pfad und lädt CSS asynchron. %1$sMehr " "erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "Alternatives Kritisches CSS" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "" "Provides a fallback if auto-generated critical path CSS is incomplete. " "%1$sMore info%2$s" @@ -1525,20 +1488,16 @@ msgstr "" "Für den Fall, dass das automatisch erstellte Kritische CSS unvollständig " "ist. %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "JavaScript minifizieren" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "" "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "Entfernt Leerzeilen und Kommentare zur Reduzierung der Datei-Größe." -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "Verstanden, aktiviere „JavaScript minifizieren“" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "" "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" @@ -1546,7 +1505,7 @@ msgstr "" "Aktivierung)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "" "Combine JavaScript files combines your site’s internal, 3rd party and inline" " JS reducing HTTP requests. Not recommended if your site uses HTTP/2. " @@ -1556,8 +1515,7 @@ msgstr "" "HTTP-Anfragen zu verringern. nicht empfohlen, falls deine Website mit HTTP/2" " läuft. %1$sMehr erfahren%2$s" -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "" "For compatibility and best results, this option is disabled when delay " "javascript execution is enabled." @@ -1566,12 +1524,12 @@ msgstr "" "deaktiviert, wenn die Option zum Verzögern der Ausführung von JavaScript " "aktiv ist." -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "Verstanden, aktiviere „JavaScript zusammenfassen“" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "" "Specify patterns of inline JavaScript to be excluded from concatenation (one" " per line). %1$sMore info%2$s" @@ -1579,7 +1537,7 @@ msgstr "" "Muster von Inline JavaScript, die von der Zusammenführung ausgenommen werden" " sollen (eine pro Zeile). %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "" "Specify URLs of JavaScript files to be excluded from minification and " "concatenation (one per line)." @@ -1587,7 +1545,7 @@ msgstr "" "URLs von JavaScript-Dateien, die von der Minifizierung und Zusammenführung " "ausgenommen werden sollen (eine pro Zeile)." -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).js wildcards to exclude all JS files located at a " @@ -1598,7 +1556,7 @@ msgstr "" "in einem angegebenen Pfad befinden." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external JS. %1$sMore info%2$s" @@ -1606,13 +1564,13 @@ msgstr "" "Drittanbieter: Benutze entweder den vollständigen URL-Pfad " "oder nur den Domainnamen, um externes JS auszunehmen. %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "JavaScript verzögert laden" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "" "Load JavaScript deferred eliminates render-blocking JS on your site and can " "improve load time. %1$sMore info%2$s" @@ -1621,7 +1579,7 @@ msgstr "" "%1$sMehr erfahren%2$s" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "" "Specify URLs or keywords of JavaScript files to be excluded from defer (one " "per line). %1$sMore info%2$s" @@ -1629,13 +1587,13 @@ msgstr "" "URLs oder Schlüsselwörter von JavaScript-Dateien, die von der Verzögerung " "ausgenommen werden sollen (eine pro Zeile) %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "JavaScript-Ausführung verzögern" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "" "Improves performance by delaying the loading of JavaScript files until user " "interaction (e.g. scroll, click). %1$sMore info%2$s" @@ -1644,11 +1602,11 @@ msgstr "" "Dateien bis zur ersten Benutzerinteraktion (z. B: Scrollen, Klicken). " "%1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "Ein-Klick-Exklusionen" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "" "When using the Delay JavaScript Execution, you might experience delay " "loading elements located in the viewport that need to appear immediately - " @@ -1658,7 +1616,7 @@ msgstr "" "beim Laden von Elementen im Viewport kommen, die sofort angezeigt werden " "müssen, z. B. Slider, Header, Menü." -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "" "If you need instant visibility, click below on files that should NOT be " "delayed. This selection will help users interact with the elements straight " @@ -1668,7 +1626,7 @@ msgstr "" "NICHT verzögert werden sollten. Diese Auswahl hilft den Nutzern, sofort mit " "den Elementen zu interagieren." -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "" "Specify URLs or keywords that can identify inline or JavaScript files to be " "excluded from delaying execution (one per line)." @@ -1677,24 +1635,24 @@ msgstr "" "identifizieren, die nicht verzögert ausgeführt werden sollen (eine pro " "Zeile)." -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "Medien" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "LazyLoad, Bildabmessungen" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "Autoptimize" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "LazyLoad" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "" "It can improve actual and perceived loading time as images, iframes, and " "videos will be loaded only as they enter (or about to enter) the viewport " @@ -1706,7 +1664,7 @@ msgstr "" "%1$sMehr erfahren%2$s" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "" "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s " "LazyLoad, disable this option in %2$s." @@ -1714,12 +1672,12 @@ msgstr "" "LazyLoad ist momentan in %2$s aktiviert. Wenn du die LazyLoad-Funktion von " "WP Rocket benutzen willst, deaktiviere diese Option in %2$s." -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "Bildabmessungen" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "" "Add missing width and height attributes to images. Helps prevent layout " "shifts and improve the reading experience for your visitors. %1$sMore " @@ -1729,12 +1687,12 @@ msgstr "" "Sprünge zu verhindern und verbessert die Leseerfahrung für deine Besucher. " "%1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "Für Bilder aktivieren" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "" "LazyLoad for images is currently activated in %2$s. If you want to use " "%1$s’s LazyLoad, disable this option in %2$s." @@ -1742,26 +1700,26 @@ msgstr "" "LazyLoad für Bilder ist aktuell aktiviert in %2$s. Falls du die LazyLoad-" "Funktion von %1$s benutzen willst, deaktivere diese Option in %2$s." -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "Für CSS-Hintergrundbilder aktivieren" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "Für iframes und Video aktivieren" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "YouTube iframe durch Vorschaubild ersetzen" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "" "YouTube-iframe mit Vorschaubild austauschen ist nicht kompatibel mit %2$s." #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "" "This can significantly improve your loading time if you have a lot of " "YouTube videos on a page." @@ -1769,12 +1727,12 @@ msgstr "" "Kann deine Ladezeit entscheidend verbessern, wenn du viele YouTube Videos " "auf einer Seite einbettest." -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "Bilder- oder iframes-Ausnahmen" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "" "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from" " the image or iframe code to be excluded (one per line). %1$sMore info%2$s" @@ -1783,20 +1741,20 @@ msgstr "" "Domain) des auszuschließenden Bildes oder iframe-Code an (eins pro Zeile). " "%1$sWeitere Informationen%2$s" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "Fehlende Bildabmessungen hinzufügen" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "Cache-Dateien generieren, Fonts vorladen" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "Cache füllen" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "" "When you enable preloading WP Rocket will automatically detect your sitemaps" " and save all URLs to the database. The plugin will make sure that your " @@ -1806,12 +1764,12 @@ msgstr "" "erkennen und alle URLs in der Datenbank speichern. Das Plugin stellt sicher," " dass dein Cache immer vorgeladen wird." -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "Links vorladen" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "" "Link preloading improves the perceived load time by downloading a page when " "a user hovers over the link. %1$sMore info%2$s" @@ -1820,11 +1778,11 @@ msgstr "" "Seite bereits geladen wird, sobald sich der Mauszeiger eines Benutzers über " "einem Link befindet. %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "DNS-Prefetch" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "" "DNS prefetching can make external files load faster, especially on mobile " "networks" @@ -1832,12 +1790,12 @@ msgstr "" "Kann das Laden externer Dateien beschleunigen, besonders über eine mobilen " "Netzwerkverbindung." -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "Fonts vorladen" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "" "Improves performance by helping browsers discover fonts in CSS files. " "%1$sMore info%2$s" @@ -1845,16 +1803,16 @@ msgstr "" "Optimiert die Leistung, indem es Browsern hilft, Fonts in CSS-Dateien zu " "entdecken. %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "Vorladen aktivieren" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "URLs ausschließen" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "" "Specify URLs to be excluded from the preload feature (one per line). " "%1$sMore info%2$s" @@ -1862,11 +1820,11 @@ msgstr "" "Gib URLs ein, die von der Vorladen-Funktion ausgeschlossen werden sollen " "(eine pro Zeile). %1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "Vorzeitig aufzulösende URLs" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "" "Specify external hosts to be prefetched (no http:, one per " "line)" @@ -1874,11 +1832,11 @@ msgstr "" "Vorzeitig aufzulösende externe Domains (kein http:, eine pro " "Zeile)" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "Vorzuladende Fonts" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "" "Specify urls of the font files to be preloaded (one per line). Fonts must be" " hosted on your own domain, or the domain you have specified on the CDN tab." @@ -1887,7 +1845,7 @@ msgstr "" "müssen auf deiner eigenen Domain gehostet sein, oder auf der Domain, die du " "im CDN-Tab angegeben hast." -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "" "The domain part of the URL will be stripped automatically.
Allowed font " "extensions: otf, ttf, svg, woff, woff2." @@ -1895,53 +1853,53 @@ msgstr "" "Der Domain-Teil der URL wird automatisch entfernt.
Mögliche Font-" "Dateiendungen sind: otf, ttf, svg, woff, woff2." -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "Vorladen von Links aktivieren" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "Erweiterte Regeln" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "Cache-Regeln abstimmen" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "" "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "" "Sensible Seiten, wie zum Beispiel eigene Login-/Logout-Seiten, sollten vom " "Cache ausgeschlossen werden." -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "WooCommerce" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "Easy Digital Downloads" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "iThemes Exchange" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "Jigoshop" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "WP-Shop" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing #. tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "" "
Cart, checkout and \"my account\" pages set in " "%1$s%2$s%3$s will be detected and never cached by default." @@ -1949,12 +1907,12 @@ msgstr "" "
Warenkorb-, Kassen- und „Mein Konto“-Seiten von " "%1$s%2$s%3$s werden automatisch ermittelt und nie gecacht." -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "Cache-Dauer" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "" "Cache files older than the specified lifespan will be deleted.
Enable " "%1$spreloading%2$s for the cache to be rebuilt automatically after lifespan " @@ -1964,29 +1922,29 @@ msgstr "" "gelöscht.
Aktiviere %1$sCache füllen%2$s, um den Cache nach dem Ablauf " "der Lebensdauer automatisch neu zu generieren." -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "Nie cachen (Cookies)" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "Cache für Query Strings" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "" "%1$sCache for query strings%2$s enables you to force caching for specific " "GET parameters." msgstr "%1$sErstellt gesonderte Caches%2$s anhand bestimmter GET-Parameter." -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "" "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" "Zeitangabe, nach welcher der globale Cache geleert wird
(0 = unbegrenzt)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "" "Reduce lifespan to 10 hours or less if you notice issues that seem to appear" " periodically. %1$sWhy?%2$s" @@ -1994,27 +1952,27 @@ msgstr "" "Reduziere auf 10 Stunden oder weniger, falls du Probleme bemerkst, die " "periodisch aufzutreten scheinen. %1$sWarum?%2$s" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "Stunden" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "Tage" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "" "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" "URLs von Seiten oder Beiträgen, die niemals gecacht werden sollen (eine pro " "Zeile)" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to address multiple URLs under a given path." @@ -2022,7 +1980,7 @@ msgstr "" "Der Domain-Teil der URL wird automatisch entfernt.
Nutze den Platzhalter " "(.*), um alle URLs eines bestimmten Pfades anzusprechen." -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "" "Specify full or partial IDs of cookies that, when set in the visitor's " "browser, should prevent a page from getting cached (one per line)" @@ -2031,18 +1989,18 @@ msgstr "" "verhindern sollen, sobald sie im Browser des Besuchers gesetzt sind (eine " "pro Zeile)" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "" "Specify user agent strings that should never see cached pages (one per line)" msgstr "" "User Agent Strings, die niemals gecachte Seiten sehen sollten (einer pro " "Zeile)" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "Nutze den Platzhalter (.*), um Teile von UA Strings zu ermitteln." -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "" "Specify URLs you always want purged from cache whenever you update any post " "or page (one per line)" @@ -2050,19 +2008,19 @@ msgstr "" "URLs, deren Cache immer mit gelöscht werden sollte, sobald andere Beiträge " "oder Seiten aktualisiert werden (eine pro Zeile)" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "Query Strings, die gecacht werden sollen (einer pro Zeile)" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "Aufräumen, optimieren" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "Beiträge/Seiten bereinigen" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "" "Post revisions and drafts will be permanently deleted. Do not use this " "option if you need to retain revisions or drafts." @@ -2070,19 +2028,19 @@ msgstr "" "Revisionen, Entwürfe und Papierkorb werden endgültig gelöscht. Nicht " "aktivieren, wenn du Revisionen und Entwürfe noch benötigst!" -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "Kommentare bereinigen" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "Spam und Kommentare im Papierkorb werden endgültig gelöscht." -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "Transients bereinigen" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "" "Transients are temporary options; they are safe to remove. They will be " "automatically regenerated as your plugins require them." @@ -2091,21 +2049,21 @@ msgstr "" "werden. Sobald deine Plugins sie benötigen, werden sie automatisch erneut " "generiert." -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "Datenbank bereinigen" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "Reduziert den Umfang von Datenbank-Tabellen." -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "Automatische Bereinigung" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "%s Revision in deiner Datenbank." @@ -2113,7 +2071,7 @@ msgstr[1] "%s Revisionen in deiner Datenbank." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "%s Entwurf in deiner Datenbank." @@ -2121,7 +2079,7 @@ msgstr[1] "%s Entwürfe in deiner Datenbank." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "%s gelöschter Beitrag in deiner Datenbank." @@ -2129,7 +2087,7 @@ msgstr[1] "%s gelöschte Beiträge in deiner Datenbank." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "%s Spam-Kommentar in deiner Datenbank." @@ -2137,61 +2095,61 @@ msgstr[1] "%s Spam-Kommentare in deiner Datenbank." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "%s gelöschter Kommentare in deiner Datenbank." msgstr[1] "%s gelöschte Kommentare in deiner Datenbank." -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "Alle Transients" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "%s Transient in deiner Datenbank." msgstr[1] "%s Transients in deiner Datenbank." -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "Tabellen optimieren" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "%s Tabelle in deiner Datenbank kann optimiert werden." msgstr[1] "%s Tabellen in deiner Datenbank können optimiert werden." -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "Automatische Bereinigung terminieren" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "Durchführung" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "täglich" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "wöchentlich" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "monatlich" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "CDN integrieren" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "" "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s)" " you provide." @@ -2200,7 +2158,7 @@ msgstr "" "eingetragenen CNAME(s) umgeschrieben." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "" "Not required for services like Cloudflare and Sucuri. Please see our " "available %1$sAdd-ons%2$s." @@ -2210,7 +2168,7 @@ msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = #. closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "" "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings " "is not required for %2$l to work on your site." @@ -2226,28 +2184,28 @@ msgstr[1] "" "Einstellungen ist nicht erforderlich für %2$l, um auf deiner Website zu " "laufen." -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "Content Delivery Network aktivieren" -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "CDN CNAME(s)" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "CNAME(s) des CDNs hier eintragen" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "" "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" "URL(s) von Dateien, die nicht von einem CDN ausgeliefert werden sollen (eine" " pro Zeile)." -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to exclude all files of a given file type located at a specific " @@ -2256,16 +2214,16 @@ msgstr "" "Der Domain-Teil der URL wird automatisch entfernt.
Nutze den Platzhalter " "(.*), um alle URLs eines bestimmten Pfades anzusprechen." -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "WordPress-Heartbeat-API kontrollieren" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "" "Reducing or disabling the Heartbeat API’s activity can help save some of " "your server’s resources." @@ -2273,11 +2231,11 @@ msgstr "" "Das Verringern oder Deaktivieren der Heartbeat-API-Aktivität kann dabei " "helfen, manche Ressourcen deines Servers einzusparen." -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "Verringern oder Deaktivieren der Heartbeat-Aktivität" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Reducing activity will change Heartbeat frequency from one hit each minute " "to one hit every 2 minutes." @@ -2285,55 +2243,55 @@ msgstr "" "Das Verringern der Aktivität wird die Heartbeat-Frequenz von einem Schlag " "pro Minute auf einen alle 2 Minuten verringern." -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" "Das Deaktivieren der Heartbeat-Aktivität kann dazu führen, dass Plugins und " "Themes, die diese API benutzen, nicht mehr funktionieren." -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "Nicht beschränken" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "Aktivität verringern" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "Deaktivieren" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "Heartbeat kontrollieren" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "Verhalten im Backend" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "Verhalten im Beitragseditor" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "Verhalten im Frontend" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "Add-ons" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "Erweiterungen aktivieren" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "One-click Rocket Add-ons" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "" "One-Click Add-ons are features extending available options without " "configuration needed. Switch the option \"on\" to enable from this screen." @@ -2341,19 +2299,19 @@ msgstr "" "One-Click Add-ons erweitern den Funktionsumfang ohne weitere Konfiguration. " "Aktiviere sie einfach, indem du den Schalter auf „An“ umlegst." -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "Rocket Add-ons" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "Rocket Add-ons erweitern den Funktionsumfang um zusätzliche Features." -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "Personalisierter Cache" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "" "If you need to create a dedicated set of cache files for each logged-in " "WordPress user, you must activate this add-on." @@ -2362,7 +2320,7 @@ msgstr "" "Cache-Dateien erstellen möchtest, musst du dieses Add-on aktivieren." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "" "User cache is great when you have user-specific or restricted content on " "your website.
%1$sLearn more%2$s" @@ -2370,16 +2328,16 @@ msgstr "" "Personalisierter Cache ist nützlich, wenn du spezielle oder eingeschränkte " "Inhalte nur für bestimmte Benutzer anbietest.
%1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "Integriere dein Cloudflare-Konto mit diesem Add-on." -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "" "Provide your account email, global API key, and domain to use options such " "as clearing the Cloudflare cache and enabling optimal settings with WP " @@ -2390,7 +2348,7 @@ msgstr "" "hinterlegten Daten ein: E-Mail-Adresse, globaler API-Schlüssel, Domain" #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "" "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just " "activate the official Cloudflare plugin and configure it. WP Rocket will " @@ -2400,18 +2358,18 @@ msgstr "" "Aktiviere einfach das offizielle Cloudflare-Plugin und konfiguriere es. WP " "Rocket wird automatisch für Kompatibilität sorgen." -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "Varnish" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "" "Du musst diese Einstellung aktivieren, wenn Varnish auf deinem Server aktiv " "ist." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "" "Varnish cache will be purged each time WP Rocket clears its cache to ensure " "content is always up-to-date.
%1$sLearn more%2$s" @@ -2419,16 +2377,16 @@ msgstr "" "Der Varnish-Cache wird automatisch jedes Mal geleert, wenn der Cache von WP " "Rocket geleert wird, damit er immer aktuell ist.
%1$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "WebP-Kompatibilität" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "Browserkompatibilität für WebP-Bilder verbessern" #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "" "Enable this option if you would like WP Rocket to serve WebP images to " "compatible browsers. Please note that WP Rocket cannot create WebP images " @@ -2440,11 +2398,11 @@ msgstr "" "Bilder für dich erstellen kann. Dür das Erstellen von WebP-Bildern empfehlen" " wir %1$sImagify%2$s. %3$sMehr erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "Sucuri-Cache leeren, wenn der Cache von WP Rocket geleert wird." -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "" "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is " "cleared." @@ -2452,49 +2410,49 @@ msgstr "" "Gib deinen API-Schlüssel an, um auch den Sucuri-Cache zu leeren, sobald der " "Cache von WP Rocket geleert wird." -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "Sucuri" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "Sucuri-Cache mit diesem Add-on synchronisieren." -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "Cloudflare-Zugangsdaten" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "Cloudflare-Einstellungen" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "Globaler API-Schlüssel:" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "API-Schlüssel finden" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "E-Mail-Adresse des Kontos" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "Zone ID" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "Entwicklungsmodus" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "" "Temporarily activate development mode on your website. This setting will " "automatically turn off after 3 hours. %1$sLearn more%2$s" @@ -2503,11 +2461,11 @@ msgstr "" "Einstellung wird nach 3 Stunden automatisch deaktiviert. %1$sMehr " "erfahren%2$s" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "Optimale Einstellungen" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "" "Automatically enhances your Cloudflare configuration for speed, performance " "grade and compatibility." @@ -2515,11 +2473,11 @@ msgstr "" "Verbessert deine Cloudflare-Konfiguration automatischen hinsichtlich " "Geschwindigkeit, Leistungsfähigkeit und Kompatibilität." -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "Relatives Protokoll" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "" "Should only be used with Cloudflare's flexible SSL feature. URLs of static " "files (CSS, JS, images) will be rewritten to use // instead of http:// or " @@ -2529,11 +2487,11 @@ msgstr "" "statischer Dateien (CSS, JS, Bilder) werden auf // anstatt http:// oder " "https:// umgeschrieben." -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "Sucuri-Zugangsdaten" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "" "Firewall API key (for plugin), must be in format {32 characters}/{32 " @@ -2542,11 +2500,23 @@ msgstr "" "Firewall-API-Schlüssel (für Plugin) muss das Format {32 Zeichen}/{32 " "Zeichen} aufweisen:" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "API-Schlüssel finden" +#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: +#. opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 +msgid "" +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " +"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " +"more about it." +msgstr "" +"%1$sWP Rocket:%2$s Das Plugin wurde auf die Version 3.17 aktualisiert. Neue " +"Funktion: %3$sLazy Render Content%4$s. Lies unsere Dokumentation, um mehr " +"darüber zu erfahren." + #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" "Sucuri Add-on: The API key for the Sucuri firewall must be in format " @@ -2564,25 +2534,25 @@ msgstr "" "(URLs) wurde nicht gespeichert, weil es das Caching und die Optimierungen " "für jede Seite deiner Website deaktiviert." -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "Import, Export, Wiederherstellung" -#: inc/Engine/Admin/Settings/Subscriber.php:196 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "Bildoptimierung" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "Komprimiere deine Bilder" -#: inc/Engine/Admin/Settings/Subscriber.php:214 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "Tutorials" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "Erste Schritte und Einführungsvideos" @@ -2590,15 +2560,15 @@ msgstr "Erste Schritte und Einführungsvideos" msgid "WP Rocket Expired Cache Interval" msgstr "WP Rocket Cache-Ablaufzeit" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "WP_CACHE-Wert" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "Cache" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "" "The WP_CACHE constant needs to be set to true for WP Rocket cache to work " "properly" @@ -2606,38 +2576,38 @@ msgstr "" "Die Konstante WP_CACHE muss auf true gesetzt sein, damit der Cache von WP " "Rocket korrekt funktioniert" -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "WP_CACHE ist auf true eingestellt" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "WP_CACHE ist nicht gesetzt" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "WP_CACHE ist auf false eingestellt" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "Nächste Rechnungsstellung" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "Kein Abonnement" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "Dein RocketCDN-Abonnement ist momentan aktiv." #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing #. tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "Um RocketCDN zu benutzen, ersetze deinen CNAME mit %1$s%2$s%3$s." #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2707,16 +2677,16 @@ msgstr "RocketCDN deaktiviert" #. Translators: %s = date formatted using date_i18n() and get_option( #. 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "Nur gültig bis %s!" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "Beschleunige deine Website dank:" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "" "High performance Content Delivery Network (CDN) with %1$sunlimited " "bandwidth%2$s" @@ -2725,7 +2695,7 @@ msgstr "" "Bandbreite%2$s" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "" "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "" @@ -2733,7 +2703,7 @@ msgstr "" "automatisch angewendet" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "" "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in" " our plugin" @@ -2741,12 +2711,12 @@ msgstr "" "WP-Rocket-Integration: Die CDN-Option ist in unserem Plugin %1$sautomatisch " "konfiguriert%2$s" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "Erfahre mehr über RocketCDN" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "" "*$%1$s/month for 12 months then $%2$s/month. You can cancel your " "subscription at any time." @@ -2754,35 +2724,35 @@ msgstr "" "*$%1$s/Monat für 12 Monate, danach $%2$s/Monat. Sie können Ihr Abonnement " "jederzeit kündigen." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "Monatliche Abrechnung" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "Erste Schritte" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "Dieses Banner verkleinern" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "" "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "" "Beschleunige deine Website mit RocketCDN, WP Rockets Content Delivery " "Network." -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "Mehr erfahren" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "RocketCDN ist nicht für lokale Domains und Staging-Sites verfügbar." -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "Hol dir RocketCDN" @@ -2797,23 +2767,78 @@ msgstr "" "Beschleunige deine Website mit RocketCDN, WP Rockets Content Delivery " "Network!" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:180 +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "Zu viele Anfragen." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "Keine gültige Antwort." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "Kein gültiger Anfragetyp." + +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "WP Rocket Verarbeiten ausstehender Jobs" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:194 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:204 msgid "WP Rocket clear failed jobs" msgstr "WP Rocket fehlgeschlagene Jobs leeren" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:206 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:221 msgid "WP Rocket process on submit jobs" msgstr "WP Rocket Prozess bei der Job-Übermittlung" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Priority Elements" +msgstr "Vorrangige Elemente bereinigen" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Priority Elements of this URL" +msgstr "Vorrangige Elemente dieser URL bereinigen" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Priority Elements" +msgstr "Vorrangige Elemente" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear" +msgstr "Bereinigen" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "" +"This action will clear the Critical Images and Lazily Rendered Content." +msgstr "" +"Diese Aktion wird die kritischen Bilder und verzögert verarbeitete Inhalte " +"bereinigen." + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "%1$s: Kritische Bilder und Lazy-Render-Daten wurden bereinigt!" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "Skriptfehler" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "Skript-Zeitüberschreitung" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "Es war nicht möglich, eine gültige Ausschlusszeit zu bestimmen: %s." + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "Jede Minute" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "Kritisches CSS neu generieren" @@ -2841,7 +2866,6 @@ msgstr "%l, um diese Funktion zu nutzen." msgid "Publish the %s" msgstr "%s veröffentlichen" -#. translators: %s = post type. #: inc/Engine/CriticalPath/Admin/Post.php:223 msgid "Enable Load CSS asynchronously in WP Rocket settings" msgstr "Asynchrones Laden von CSS in den WP-Rocket-Einstellungen aktivieren" @@ -2856,7 +2880,7 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "Kritisches CSS für %1$s nicht erstellt. Fehler: %2$s" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "empty response." @@ -2865,7 +2889,7 @@ msgstr "" "eine leere Antwort zurück." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an empty " "response." @@ -2874,19 +2898,19 @@ msgstr "" "Antwort zurück." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "Kritisches CSS für %1$s auf Mobilgeräten nicht erzeugt." #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "Kritisches CSS für %1$s nicht erzeugt." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "invalid response code." @@ -2895,7 +2919,7 @@ msgstr "" "einen ungültige Antwortcode zurück." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an invalid " "response code." @@ -2904,8 +2928,8 @@ msgstr "" "Antwortcode zurück." #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "Fehler: %1$s" @@ -2994,38 +3018,38 @@ msgid "Critical CSS file cannot be deleted" msgstr "Kritisches-CSS-Datei kann nicht gelöscht werden" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "Kritisches-CSS-Datei für Mobilgeräte für %1$s nicht erzeugt." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "Kritisches CSS für %s in Bearbeitung." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "Kritisches-CSS-Datei für Mobilgeräte für %s erzeugt." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "Kritisches CSS für %s erstellt." -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "Kritisches-CSS-Datei erfolgreich gelöscht." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "Kritisches-CSS-Datei für Mobilgeräte für %1$s hat die Zeit überschritten. " "Bitte ein wenig später erneut versuchen." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "Kritisches CSS für %1$s hat die Zeit überschritten. Bitte ein wenig später " @@ -3156,39 +3180,39 @@ msgid "Unlimited" msgstr "Unbegrenzt" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "%s Rabatt" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "%s Werbeaktion ist live!" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "Beeil dich! Das Angebot endet in:" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "Minuten" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "Sekunden" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "Upgrade jetzt durchführen" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "Die Funktion CSS-Darstellung optimieren ist deaktiviert." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "" "You can no longer use the Remove Unused CSS or Load CSS asynchronously " "options." @@ -3197,7 +3221,7 @@ msgstr "" "länger benutzen." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "" "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, " "which addresses a PageSpeed Insights recommendation and improves your page " @@ -3207,26 +3231,26 @@ msgstr "" "können. Dies ist eine Empfehlung von PageSpeed Insights und verbessert die " "Leistung deiner Seiten." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "Jetzt erneuern" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "Du wirst bald den Zugang zu manchen Funktionen verlieren." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "" "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" "Du benötigst eine %1$saktive Lizenz, um dein CSS weiter optimieren zu " "können%2$s." -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "" "The Remove Unused CSS and Load CSS asynchronously features are great options" " to address the PageSpeed Insights recommendations and improve your website " @@ -3237,16 +3261,16 @@ msgstr "" "und die Leistung deiner Website zu verbessern." #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "Diese Funktionen werden %1$sautomatisch deaktiviert am %3$s%2$s." -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "Deine Lizenz für WP Rocket ist abgelaufen!" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "" "Your website could be much faster if it could take advantage of our %1$snew " "features and enhancements%2$s. 🚀" @@ -3255,7 +3279,7 @@ msgstr "" "%1$sneuen Funktionen und Verbesserungen%2$s nutzen würdest. 🚀" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "" "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access" " to product updates and support." @@ -3263,12 +3287,12 @@ msgstr "" "Deine %1$sWP-Rocket-Lizenz läuft bald ab%2$s: Du verlierst bald den Zugang " "zu Produktaktualisierungen und Support." -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "Weitere Websites beschleuigen" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "" "You can use WP Rocket on more websites by upgrading your license. To " "upgrade, simply pay the %1$sprice difference%2$s between your current and " @@ -3279,24 +3303,24 @@ msgstr "" "zwischen deiner jetzigen und neuen Lizenzen, wie unten zu sehen." #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "" "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "" "%1$sHinweis%2$s: Ein Upgrade deiner Lizenz ändert das Ablaufdatum nicht" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "$%s speichern" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "%s Websites" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "Upgrade auf %s" @@ -3309,11 +3333,6 @@ msgstr "" "Lizenz durchführst (bezahle nur die Preisdifferenz zwischen deiner jetzigen" " und neuen Lizenzen)-" -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "%1$s: Kritische Bilder geleert!" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "LazyLoad für Bilder" @@ -3326,15 +3345,15 @@ msgstr "LazyLoad für iframes und Videos" msgid "LazyLoad CSS backgrounds" msgstr "LazyLoad für CSS-Hintergründe" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "Analytics und Ads" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "Plugins" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "Themes" @@ -3382,17 +3401,21 @@ msgstr "JavaScript minifizieren/kombinieren" msgid "Minify CSS" msgstr "CSS minifizieren" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +msgid "Remove Unused CSS" +msgstr "Nicht benutztes CSS entfernen" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, #. %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 msgid "" "%1$s: Could not create the %2$s table in the database which is necessary for" -" the Remove Unused CSS feature to work. Please reach out to %3$sour " -"support%4$s." +" the Remove Unused CSS feature to work. Please check our " +"%3$sdocumentation%4$s." msgstr "" "%1$s: Die Datenbanktabelle %2$s konnte nicht erstellt werden, welche " -"notwendig ist für die Funktion zum Entfernen von unbenutztem CSS. Bitte " -"wende dich an %3$sunseren Support%4$s." +"notwendig ist für die Funktion zum Entfernen von unbenutztem CSS. Bitte lies" +" unsere %3$sDokumentation%4$s." #. translators: %1$s = plugin name. #: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:274 @@ -3400,7 +3423,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "%1$s: Cache für benutztes CSS geleert!" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "" "%1$s: The preload service is now active. After the initial preload it will " "continue to cache all your pages whenever they are purged. No further action" @@ -3418,29 +3441,20 @@ msgstr "WP-Rocket-Vorladen ausstehende Jobs" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "WP-Rocket-Vorladen setzt steckengebliebene Jobs zurück" -#: inc/Engine/Saas/Admin/AdminBar.php:73 -#: inc/Engine/Saas/Admin/AdminBar.php:194 -msgid "Clear Critical Images" -msgstr "Kritische Bilder leeren" - -#: inc/Engine/Saas/Admin/AdminBar.php:160 -msgid "Clear Critical Images of this URL" -msgstr "Kritische Bilder dieser URL leeren" - -#: inc/Engine/Saas/Admin/AdminBar.php:163 +#: inc/Engine/Saas/Admin/AdminBar.php:106 msgid "Clear Used CSS of this URL" msgstr "Benutztes CSS für diese URL leeren" -#: inc/Engine/Saas/Admin/AdminBar.php:193 -msgid "Critical Images Cache" -msgstr "Cache für kritische Bilder" +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" +msgstr "Benutztes CSS" -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Remove Used CSS Cache" -msgstr "Cache für benutztes CSS entfernen" +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." +msgstr "Diese Aktion wird die benutzten CSS-Dateien bereinigen." #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "" "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing " "your pages, the plugin is optimizing LCP and the images above the fold." @@ -3451,7 +3465,7 @@ msgstr "" #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of #. seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." @@ -3460,19 +3474,19 @@ msgstr "" "\t\t\t WP Rocket wird Benutztes CSS für bis zu %2$s URLs pro %3$s Sekunde(n) weiterhin erzeugen." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:160 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" "Wir empfehlen das Aktivieren von %1$sVorladen%2$s für die schnellsten " "Ergebnisse." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" "Um mehr über den Ablauf zu erfahren, lies unsere %1$sDokumentation%2$s." -#: inc/Engine/Saas/Admin/Notices.php:236 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3484,13 +3498,13 @@ msgstr "" "deiner Website damit noch weiter zu steigern." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:239 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "" "Klicke hier, um eine Lizenz für WP Rocket mit %1$s Rabbatt zu erhalten!" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:292 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3501,11 +3515,11 @@ msgstr "" "unserer Dokumentation%2$s aufgelisteten IPs sollten zugänglich gemacht " "werden:" -#: inc/Engine/Saas/Admin/Notices.php:297 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "- Im Sicherheitsplugin, falls du eines benutzt" -#: inc/Engine/Saas/Admin/Notices.php:298 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "- In der Firewall des Servers. Dein Hoster kann dir dabei helfen" @@ -3890,7 +3904,7 @@ msgstr[1] "" "Rocket kollideren:" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" @@ -3898,7 +3912,7 @@ msgstr "" "%1$s %2$sdisable emoji%3$s kollidiert mit WP Rockets %2$sdisable emoji%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP " @@ -3908,7 +3922,7 @@ msgstr "" "Komprimierung%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser " @@ -3918,7 +3932,7 @@ msgstr "" "Caching%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "" "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" @@ -3926,7 +3940,7 @@ msgstr "" "%1$s %2$sSeiten-Caching%3$s kollidiert mit WP Rocket %2$sSeiten-Caching%3$s" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile " @@ -4212,7 +4226,6 @@ msgstr "CDN CNAME" msgid "Purges RocketCDN cached resources for your website. %s" msgstr "Leert von RocketCDN gecachte Ressourcen für deine Website. %s" -#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:63 #: views/settings/page-sections/cloudflare.php:36 #: views/settings/page-sections/sucuri.php:37 @@ -4249,7 +4262,6 @@ msgstr "Cloudflare Cache" msgid "Purges cached resources for your website. %s" msgstr "Löscht alle von Cloudflare gecachten Dateien deiner Website. %s" -#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:36 msgid "https://support.cloudflare.com/hc/en-us/articles/200169246" msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" @@ -4258,19 +4270,19 @@ msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" msgid "Clear all Cloudflare cache files" msgstr "Cloudflare Cache leeren" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "Glückwunsch!" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "WP Rocket wurde aktiviert und arbeitet bereits für dich." -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "Deine Website sollte jetzt schneller laden!" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "To guarantee fast websites, WP Rocket automatically applies 80% of web " "performance best practices." @@ -4278,66 +4290,92 @@ msgstr "" "Um schnelle Websites zu garantieren, wendet WP Rocket automatisch 80% der " "bewährten Methoden für Web-Performance an." -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "We also enable options that provide immediate benefits to your website." msgstr "" "Wir aktivieren auch Optionen, die sofortige Vorteile für deine Website " "bringen." -#: views/settings/page-sections/dashboard.php:45 +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" msgstr "Für weitere Optimierung kannst du deine Einstellungen bearbeiten!" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "Mein Konto" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "Anzeige aktualisieren" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "mit" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "Ablaufdatum" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "Mein Konto anzeigen" +#: views/settings/page-sections/dashboard.php:131 views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "Rocket Analytics" + +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/dashboard.php:137 +msgid "" +"I agree to share anonymous data with the development team to help improve WP" +" Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" +"Ich erlaube dem Entwicklungsteam von WP Rocket, anonyme Daten aus meiner " +"Installation zum Zweck der Produktverbesserung zu erheben. %1$sWelche Daten " +"werden gesammelt?%2$s" + +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "Nützliche Links" -#: views/settings/page-sections/dashboard.php:144 -msgid "Remove all cached files" -msgstr "Alle Cache-Dateien entfernen" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "Dateien cachen" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." +msgstr "Diese Aktion wird die Cache-Dateien bereinigen und vorladen." + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "Diese Aktion wird die Cache-Dateien bereinigen." + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "Bereinigen und vorladen" + +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "Kritisches CSS neu generieren" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "Häufig gestellte Fragen" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "Noch keine Lösung gefunden?" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:230 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" "Sende eine Support-Anfrage und lass dir von unseren freundlichen und " "kompetenten Rocketeers helfen." -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "Support fragen" @@ -4354,41 +4392,57 @@ msgstr "Eine Datenbank-Optimierung kann nicht rückgängig gemacht werden." msgid "Save Changes and Optimize" msgstr "Änderungen speichern und optimieren" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 msgid "" -"%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image " -"optimization.%2$s" +"%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" msgstr "" -"%1$sWP ROCKET%2$s erstellte %3$sIMAGIFY%4$s %1$sfür die klassenbeste " -"Bildoptimierung.%2$s" +"%1$sWP Rocket hat IMAGIFY geschaffen, um deiner Website einen Extra-Schub zu" +" geben!%2$s" + +#: views/settings/page-sections/imagify.php:28 +msgid "Images can account for 50% of your loading time!" +msgstr "Bilder können 50 % deiner Ladezeit ausmachen!" -#: views/settings/page-sections/imagify.php:24 +#: views/settings/page-sections/imagify.php:31 msgid "" -"Compress image to make your website faster, all while maintaining image " -"quality." +"Imagify automatically optimizes all your images, helping your website gain " +"precious seconds while saving you time. With just one click, it resizes, " +"compresses, and converts your images to WebP and AVIF formats without " +"sacrificing quality." msgstr "" -"Komprimiere Bilder, um deine Website schneller zu machen, unter Beibehaltung" -" der Bildqualität." +"Imagify optimiert automatisch alle deine Bilder, damit deine Website " +"wertvolle Sekunden gewinnt und du Zeit sparst. Mit nur einem Klick passt es " +"die Größe deiner Bilder an, komprimiert sie und konvertiert sie in die " +"Formate WebP und AVIF, ohne die Qualität zu beeinträchtigen." -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" -msgstr "Mehr über Imagify:" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" +msgstr "%1$sKomprimiere%2$s all deine Bilder mit nur einem Klick" -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" -msgstr "Imagify-Plugin-Seite" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" +msgstr "%1$sKonvertiere%2$s Bilder nach WebP und Avif" -#: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" -msgstr "Imagify Website" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "%1$sSkaliere%2$s deine Bilder im laufenden Betrieb" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" +msgstr "%1$sDer kostenlose Tarif%2$s beinhaltet 20 MB/Monat (etwa 200 Bilder)" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" -msgstr "Überblick über Plugins zur Bildkomprimierung" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" +msgstr "" +"%1$sInstalliere Imagify, den einfachsten Bildoptimierer für WordPress%2$s" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "Imagify installieren" @@ -4414,8 +4468,8 @@ msgid "" "https://docs.wp-rocket.me/article/100-resolving-problems-with-license-" "validation/?utm_source=wp_plugin&utm_medium=wp_rocket" msgstr "" -"https://de.docs.wp-rocket.me/article/534-probleme-mit-lizenz-validierung-" -"beheben/?utm_source=wp_plugin&utm_medium=wp_rocket" +"https://docs.wp-rocket.me/article/100-resolving-problems-with-license-" +"validation/?utm_source=wp_plugin&utm_medium=wp_rocket" #. translators: %1$s = , %4$s = . From b84db956c95ceb0acd5ed15ac9892b0d519660d0 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:47:10 +0000 Subject: [PATCH 170/192] Translate languages/rocket.pot in fr_CA 100% translated source file: 'languages/rocket.pot' on 'fr_CA'. --- languages/rocket-fr_CA.po | 6079 ++++++++++++++++++++++--------------- 1 file changed, 3627 insertions(+), 2452 deletions(-) diff --git a/languages/rocket-fr_CA.po b/languages/rocket-fr_CA.po index 5c35b5b44b..a94a3f9cfb 100644 --- a/languages/rocket-fr_CA.po +++ b/languages/rocket-fr_CA.po @@ -1,2694 +1,3593 @@ +# Copyright (C) 2024 WP Media +# This file is distributed under the same license as the WP Rocket plugin. +# Translators: +# Romain • WP Rocket , 2019 +# Jean-Francois Arseneault , 2024 +# msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.12\n" -"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" -"Last-Translator: Jean-Francois Arseneault , 2022\n" -"Language-Team: French (Canada) (https://www.transifex.com/wp-media/teams/18133/fr_CA/)\n" +"Project-Id-Version: WP Rocket 3.17-alpha4\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" +"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" +"PO-Revision-Date: 2019-08-26 15:14+0000\n" +"Last-Translator: Jean-Francois Arseneault , 2024\n" +"Language-Team: French (Canada) (https://app.transifex.com/wp-media/teams/18133/fr_CA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2022-10-18 09:38-0400\n" -"PO-Revision-Date: 2019-08-26 15:14+0000\n" "Language: fr_CA\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -"X-Generator: Poedit 1.8.11\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-SearchPathExcluded-0: assets\n" -"X-Poedit-SearchPathExcluded-1: src\n" -"X-Poedit-SearchPathExcluded-2: vendor\n" -"X-Poedit-SearchPathExcluded-3: node_modules\n" -"X-Poedit-SearchPathExcluded-4: tests\n" -"X-Poedit-SearchPathExcluded-5: inc/Dependencies\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Textdomain-Support: yes\n" +"X-Domain: rocket\n" +"X-Generator: WP-CLI 2.4.0\n" + +#. Plugin Name of the plugin +msgid "WP Rocket" +msgstr "WP Rocket" + +#. Plugin URI of the plugin +msgid "https://wp-rocket.me" +msgstr "https://wp-rocket.me" +#. Description of the plugin +msgid "The best WordPress performance plugin." +msgstr "La meilleure extension de performance pour WordPress." + +#. Author of the plugin +msgid "WP Media" +msgstr "WP Media" + +#. Author URI of the plugin +msgid "https://wp-media.me" +msgstr "https://wp-media.me" + +#. Translators: %s = Hosting name. #: inc/3rd-party/hosting/flywheel.php:18 -#: inc/3rd-party/hosting/pressidium.php:18 -#: inc/3rd-party/hosting/wp-serveur.php:27 +#: inc/3rd-party/hosting/wp-serveur.php:27 inc/deprecated/3.6.php:697 +#: inc/deprecated/3.6.php:997 inc/deprecated/3.9.php:22 #: inc/ThirdParty/Hostings/Cloudways.php:90 #: inc/ThirdParty/Hostings/Dreampress.php:44 #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/ProIsp.php:51 -#: inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/Pressidium.php:50 +#: inc/ThirdParty/Hostings/ProIsp.php:51 inc/ThirdParty/Hostings/Savvii.php:50 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 -#: inc/deprecated/3.6.php:697 -#: inc/deprecated/3.6.php:997 -#: inc/deprecated/3.9.php:22 -#, php-format -msgid "Your site is hosted on %s, we have enabled Varnish auto-purge for compatibility." -msgstr "Votre site est hébergé chez %s, nous avons activé la purge automatisée de Varnish pour la compatibilité." +msgid "" +"Your site is hosted on %s, we have enabled Varnish auto-purge for " +"compatibility." +msgstr "" +"Votre site est hébergé chez %s, nous avons activé la purge automatisée de " +"Varnish pour la compatibilité." #: inc/Addon/Cloudflare/API/Client.php:129 msgid "Cloudflare did not provide any reply. Please try again later." -msgstr "Oups, Cloudflare n'a pas répondu. Veuillez essayer de nouveau plus tard." +msgstr "" +"Oups, Cloudflare n'a pas répondu. Veuillez essayer de nouveau plus tard." + +#: inc/Addon/Cloudflare/API/Client.php:135 +msgid "Cloudflare unexpected response" +msgstr "Réponse inattendue de Cloudflare" + +#: inc/Addon/Cloudflare/API/Client.php:143 +msgid "Missing Cloudflare result." +msgstr "Résultat de Cloudflare manquant." -#: inc/Addon/Cloudflare/API/Client.php:186 -#: inc/deprecated/3.5.php:112 +#: inc/Addon/Cloudflare/API/Client.php:194 inc/deprecated/3.5.php:112 #: inc/deprecated/3.5.php:169 msgid "Incorrect Cloudflare email address or API key." msgstr "Courriel et clé d’API Cloudflare incorrects." -#: inc/Addon/Cloudflare/API/Client.php:190 -#: inc/Addon/Cloudflare/API/Client.php:204 -#: inc/Addon/Cloudflare/Cloudflare.php:74 -#: inc/Addon/Cloudflare/Cloudflare.php:109 +#. translators: %1$s = opening link; %2$s = closing link +#: inc/Addon/Cloudflare/API/Client.php:198 +#: inc/Addon/Cloudflare/API/Client.php:212 +#: inc/Addon/Cloudflare/Cloudflare.php:75 +#: inc/Addon/Cloudflare/Cloudflare.php:108 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:157 -#: inc/deprecated/3.5.php:92 -#: inc/deprecated/3.5.php:116 -#: inc/deprecated/3.5.php:129 -#: inc/deprecated/3.5.php:157 +#: inc/deprecated/3.5.php:92 inc/deprecated/3.5.php:116 +#: inc/deprecated/3.5.php:129 inc/deprecated/3.5.php:157 #: inc/deprecated/3.5.php:173 -#, php-format msgid "Read the %1$sdocumentation%2$s for further guidance." msgstr "Lisez la %1$sdocumentation%2$s pour de l’aide additionnelle." -#: inc/Addon/Cloudflare/API/Client.php:192 -#: inc/Addon/Cloudflare/API/Client.php:206 +#. translators: Documentation exists in EN, FR; use localized URL if +#. applicable. +#: inc/Addon/Cloudflare/API/Client.php:200 +#: inc/Addon/Cloudflare/API/Client.php:214 #: inc/Addon/Cloudflare/Auth/APIKey.php:63 -#: inc/Addon/Cloudflare/Cloudflare.php:76 -#: inc/Addon/Cloudflare/Cloudflare.php:111 -#: inc/deprecated/3.5.php:81 -#: inc/deprecated/3.5.php:94 -#: inc/deprecated/3.5.php:118 -#: inc/deprecated/3.5.php:131 -#: inc/deprecated/3.5.php:159 -#: inc/deprecated/3.5.php:175 -#: inc/deprecated/3.5.php:208 -msgid "https://docs.wp-rocket.me/article/18-using-wp-rocket-with-cloudflare/?utm_source=wp_plugin&utm_medium=wp_rocket#add-on" -msgstr "https://docs.wp-rocket.me/article/18-using-wp-rocket-with-cloudflare/?utm_source=wp_plugin&utm_medium=wp_rocket#add-on" +#: inc/Addon/Cloudflare/Cloudflare.php:77 +#: inc/Addon/Cloudflare/Cloudflare.php:110 inc/deprecated/3.5.php:81 +#: inc/deprecated/3.5.php:94 inc/deprecated/3.5.php:118 +#: inc/deprecated/3.5.php:131 inc/deprecated/3.5.php:159 +#: inc/deprecated/3.5.php:175 inc/deprecated/3.5.php:208 +msgid "" +"https://docs.wp-rocket.me/article/18-using-wp-rocket-with-" +"cloudflare/?utm_source=wp_plugin&utm_medium=wp_rocket#add-on" +msgstr "" +"https://docs.wp-rocket.me/article/18-using-wp-rocket-with-" +"cloudflare/?utm_source=wp_plugin&utm_medium=wp_rocket#add-on" -#: inc/Addon/Cloudflare/API/Client.php:200 -#: inc/deprecated/3.5.php:125 +#: inc/Addon/Cloudflare/API/Client.php:208 inc/deprecated/3.5.php:125 msgid "Incorrect Cloudflare Zone ID." msgstr "Zone iD de Cloudflare incorrecte." +#. translators: %1$s = opening link; %2$s = closing link #: inc/Addon/Cloudflare/Auth/APIKey.php:61 -#, php-format -msgid "Cloudflare email and/or API key are not set. Read the %1$sdocumentation%2$s for further guidance." -msgstr "Le courriel ou la clé d'API de Cloudflare ne sont pas configurés. Lire la %1$sdocumentation%2$s pour plus d'information." +msgid "" +"Cloudflare email and/or API key are not set. Read the %1$sdocumentation%2$s " +"for further guidance." +msgstr "" +"Le courriel ou la clé d'API de Cloudflare ne sont pas configurés. Lire la " +"%1$sdocumentation%2$s pour plus d'information." -#: inc/Addon/Cloudflare/Cloudflare.php:70 -#: inc/deprecated/3.5.php:88 +#: inc/Addon/Cloudflare/Cloudflare.php:71 inc/deprecated/3.5.php:88 msgid "Missing Cloudflare Zone ID." msgstr "Zone ID de Cloudflare manquant." -#: inc/Addon/Cloudflare/Cloudflare.php:105 -#: inc/deprecated/3.5.php:153 +#: inc/Addon/Cloudflare/Cloudflare.php:104 inc/deprecated/3.5.php:153 msgid "It looks like your domain is not set up on Cloudflare." msgstr "On dirait que votre domaine n'est pas configuré dans Cloudflare." -#: inc/deprecated/3.5.php:587 -#, php-format -msgid "WP Rocket: %s" -msgstr "WP Rocket : %s" +#: inc/Addon/Cloudflare/Cloudflare.php:200 +msgid "days" +msgstr "jours" -#: inc/deprecated/3.5.php:592 -msgid "WP Rocket: Cloudflare cache successfully purged." -msgstr "WP Rocket: Cache de Cloudflare purgé avec succès." +#: inc/Addon/Cloudflare/Cloudflare.php:203 +msgid "seconds" +msgstr "secondes" -#: inc/Addon/Cloudflare/Subscriber.php:632 -#: inc/admin/options.php:184 -#: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 -msgid "WP Rocket: " -msgstr "WP Rocket : " +#: inc/Addon/Cloudflare/Cloudflare.php:205 +msgid "minutes" +msgstr "minutes" -#: inc/Addon/Cloudflare/Subscriber.php:297 -#, php-format +#: inc/Addon/Cloudflare/Cloudflare.php:207 +msgid "hours" +msgstr "heures" + +#. translators: %1$s = , %2$s = , %3$s = CloudFare API return +#. message. +#: inc/Addon/Cloudflare/Subscriber.php:232 +#: inc/Addon/Cloudflare/Subscriber.php:261 +msgid "%1$sWP Rocket:%2$s %3$s" +msgstr "%1$sWP Rocket:%2$s %3$s" + +#. translators: %1$s = , %2$s = . +#: inc/Addon/Cloudflare/Subscriber.php:250 +msgid "%1$sWP Rocket:%2$s Cloudflare cache successfully purged." +msgstr "%1$sWP Rocket :%2$s le cache de Cloudflare a été purgé avec succès." + +#. translators: %s is the message returned by the CloudFlare API. +#: inc/Addon/Cloudflare/Subscriber.php:311 msgid "Cloudflare development mode error: %s" msgstr "Erreur du mode développement de Cloudflare : %s" -#: inc/Addon/Cloudflare/Subscriber.php:304 -#, php-format +#. translators: %s is the message returned by the CloudFlare API. +#: inc/Addon/Cloudflare/Subscriber.php:318 msgid "Cloudflare development mode %s" msgstr "Mode développement de Cloudflare %s" -#: inc/Addon/Cloudflare/Subscriber.php:321 -#, php-format +#. translators: %s is the message returned by the CloudFlare API. +#: inc/Addon/Cloudflare/Subscriber.php:337 msgid "Cloudflare cache level error: %s" msgstr "Erreur du niveau de cache de Cloudflare : %s" -#: inc/Addon/Cloudflare/Subscriber.php:334 -#, php-format -msgid "Cloudflare cache level set to %s" -msgstr "Niveau de cache de Cloudflare défini à %s" +#: inc/Addon/Cloudflare/Subscriber.php:344 +msgctxt "Cloudflare caching level" +msgid "standard" +msgstr "standard" +#. translators: %s is the caching level returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:350 -#, php-format -msgid "Cloudflare minification error: %s" -msgstr "Erreur de la minification Cloudflare : %s" - -#: inc/Addon/Cloudflare/Subscriber.php:357 -#, php-format -msgid "Cloudflare minification %s" -msgstr "Minification Cloudflare %s" +msgid "Cloudflare cache level set to %s" +msgstr "Niveau de cache de Cloudflare défini à %s" -#: inc/Addon/Cloudflare/Subscriber.php:373 -#, php-format +#. translators: %s is the message returned by the CloudFlare API. +#: inc/Addon/Cloudflare/Subscriber.php:368 msgid "Cloudflare rocket loader error: %s" msgstr "Erreur du Rocket Loader de Cloudflare : %s" -#: inc/Addon/Cloudflare/Subscriber.php:380 -#, php-format +#. translators: %s is the message returned by the CloudFlare API. +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "Rocket Loader de Cloudflare %s" -#: inc/Addon/Cloudflare/Subscriber.php:396 -#, php-format +#. translators: %s is the message returned by the CloudFlare API. +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "Erreur du cache navigateur Cloudflare : %s" -#: inc/Addon/Sucuri/Subscriber.php:95 -#, php-format +#. translators: %s is the message returned by the CloudFlare API. +#: inc/Addon/Cloudflare/Subscriber.php:400 +msgid "Cloudflare browser cache set to %s" +msgstr "Cache navigateur de Cloudflare réglé sur %s " + +#. translators: %1$s = strong opening tag, %2$s = strong closing tag. +#: inc/Addon/Cloudflare/Subscriber.php:507 +msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" +msgstr "%1$sWP Rocket :%2$s Réglages optimaux activés pour Cloudflare :" + +#. translators: %1$s = strong opening tag, %2$s = strong closing tag. +#: inc/Addon/Cloudflare/Subscriber.php:516 +msgid "" +"%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to " +"previous settings:" +msgstr "" +"%1$sWP Rocket :%2$s Réglages optimaux désactivés pour Cloudflare, retour aux" +" réglages précédents :" + +#: inc/Addon/Cloudflare/Subscriber.php:632 inc/admin/options.php:165 +#: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 +msgid "WP Rocket: " +msgstr "WP Rocket : " + +#. translators: %s is the error message returned by the API. +#: inc/Addon/Sucuri/Subscriber.php:96 msgid "Sucuri cache purge error: %s" msgstr "Erreur lors de la purge du cache Sucuri : %s" -#: inc/Addon/Sucuri/Subscriber.php:100 -msgid "The Sucuri cache is being cleared. Note that it may take up to two minutes for it to be fully flushed." -msgstr "Le cache Sucuri est en cours de purge. Notez que ceci peut prendre jusqu'à deux minutes avant d'être complété." +#: inc/Addon/Sucuri/Subscriber.php:101 +msgid "" +"The Sucuri cache is being cleared. Note that it may take up to two minutes " +"for it to be fully flushed." +msgstr "" +"Le cache Sucuri est en cours de purge. Notez que ceci peut prendre jusqu'à " +"deux minutes avant d'être complété." -#: inc/Addon/Sucuri/Subscriber.php:217 +#: inc/Addon/Sucuri/Subscriber.php:218 msgid "Sucuri firewall API key was not found." msgstr "La clé d'API du pare-feu Sucuri n'a pu être trouvée." -#: inc/Addon/Sucuri/Subscriber.php:230 +#: inc/Addon/Sucuri/Subscriber.php:231 msgid "Sucuri firewall API key is invalid." msgstr "La clé d'API du pare-feu Sucuri est invalide." -#: inc/Addon/Sucuri/Subscriber.php:285 -#, php-format +#. translators: %s is an error message. +#: inc/Addon/Sucuri/Subscriber.php:286 msgid "Error when contacting Sucuri firewall API. Error message was: %s" -msgstr "Erreur lors de la communication avec l'API du pare-feu Sucuri. Le message d'erreur était : %s" +msgstr "" +"Erreur lors de la communication avec l'API du pare-feu Sucuri. Le message " +"d'erreur était : %s" -#: inc/Addon/Sucuri/Subscriber.php:300 +#: inc/Addon/Sucuri/Subscriber.php:301 msgid "Could not get a response from the Sucuri firewall API." msgstr "Impossible d'obtenir une réponse de l'API du pare-feu Sucuri." -#: inc/Addon/Sucuri/Subscriber.php:315 +#: inc/Addon/Sucuri/Subscriber.php:316 msgid "Got an invalid response from the Sucuri firewall API." msgstr "Reçu une réponse invalide de l'API du pare-feu Sucuri." -#: inc/Addon/Sucuri/Subscriber.php:329 +#: inc/Addon/Sucuri/Subscriber.php:330 msgid "The Sucuri firewall API returned an unknown error." msgstr "L'API du pare-feu Sucuri a retourné une erreur inconnue." -#: inc/Addon/Sucuri/Subscriber.php:333 -#, php-format +#. translators: %s is an error message. +#: inc/Addon/Sucuri/Subscriber.php:334 msgid "The Sucuri firewall API returned the following error: %s" msgid_plural "The Sucuri firewall API returned the following errors: %s" msgstr[0] "L'API du pare-feu Sucuri a retourné l'erreur suivante : %s" msgstr[1] "L'API du pare-feu Sucuri a retourné les erreurs suivantes : %s" msgstr[2] "L'API du pare-feu Sucuri a retourné les erreurs suivantes : %s" -#: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1475 -msgid "Revisions" -msgstr "Révisions" +#. Translators: %1$s = plugin name(s), %2$s = opening tag, %3$s = closing +#. tag. +#: inc/Addon/WebP/AdminSubscriber.php:93 +msgid "" +"You are using %1$s to serve WebP images so you do not need to enable this " +"option. %2$sMore info%3$s %4$s If you prefer to have WP Rocket serve WebP " +"for you instead, please disable WebP display in %1$s." +msgid_plural "" +"You are using %1$s to serve WebP images so you do not need to enable this " +"option. %2$sMore info%3$s %4$s If you prefer to have WP Rocket serve WebP " +"for you instead, please disable WebP display in %1$s." +msgstr[0] "" +"Vous utilisez %1$s pour servir les images WebP, vous n'avez donc pas besoin " +"d'activer cette option. %2$sPlus d'infos%3$s %4$s Si vous préférez que WP " +"Rocket serve les WebP pour vous, veuillez désactiver l’affichage des WebP de" +" %1$s. " +msgstr[1] "" +"Vous utilisez %1$s pour servir les images WebP, vous n'avez donc pas besoin " +"d'activer cette option. %2$sPlus d'infos%3$s %4$s Si vous préférez que WP " +"Rocket serve les WebP pour vous, veuillez désactiver l’affichage des WebP de" +" %1$s. " +msgstr[2] "" +"Vous utilisez %1$s pour servir les images WebP, vous n'avez donc pas besoin " +"d'activer cette option. %2$sPlus d'infos%3$s %4$s Si vous préférez que WP " +"Rocket serve les WebP pour vous, veuillez désactiver l’affichage des WebP de" +" %1$s. " -#: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1485 -msgid "Auto Drafts" -msgstr "Brouillons automatiques" +#: inc/Addon/WebP/AdminSubscriber.php:105 +msgid "WebP cache is disabled by filter." +msgstr "La mise en cache de WebP est désactivée par filtre." -#: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1495 -msgid "Trashed Posts" -msgstr "Contenus dans la corbeille" +#. Translators: %1$s = plugin name(s), %2$s = opening tag, %3$s = closing +#. tag. +#: inc/Addon/WebP/AdminSubscriber.php:115 +#: inc/Addon/WebP/AdminSubscriber.php:141 +msgid "" +"You are using %1$s to convert images to WebP. If you want WP Rocket to serve" +" them for you, activate this option. %2$sMore info%3$s" +msgid_plural "" +"You are using %1$s to convert images to WebP. If you want WP Rocket to serve" +" them for you, activate this option. %2$sMore info%3$s" +msgstr[0] "" +"Vous utilisez %1$s pour convertir vos images à WebP. Si vous voulez que WP " +"Rocket les serve pour vous, activez cette options. %2$sPlus d'info %3$s" +msgstr[1] "" +"Vous utilisez %1$s pour convertir vos images à WebP. Si vous voulez que WP " +"Rocket les serve pour vous, activez cette options. %2$sPlus d'info %3$s" +msgstr[2] "" +"Vous utilisez %1$s pour convertir vos images à WebP. Si vous voulez que WP " +"Rocket les serve pour vous, activez cette options. %2$sPlus d'info %3$s" + +#. Translators: %1$s = plugin name(s), %2$s = opening tag, %3$s = closing +#. tag. +#: inc/Addon/WebP/AdminSubscriber.php:127 +#: inc/Addon/WebP/AdminSubscriber.php:153 +msgid "" +"You are using %1$s to convert images to WebP. WP Rocket will create separate" +" cache files to serve your WebP images. %2$sMore info%3$s" +msgid_plural "" +"You are using %1$s to convert images to WebP. WP Rocket will create separate" +" cache files to serve your WebP images. %2$sMore info%3$s" +msgstr[0] "" +"Vous utilisez %1$s pour convertir des images à WebP. WP Rocket va créer des " +"fichiers de cache séparés afin de servir vos images WebP. %2$sPlus d'info " +"%3$s" +msgstr[1] "" +"Vous utilisez %1$s pour convertir des images à WebP. WP Rocket va créer des " +"fichiers de cache séparés afin de servir vos images WebP. %2$sPlus d'info " +"%3$s" +msgstr[2] "" +"Vous utilisez %1$s pour convertir des images à WebP. WP Rocket va créer des " +"fichiers de cache séparés afin de servir vos images WebP. %2$sPlus d'info " +"%3$s" + +#. Translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Addon/WebP/AdminSubscriber.php:173 +msgid "" +"%5$sWe have not detected any compatible WebP plugin!%6$s%4$s If you don’t " +"already have WebP images on your site consider using %3$sImagify%2$s or " +"another supported plugin. %1$sMore info%2$s %4$s If you are not using WebP " +"do not enable this option." +msgstr "" +"%5$sNous n'avons pas détecté de plugin WebP compatible !%6$s%4$s Si vous " +"n'avez pas encore d'images WebP sur votre site, envisagez d'utiliser " +"%3$sImagify%2$s ou une autre extension supportée. %1$sPlus d'infos%2$s %4$s " +"Si vous n'utilisez pas WebP, n'activez pas cette option." -#: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1505 -msgid "Spam Comments" -msgstr "Commentaires indésirables" +#: inc/Addon/WebP/AdminSubscriber.php:185 +msgid "WP Rocket will create separate cache files to serve your WebP images." +msgstr "" +"WP Rocket va créer des fichier de cache séparés afin de servir vos images " +"WebP" -#: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1515 -msgid "Trashed Comments" -msgstr "Commentaires à la corbeille" +#: inc/admin/admin.php:18 inc/common/admin-bar.php:273 +#: inc/deprecated/deprecated.php:1787 +msgid "Support" +msgstr "Soutien" -#: inc/Engine/Admin/Database/Optimization.php:35 -msgid "Transients" -msgstr "Transients" +#: inc/admin/admin.php:20 +msgid "Docs" +msgstr "Documents" -#: inc/Engine/Admin/Database/Optimization.php:36 -msgid "Tables" -msgstr "Tables" +#: inc/admin/admin.php:22 inc/common/admin-bar.php:261 +msgid "FAQ" +msgstr "FAQ" -#: inc/Engine/Admin/Database/Subscriber.php:79 -#: inc/deprecated/Engine/Addon/FacebookTracking/Subscriber.php:92 -#: inc/deprecated/Engine/Addon/GoogleTracking/Subscriber.php:137 -msgid "weekly" -msgstr "hebdomadaire" +#: inc/admin/admin.php:24 inc/common/admin-bar.php:70 +msgid "Settings" +msgstr "Réglages" -#: inc/Engine/Admin/Database/Subscriber.php:85 -msgid "monthly" -msgstr "mensuel" +#: inc/admin/admin.php:96 inc/admin/admin.php:117 inc/deprecated/3.5.php:898 +#: inc/Engine/Cache/AdminSubscriber.php:135 +msgid "Clear this cache" +msgstr "Vider ce cache" -#: inc/Engine/Admin/Database/Subscriber.php:194 -msgid "Database optimization process is running" -msgstr "L'optimisation de la base de données est en cours" +#: inc/admin/admin.php:402 +msgid "Settings import failed: you do not have the permissions to do this." +msgstr "" +"L'import des réglages a échoué : vous n'avez pas les permissions nécessaires" +" pour faire ceci." -#: inc/Engine/Admin/Database/Subscriber.php:224 -msgid "Database optimization process is complete. Everything was already optimized!" -msgstr "L'optimisation de la base de donnée est terminée. Tout était déjà optimisé!" +#: inc/admin/admin.php:406 +msgid "Settings import failed: no file uploaded." +msgstr "L'import des réglages a échoué : aucun fichier téléversé." -#: inc/Engine/Admin/Database/Subscriber.php:227 -msgid "Database optimization process is complete. List of optimized items below:" -msgstr "L'optimisation de la base de donnée est terminée. Voici la liste des optimisations effectuées :" +#: inc/admin/admin.php:410 +msgid "Settings import failed: incorrect filename." +msgstr "L'import des réglages a échoué : nom de fichier incorrect." -#: inc/Engine/Admin/Database/Subscriber.php:235 -#, php-format -msgid "%1$d %2$s optimized." -msgstr "%1$d %2$s optimisé(s)." +#: inc/admin/admin.php:421 +msgid "Settings import failed: incorrect filetype." +msgstr "L'import des réglages a échoué : type de fichier incorrect." -#: inc/Engine/Admin/Settings/Page.php:201 -msgid "Save Changes" -msgstr "Enregistrer les modifications" +#: inc/admin/admin.php:431 +msgid "Settings import failed: " +msgstr "Échec de l'import des réglages :" -#: inc/Engine/Admin/Settings/Page.php:201 -msgid "Validate License" -msgstr "Valider la licence" +#: inc/admin/admin.php:447 +msgid "Settings import failed: unexpected file content." +msgstr "Échec de l'import des réglages : contenu du fichier incorrect." -#: inc/Engine/Admin/Settings/Page.php:257 -#: inc/Engine/Admin/Settings/Page.php:258 -msgid "Unavailable" -msgstr "Indisponible" +#: inc/admin/admin.php:492 +msgid "Settings imported and saved." +msgstr "Réglages importés et sauvegardés." -#: inc/Engine/Admin/Settings/Page.php:352 -#: inc/deprecated/deprecated.php:1789 -#: views/settings/page-sections/dashboard.php:80 -msgid "License" -msgstr "Licence" +#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:551 +msgid "Excluded CSS Files" +msgstr "Fichiers CSS à exclure" -#: inc/Engine/Admin/Settings/Page.php:369 -msgid "API key" -msgstr "Clé d’API" +#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:699 +msgid "Excluded Inline JavaScript" +msgstr "JavaScript inline exclu" -#: inc/Engine/Admin/Settings/Page.php:384 -msgid "Email address" -msgstr "Adresse courriel" +#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 +msgid "Excluded JavaScript Files" +msgstr "Fichiers JavaScript exclus" -#: inc/Engine/Admin/Settings/Page.php:410 -msgid "Dashboard" -msgstr "Tableau de bord" +#: inc/admin/options.php:105 +msgid "Defer JavaScript Files" +msgstr "Charger le JavaScript en différé" -#: inc/Engine/Admin/Settings/Page.php:411 -msgid "Get help, account info" -msgstr "Aide, info du compte" +#: inc/admin/options.php:106 +msgid "Excluded Delay JavaScript Files" +msgstr "Fichiers JavaScript exclus du report de l'éxecution" -#: inc/Engine/Admin/Settings/Page.php:420 -msgid "My Status" -msgstr "Ma situation" +#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1203 +msgid "Never Cache URL(s)" +msgstr "Ne jamais mettre en cache ces URL(s)" -#: inc/Engine/Admin/Settings/Page.php:430 -#: views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "Analytiques Rocket" +#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1217 +msgid "Never Cache User Agent(s)" +msgstr "Ne jamais mettre en cache ces agents utilisateurs" -#: inc/Engine/Admin/Settings/Page.php:432 -#, php-format -msgid "I agree to share anonymous data with the development team to help improve WP Rocket. %1$sWhat info will we collect?%2$s" -msgstr "J'accepte de partager des données anonymes avec l'équipe de développement pour aider à améliorer WP Rocket. %1$sQuelles informations recueillerons-nous?%2$s" +#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1223 +msgid "Always Purge URL(s)" +msgstr "Toujours purger ces URL(s)" -#: inc/Engine/Admin/Settings/Page.php:456 -#: inc/Engine/Cache/WPCache.php:354 -msgid "Cache" -msgstr "Cache" +#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1504 +msgid "Exclude files from CDN" +msgstr "Exclure des fichiers du CDN" -#: inc/Engine/Admin/Settings/Page.php:457 -msgid "Basic cache options" -msgstr "Options de base de la cache" +#. translators: 1 and 2 can be anything. +#: inc/admin/options.php:131 +msgid "%1$s: %2$s" +msgstr "%1$s: %2$s" -#: inc/Engine/Admin/Settings/Page.php:464 -msgid "Mobile Cache" -msgstr "Cache mobile" +#: inc/admin/options.php:141 +msgid "The following pattern is invalid and has been removed:" +msgid_plural "The following patterns are invalid and have been removed:" +msgstr[0] "Le modèle suivant est non-valide et a été retiré :" +msgstr[1] "Les modèles suivants sont non-valides et ont été retirés :" +msgstr[2] "Les modèles suivants sont non-valides et ont été retirés :" -#: inc/Engine/Admin/Settings/Page.php:466 -msgid "Speed up your site for mobile visitors." -msgstr "Accélérez votre site pour vos visiteurs mobile." +#: inc/admin/options.php:157 +msgid "More info" +msgstr "Plus d'infos" -#: inc/Engine/Admin/Settings/Page.php:471 -msgid "We detected you use a plugin that requires a separate cache for mobile, and automatically enabled this option for compatibility." -msgstr "Nous avons détecté que vous utilisiez une extension qui nécessite un cache séparé pour mobile, et avons automatiquement activé cette option pour assurer la compatibilité." +#: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 +msgid "Clear cache" +msgstr "Vider le cache" -#: inc/Engine/Admin/Settings/Page.php:475 -msgid "User Cache" -msgstr "Cache utilisateur" +#. translators: %1$s WP Rocket plugin name; %2$s = file name. +#: inc/admin/ui/notices.php:30 inc/admin/ui/notices.php:43 +msgid "" +"%1$s has not been deactivated due to missing writing permissions.
\n" +"Make %2$s writeable and retry deactivation, or force deactivation now:" +msgstr "" +"%1$s n'a pas été désactivé en raisons de l'absence des permissions d'écriture.
\n" +"Rendez %2$s inscriptible et réessayez de désactiver, ou forcez la désactivation maintenant :" -#: inc/Engine/Admin/Settings/Page.php:478 -#, php-format -msgid "%1$sUser cache%2$s is great when you have user-specific or restricted content on your website." -msgstr "%1$sLe cache utilisateur%2$s est parfait si vous avez du contenu spécifique ou restreint pour vos utilisateurs sur votre site." +#. translators: %s is WP Rocket plugin name. +#: inc/admin/ui/notices.php:97 +msgid "" +"%s: One or more plugins have been enabled or disabled, " +"clear the cache if they affect the front end of your site." +msgstr "" +"%s: Une ou plusieurs extensions ont été activées ou " +"désactivées, videz le cache si elles influent sur l’apparence de votre site." -#: inc/Engine/Admin/Settings/Page.php:486 -msgid "Cache Lifespan" -msgstr "Délai de nettoyage du cache" +#. translators: %s is WP Rocket plugin name. +#: inc/admin/ui/notices.php:141 +msgid "" +"%s: The following plugins are not compatible with this " +"plugin and may cause unexpected results:" +msgstr "" +"%s: Les extensions suivantes ne sont pas compatibles avec " +"cette extension et peuvent générer des résultats inattendus :" -#: inc/Engine/Admin/Settings/Page.php:489 -#, php-format -msgid "Cache files older than the specified lifespan will be deleted.
Enable %1$spreloading%2$s for the cache to be rebuilt automatically after lifespan expiration." -msgstr "Les fichiers en cache plus vieux que la durée de vie spécifiée seront effacés.
Activer %1$spré-chargement %2$s pour que le cache soit généré de nouveau automatiquement après l'expiration de la durée de vie." +#: inc/admin/ui/notices.php:147 +msgid "Deactivate" +msgstr "Désactiver" -#: inc/Engine/Admin/Settings/Page.php:503 -msgid "Enable caching for logged-in WordPress users" -msgstr "Activer la mise en cache pour les utilisateurs WordPress connectés" +#: inc/admin/ui/notices.php:189 +msgid "" +"WP Rocket Footer JS is not an official add-on. It prevents some options in " +"WP Rocket from working correctly. Please deactivate it if you have problems." +msgstr "" +"WP Rocket Footer JS n'est pas un ajout officiel. Il prévient certaines " +"options dans WP Rocket de fonctionner correctement. Veuillez le désactiver " +"si vous avez des problèmes." -#: inc/Engine/Admin/Settings/Page.php:511 -msgid "Enable caching for mobile devices" -msgstr "Activer la mise en cache pour les appareils mobiles" +#. translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/admin/ui/notices.php:229 +msgid "" +"Endurance Cache is currently enabled, which will conflict with WP Rocket " +"Cache. Please set the Endurance Cache cache level to Off (Level 0) on the " +"%1$sSettings > General%2$s page to prevent any issues." +msgstr "" +"Endurance Cache est présentement activé, ce qui peut causer conflit avec le " +"cache de WP Rocket. Veuillez configurer le niveau de Endurance Cache à " +"\"Off\" (Niveau 0) sur la page %1$sParamètres > Général%2$s afin de prévenir" +" tout problème." + +#. translators: %1$s WP Rocket plugin name; %2$s = opening link; %3$s = +#. closing link +#: inc/admin/ui/notices.php:250 +msgid "" +"%1$s: A custom permalink structure is required for the plugin to work " +"properly. %2$sGo to permalinks settings%3$s" +msgstr "" +"%1$s: Une structure de permalien personnalisée est requise pour que cette " +"extension fonctionne. %2$sRendez-vous aux réglages des permaliens%3$s" -#: inc/Engine/Admin/Settings/Page.php:526 -msgid "Separate cache files for mobile devices" -msgstr "Créer un fichier de cache distinct pour les appareils mobiles" +#. translators: %s = plugin name. +#: inc/admin/ui/notices.php:297 +msgid "" +"%s could not modify the .htaccess file due to missing writing permissions." +msgstr "" +"%s n'a pas pu modifier le fichier .htaccess dû à l'absence de permissions " +"d'écriture.." -#: inc/Engine/Admin/Settings/Page.php:528 -#, php-format -msgid "Most modern themes are responsive and should work without a separate cache. Enable this only if you have a dedicated mobile theme or plugin. %1$sMore info%2$s" -msgstr "La majorité des thèmes sont responsives et devraient fonctionner sans cache séparée. Activer ceci seulement si vous avez un thème mobile dédié ou une extension. %1$sPlus d'info%2$s" +#. translators: This is a doc title! %1$s = opening link; %2$s = closing link +#: inc/admin/ui/notices.php:303 inc/admin/ui/notices.php:788 +msgid "Troubleshoot: %1$sHow to make system files writeable%2$s" +msgstr "" +"Pour résoudre le problème : %1$sComment rendre les fichiers systèmes " +"accessible à l'écriture%2$s" -#: inc/Engine/Admin/Settings/Page.php:544 -msgid "Specify time after which the global cache is cleared
(0 = unlimited )" -msgstr "Indiquez le nombre d’heures après quoi le cache global doit être vidé
(0 = illimité)" +#. translators: Documentation exists in EN, DE, FR, ES, IT; use loaclised URL +#. if applicable +#: inc/admin/ui/notices.php:305 inc/admin/ui/notices.php:790 +msgid "" +"https://docs.wp-rocket.me/article/626-how-to-make-system-files-htaccess-wp-" +"config-writeable/?utm_source=wp_plugin&utm_medium=wp_rocket" +msgstr "" +"https://fr.docs.wp-rocket.me/article/945-fichiers-systemes-accessible-" +"ecriture/?utm_source=wp_plugin&utm_medium=wp_rocket" -#: inc/Engine/Admin/Settings/Page.php:546 -#, php-format -msgid "Reduce lifespan to 10 hours or less if you notice issues that seem to appear periodically. %1$sWhy?%2$s" -msgstr "Réduisez le délai à 10 heures ou moins si vous remarquez des problèmes apparaissant de façon intermittente. %1$sPourquoi ?%2$s" +#: inc/admin/ui/notices.php:311 +msgid "" +"Don’t worry, WP Rocket’s page caching and settings will still function " +"correctly." +msgstr "" +"Pas d'inquiétude, la mise en cache de pages et les paramètres fonctionneront" +" correctement." -#: inc/Engine/Admin/Settings/Page.php:552 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 -msgid "Hours" -msgstr "Heures" +#: inc/admin/ui/notices.php:311 +msgid "" +"For optimal performance, adding the following lines into your .htaccess is " +"recommended (not required):" +msgstr "" +"Pour une performance optimale, il est recommandé d'ajouter les lignes " +"suivantes à votre fichier .htaccess (optionnel) :" -#: inc/Engine/Admin/Settings/Page.php:553 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 -msgid "Days" -msgstr "Jours" +#. translators: %1$s = plugin name, %2$s + %3$s = opening links, %4$s = +#. closing link +#: inc/admin/ui/notices.php:458 +msgid "" +"%1$s is good to go! %2$sTest your load time%4$s, or visit your " +"%3$ssettings%4$s." +msgstr "" +"%1$s est prêt à décoller ! %2$sTestez votre temps de chargement%4$s, ou " +"jetez un oeil aux %3$sréglages%4$s." -#: inc/Engine/Admin/Settings/Page.php:602 -msgid "File Optimization" -msgstr "Optimisation des fichiers" +#: inc/admin/ui/notices.php:499 +msgid "" +"Would you allow WP Rocket to collect non-sensitive diagnostic data from this" +" website?" +msgstr "" +"Autorisez-vous WP Rocket à recueillir des données de diagnostic non-" +"sensibles de ce site web ?" -#: inc/Engine/Admin/Settings/Page.php:603 -msgid "Optimize CSS & JS" -msgstr "Optimiser le CSS et le JS" +#: inc/admin/ui/notices.php:500 +msgid "This would help us to improve WP Rocket for you in the future." +msgstr "Cela nous aiderait à améliorer WP Rocket pour vous dans le futur." -#: inc/Engine/Admin/Settings/Page.php:621 -msgid "CSS Files" -msgstr "Fichiers CSS" +#. translators: button text, click will expand data collection preview +#: inc/admin/ui/notices.php:506 +msgid "What info will we collect?" +msgstr "Quelles infos recueillerons-nous ?" -#: inc/Engine/Admin/Settings/Page.php:611 -#: inc/Engine/Admin/Settings/Page.php:637 -#, php-format -msgid "%1$s Minification is currently activated in Autoptimize. If you want to use %2$s’s minification, disable those options in Autoptimize." -msgstr "La minification %1$s est actuellement activée dans Autoptimize. Si vous souhaitez utiliser la minification de %2$s, désactivez ces options dans Autoptimize." +#: inc/admin/ui/notices.php:511 +msgid "" +"Below is a detailed view of all data WP Rocket will collect if granted " +"permission. WP Rocket will never transmit any domain names or email " +"addresses (except for license validation), IP addresses, or third-party API " +"keys." +msgstr "" +"Vous trouverez ci-dessous une vue détaillée de toutes les données que WP " +"Rocket recueillera si vous nous le permettez. WP Rocket ne transmettra " +"jamais de noms de domaine ou d'adresses courriel (sauf pour la validation de" +" licence), d'adresses IP ou de clés d’API tierce-partie." -#: inc/Engine/Admin/Settings/Page.php:630 -msgid "JavaScript Files" -msgstr "Fichiers JavaScript" - -#: inc/Engine/Admin/Settings/Page.php:663 -msgid "Minify CSS files" -msgstr "Minifier les fichiers CSS" +#. translators: button text for data collection opt-in +#: inc/admin/ui/notices.php:520 +msgid "Yes, allow" +msgstr "Oui, autoriser" -#: inc/Engine/Admin/Settings/Page.php:664 -msgid "Minify CSS removes whitespace and comments to reduce the file size." -msgstr "Minifier le CSS supprime les espaces et les commentaires afin de réduire le poids des fichiers." +#. translators: button text for data collection opt-in +#: inc/admin/ui/notices.php:523 +msgid "No, thanks" +msgstr "Non, merci" -#: inc/Engine/Admin/Settings/Page.php:677 -#: inc/Engine/Admin/Settings/Page.php:701 -#: inc/Engine/Admin/Settings/Page.php:765 -#: inc/Engine/Admin/Settings/Page.php:831 -#: inc/Engine/Admin/Settings/Page.php:855 -msgid "This could break things!" -msgstr "Ceci pourrait briser des choses!" +#: inc/admin/ui/notices.php:562 +msgid "Thank you!" +msgstr "Merci!" -#: inc/Engine/Admin/Settings/Page.php:678 -#: inc/Engine/Admin/Settings/Page.php:702 -#: inc/Engine/Admin/Settings/Page.php:766 -#: inc/Engine/Admin/Settings/Page.php:832 -#: inc/Engine/Admin/Settings/Page.php:856 -msgid "If you notice any errors on your website after having activated this setting, just deactivate it again, and your site will be back to normal." -msgstr "Si vous remarquez des erreurs sur votre site après avoir activé cette option, il vous suffit de la désactiver et votre site sera de retour à la normale." - -#: inc/Engine/Admin/Settings/Page.php:679 -msgid "Activate minify CSS" -msgstr "Activer la minification CSS" - -#: inc/Engine/Admin/Settings/Page.php:684 -msgid "Combine CSS files (Enable Minify CSS files to select)" -msgstr "Combiner les fichiers CSS (activez la minification CSS pour sélectionner)" - -#: inc/Engine/Admin/Settings/Page.php:686 -#, php-format -msgid "Combine CSS merges all your files into 1, reducing HTTP requests. Not recommended if your site uses HTTP/2. %1$sMore info%2$s" -msgstr "Combiner le CSS condense tous vos fichiers en un seul, réduisant le nombre de requêtes HTTP. Ces réglages ne sont pas recommandés si votre site utilise HTTP/2. %1$sPlus d'infos%2$s" - -#: inc/Engine/Admin/Settings/Page.php:687 -msgid "For compatibility and best results, this option is disabled when Remove unused CSS is enabled." -msgstr "Pour des raisons de compatibilité et pour obtenir les meilleurs résultats, cette option est désactivée lorsque l'option Supprimer les ressources CSS inutilisées est activée." - -#: inc/Engine/Admin/Settings/Page.php:703 -msgid "Activate combine CSS" -msgstr "Activer la combinaison CSS" - -#: inc/Engine/Admin/Settings/Page.php:708 -#: inc/admin/options.php:124 -msgid "Excluded CSS Files" -msgstr "Fichiers CSS à exclure" +#: inc/admin/ui/notices.php:567 +msgid "WP Rocket now collects these metrics from your website:" +msgstr "WP Rocket recueille désormais ces données de votre site web :" -#: inc/Engine/Admin/Settings/Page.php:709 -msgid "Specify URLs of CSS files to be excluded from minification and concatenation (one per line)." -msgstr "Indiquez l’URL des fichiers CSS à exclure de la minification et de la concaténation (une par ligne)" +#. translators: %s = plugin name. +#: inc/admin/ui/notices.php:605 +msgid "%s: Cache cleared." +msgstr "%s : Cache vidé." -#: inc/Engine/Admin/Settings/Page.php:710 -msgid "Internal: The domain part of the URL will be stripped automatically. Use (.*).css wildcards to exclude all CSS files located at a specific path." -msgstr "Interne : Le nom de domaine sera supprimé automatiquement de l'URL. Utilisez les expressions régulières (.*).css afin d'exclure tous les fichiers CSS pour un chemin donné." +#. translators: %s = plugin name. +#: inc/admin/ui/notices.php:612 +msgid "%s: Post cache cleared." +msgstr "%s : Cache des articles vidé." -#: inc/Engine/Admin/Settings/Page.php:712 -#, php-format -msgid "3rd Party: Use either the full URL path or only the domain name, to exclude external CSS. %1$sMore info%2$s" -msgstr "Tierce-partie : Utilisez soit l'URL complet ou seulement le nom de domaine afin d'exclure le CSS externe.. %1$sPlus d'info%2$s" +#. translators: %s = plugin name. +#: inc/admin/ui/notices.php:619 +msgid "%s: Term cache cleared." +msgstr "%s : Cache des termes vidé." -#: inc/Engine/Admin/Settings/Page.php:725 -#: inc/Engine/Admin/Settings/Page.php:747 -msgid "Optimize CSS delivery" -msgstr "Optimiser le chargement du CSS" +#. translators: %s = plugin name). +#: inc/admin/ui/notices.php:626 +msgid "%s: User cache cleared." +msgstr "%s : Cache des utilisateurs vidé." -#: inc/Engine/Admin/Settings/Page.php:730 -msgid "Optimize CSS delivery eliminates render-blocking CSS on your website. Only one method can be selected. Remove Unused CSS is recommended for optimal performance, but limited only to the users with active license." -msgstr "L'Optimisation du Chargement CSS élimine les CSS bloquant le rendu de votre site Web. Une seule méthode peut être sélectionnée. La méthode Supprimer les CSS inutilisés est recommandée pour des performances optimales." +#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 +#: views/settings/page-sections/dashboard.php:47 +msgid "Dismiss this notice" +msgstr "Ne pas tenir compte de cet avertissement." -#: inc/Engine/Admin/Settings/Page.php:730 -msgid "Optimize CSS delivery eliminates render-blocking CSS on your website. Only one method can be selected. Remove Unused CSS is recommended for optimal performance." -msgstr "L'Optimisation du Chargement CSS élimine les CSS bloquant le rendu sur votre site Web. Une seule méthode peut être sélectionnée. La méthode Supprimer les CSS inutilisés est recommandée pour des performances optimales." +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:51 +msgid "Clear Used CSS" +msgstr "Vider le CSS utilisé" -#: inc/Engine/Admin/Settings/Page.php:740 -#, php-format -msgid "Optimize CSS Delivery features are disabled on local environments. %1$sLearn more%2$s" -msgstr "Les options Optimiser le chargement CSS sont désactivées en local. %1$sEn savoir plus%2$s" +#: inc/admin/ui/notices.php:685 +msgid "Stop Preload" +msgstr "Cesser le pré-chargement" -#: inc/Engine/Admin/Settings/Page.php:760 -#: inc/admin/ui/meta-boxes.php:106 -msgid "Remove Unused CSS" -msgstr "Retirer CSS inutilisé" +#: inc/admin/ui/notices.php:691 +msgid "Turn on Remove Unused CSS" +msgstr "Activer l'option Supprimer les ressources CSS inutilisées" -#: inc/Engine/Admin/Settings/Page.php:763 -#, php-format -msgid "Removes unused CSS per page and helps to reduce page size and HTTP requests. Recommended for best performance. Test thoroughly! %1$sMore info%2$s" -msgstr "Supprime le CSS inutilisé par page et contribue à réduire la taille des pages et les requêtes HTTP. Recommandé pour de meilleures performances. Testez-le rigoureusement ! %1$sPlus d'infos%2$s" +#: inc/admin/ui/notices.php:697 +msgid "Enable “Separate Cache Files for Mobile Devices” now" +msgstr "" +"Activer “Créer un fichier de cache à part pour les mobiles” maintenant" -#: inc/Engine/Admin/Settings/Page.php:767 -msgid "Activate Remove Unused CSS" -msgstr "Activer le retrait du CSS inutilisé" +#: inc/admin/ui/notices.php:715 +msgid "Force deactivation " +msgstr "Forcer la désactivation " -#: inc/Engine/Admin/Settings/Page.php:773 -msgid "CSS safelist" -msgstr "Liste sécuritaire CSS" +#: inc/admin/ui/notices.php:745 +msgid "The following code should have been written to this file:" +msgstr "Le code suivant aurait dû être écrit dans ce fichier :" -#: inc/Engine/Admin/Settings/Page.php:774 -msgid "Specify CSS filenames, IDs or classes that should not be removed (one per line)." -msgstr "Spécifiez les fichiers CSS, les IDs ou les classes qui ne devraient pas être retirés (un par ligne)." +#. translators: %s = plugin name. +#: inc/admin/ui/notices.php:776 +msgid "%s cannot configure itself due to missing writing permissions." +msgstr "" +"%s ne peut pas s’auto-configurer en raison de l'absence de permissions en " +"écriture." -#: inc/Engine/Admin/Settings/Page.php:789 -#: inc/admin/ui/meta-boxes.php:109 -msgid "Load CSS asynchronously" -msgstr "Chargement asynchrone du CSS" +#. translators: %s = file/folder name +#: inc/admin/ui/notices.php:782 +msgid "Affected file/folder: %s" +msgstr "Fichier/dossier affecté : %s" -#: inc/Engine/Admin/Settings/Page.php:792 -#, php-format -msgctxt "WP Critical CSS compatibility" -msgid "Load CSS asynchronously is currently handled by the %1$s plugin. If you want to use WP Rocket’s load CSS asynchronously option, disable the %1$s plugin." -msgstr "Le Chargement asynchrone du CSS est actuellement géré par le plugin %1$s. Si vous souhaitez utiliser l'option de chargement asynchrone du CSS de WP Rocket, désactivez le plugin %1$s." +#: inc/classes/admin/class-logs.php:124 +msgid "The debug file could not be deleted." +msgstr "Le fichier de debug n'a pu être effacé." -#: inc/Engine/Admin/Settings/Page.php:794 -#, php-format -msgid "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" -msgstr "Génère le Critical Path CSS et charge les CSS de manière asynchrone. %1$sPlus d'infos%2$s" +#. Translators: %1$s = Plugin name, %2$s = Plugin version. +#: inc/classes/class-wp-rocket-requirements-check.php:147 +msgid "To function properly, %1$s %2$s requires at least:" +msgstr "Pour fonctionner correctement, %1$s %2$s nécessite au moins :" -#: inc/Engine/Admin/Settings/Page.php:800 -msgid "Fallback critical CSS" -msgstr "CSS critique de secours" +#. Translators: %1$s = PHP version required. +#: inc/classes/class-wp-rocket-requirements-check.php:151 +msgid "" +"PHP %1$s. To use this WP Rocket version, please ask your web host how to " +"upgrade your server to PHP %1$s or higher." +msgstr "" +"PHP %1$s. Pour utiliser cette version de WP Rocket, demandez à votre " +"hébergeur comment mettre à niveau votre serveur vers PHP %1$s ou supérieur." -#: inc/Engine/Admin/Settings/Page.php:802 -#, php-format -msgid "Provides a fallback if auto-generated critical path CSS is incomplete. %1$sMore info%2$s" -msgstr "Fournit une option de secours si le CSS critique auto-généré est incomplet.%1$sPlus d'infos%2$s" +#. Translators: %1$s = WordPress version required. +#: inc/classes/class-wp-rocket-requirements-check.php:156 +msgid "" +"WordPress %1$s. To use this WP Rocket version, please upgrade WordPress to " +"version %1$s or higher." +msgstr "" +"WordPress %1$s. Pour utiliser cette version de WP Rocket, mettez à jour " +"WordPress à la version %1$s ou plus récente." -#: inc/Engine/Admin/Settings/Page.php:817 -msgid "Minify JavaScript files" -msgstr "Minifier les fichiers JS" +#: inc/classes/class-wp-rocket-requirements-check.php:159 +msgid "" +"If you are not able to upgrade, you can rollback to the previous version by " +"using the button below." +msgstr "" +"Si vous n'êtes pas en mesure d’effectuer le rehaussement, vous pouvez " +"restaurer WP Rocket à sa version précédente en utilisant le bouton ci-" +"dessous." -#: inc/Engine/Admin/Settings/Page.php:818 -msgid "Minify JavaScript removes whitespace and comments to reduce the file size." -msgstr "Minifier le JavaScript supprime les espace et les commentaires afin de réduire le poids des fichiers." +#. Translators: %s = Previous plugin version. +#: inc/classes/class-wp-rocket-requirements-check.php:161 +#: inc/deprecated/deprecated.php:1947 +msgid "Re-install version %s" +msgstr "Réinstaller la version %s" -#: inc/Engine/Admin/Settings/Page.php:833 -msgid "Activate minify JavaScript" -msgstr "Activer la minification JavaScript" +#. translators: %s is the plugin name. +#: inc/classes/class-wp-rocket-requirements-check.php:203 +#: inc/classes/class-wp-rocket-requirements-check.php:214 +#: inc/deprecated/3.11.php:236 inc/deprecated/3.11.php:251 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 +msgid "%s Update Rollback" +msgstr "Retour à la version %s" -#: inc/Engine/Admin/Settings/Page.php:838 -msgid "Combine JavaScript files (Enable Minify JavaScript files to select)" -msgstr "Combiner les fichiers JavaScript (activez la minification JavaScript pour sélectionner)" +#. translators: %1$s = missing tags; +#: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:151 +msgid "" +"Failed to detect the following requirement in your theme: closing %1$s." +msgid_plural "" +"Failed to detect the following requirements in your theme: closing %1$s." +msgstr[0] "" +"Échec de la détection du requis suivant de votre thème : fermer %1$s." +msgstr[1] "" +"Échec de la détection des requis suivants de votre thème : fermer %1$s." +msgstr[2] "" +"Échec de la détection des requis suivants de votre thème : fermer %1$s." + +#. translators: Documentation exists in EN, FR; use localized URL if +#. applicable. +#: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:159 +msgid "" +"https://docs.wp-rocket.me/article/99-pages-not-cached-or-minify-cssjs-not-" +"working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" +msgstr "" +"https://docs.wp-rocket.me/article/99-pages-not-cached-or-minify-cssjs-not-" +"working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" -#: inc/Engine/Admin/Settings/Page.php:840 -#, php-format -msgid "Combine JavaScript files combines your site’s internal, 3rd party and inline JS reducing HTTP requests. Not recommended if your site uses HTTP/2. %1$sMore info%2$s" -msgstr "Combine vos fichiers JavaScript, les fichiers tiers et le inline JS en un seul fichier, réduisant le nombre de requêtes HTTP. Ces réglages ne sont pas recommandés si votre site utilise HTTP/2.%1$sPlus d'infos%2$s" +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear and Preload Cache" +msgstr "Vider et précharger le cache" -#: inc/Engine/Admin/Settings/Page.php:841 -msgid "For compatibility and best results, this option is disabled when delay javascript execution is enabled." -msgstr "Pour assurer la compatibilité et obtenir de meilleurs résultats, cette option est désactivée lorsque le délai du javascript est activé." +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear Cache" +msgstr "Vider le cache" -#: inc/Engine/Admin/Settings/Page.php:857 -msgid "Activate combine JavaScript" -msgstr "Activer la combinaison JavaScript" +#: inc/common/admin-bar.php:131 inc/functions/i18n.php:20 +msgid "All languages" +msgstr "Toutes les langues" -#: inc/Engine/Admin/Settings/Page.php:862 -#: inc/admin/options.php:125 -msgid "Excluded Inline JavaScript" -msgstr "JavaScript inline exclu" +#: inc/common/admin-bar.php:178 +msgid "Clear this post" +msgstr "Vider cet article" -#: inc/Engine/Admin/Settings/Page.php:864 -#, php-format -msgid "Specify patterns of inline JavaScript to be excluded from concatenation (one per line). %1$sMore info%2$s" -msgstr "Indiquez les patterns du code JavaScript inline à exclure de la concaténation (un par ligne).%1$sMore info%2$s" +#: inc/common/admin-bar.php:192 +msgid "Purge this URL" +msgstr "Purger cet URL" -#: inc/Engine/Admin/Settings/Page.php:880 -#: inc/Engine/Admin/Settings/Page.php:913 -#: inc/Engine/Admin/Settings/Page.php:960 -#: inc/admin/options.php:126 -msgid "Excluded JavaScript Files" -msgstr "Fichiers JavaScript exclus" +#: inc/common/admin-bar.php:212 +msgid "Purge Sucuri cache" +msgstr "Purger le cache Sucuri" -#: inc/Engine/Admin/Settings/Page.php:881 -msgid "Specify URLs of JavaScript files to be excluded from minification and concatenation (one per line)." -msgstr "Indiquez l’URL des fichiers JavaScript à exclure de la minification et de la concaténation (une par ligne)" +#: inc/common/admin-bar.php:236 views/settings/fields/rocket-cdn.php:55 +msgid "Purge RocketCDN cache" +msgstr "Purger le cache RocketCDN" -#: inc/Engine/Admin/Settings/Page.php:882 -msgid "Internal: The domain part of the URL will be stripped automatically. Use (.*).js wildcards to exclude all JS files located at a specific path." -msgstr "Interne :Le nom de domaine sera supprimé automatiquement de l’URL. Utilisez les expressions régulières (.*).js afin d’exclure tous les fichiers JS pour un chemin donné." +#: inc/common/admin-bar.php:249 views/settings/partials/documentation.php:14 +msgid "Documentation" +msgstr "Documentation" -#: inc/Engine/Admin/Settings/Page.php:884 -#, php-format -msgid "3rd Party: Use either the full URL path or only the domain name, to exclude external JS. %1$sMore info%2$s" -msgstr "Tierce-partie : Utilisez soit l'URL complet ou seulement le nom de domaine afin d'exclure le JS externe. %1$sPlus d'info%2$s" +#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:107 +msgid "Activate Imagify" +msgstr "Activer Imagify" -#: inc/Engine/Admin/Settings/Page.php:900 -msgid "Load JavaScript deferred" -msgstr "Charger les fichiers JavaScript en différé" +#: inc/deprecated/3.2.php:52 +msgid "Install Imagify for Free" +msgstr "Installer Imagify gratuitement" -#: inc/Engine/Admin/Settings/Page.php:902 -#, php-format -msgid "Load JavaScript deferred eliminates render-blocking JS on your site and can improve load time. %1$sMore info%2$s" -msgstr "Charger les fichiers JavaScript en différé élimine le blocage de l’affichage de votre site dû au JS et peux améliorer le temps de chargement perçu. %1$sPlus d'infos%2$s" +#: inc/deprecated/3.2.php:67 +msgid "" +"Speed up your website and boost your SEO by reducing image file sizes " +"without losing quality with Imagify." +msgstr "" +"Accélérez votre site web et améliorez votre référencement en réduisant le " +"poids de vos image sans perte de qualité avec Imagify." -#: inc/Engine/Admin/Settings/Page.php:915 -#, php-format -msgid "Specify URLs or keywords of JavaScript files to be excluded from defer (one per line). %1$sMore info%2$s" -msgstr "Spécifiez les URLs ou mots-clés des fichiers JavaScript à être exclus du chargement différé (un par ligne). %1$sPlus d'info%2$s" +#: inc/deprecated/3.2.php:72 +msgid "More details" +msgstr "Plus de détails" -#: inc/Engine/Admin/Settings/Page.php:931 -#: inc/admin/ui/meta-boxes.php:111 -msgid "Delay JavaScript execution" -msgstr "Retarder l'exécution du JavaScript" +#. translators: %d is the number of pages preloaded. +#: inc/deprecated/3.2.php:228 +msgid "Sitemap preload: %d pages have been cached." +msgstr "Pré-chargement du Sitemap : %d pages ont été mises en cache." -#: inc/Engine/Admin/Settings/Page.php:933 -#, php-format -msgid "Improves performance by delaying the loading of JavaScript files until user interaction (e.g. scroll, click). %1$sMore info%2$s" -msgstr "Améliore les performances en retardant le chargement des fichiers JavaScript jusqu'à une interaction de l'utilisateur (ie. défiler, cliquer). %1$sPlus d'info%2$s" +#. translators: %d = Number of pages preloaded. +#: inc/deprecated/3.2.php:261 +msgid "" +"Sitemap preload: %d uncached pages have now been preloaded. (refresh to see " +"progress)" +msgstr "" +"Pré-chargement du Sitemap : %d pages ont été pré-chargées. (rafraîchir pour " +"voir la progression)" -#: inc/Engine/Admin/Settings/Page.php:961 -msgid "Specify URLs or keywords that can identify inline or JavaScript files to be excluded from delaying execution (one per line)." -msgstr "Spécifiez les URLs ou mots-clés qui peuvent identifier le JavaScript en ligne ou en fichiers à être exclus de l'exécution retardée (un par ligne)." +#. translators: %s is an URL. +#: inc/deprecated/3.3.php:761 inc/deprecated/3.3.php:770 +#: inc/Engine/Plugin/UpdaterApiTools.php:32 +msgid "" +"An unexpected error occurred. Something may be wrong with WP-Rocket.me or " +"this server’s configuration. If you continue to have problems, contact support." +msgstr "" +"Une erreur inattendue s’est produite. Quelque chose ne va pas avec WP-" +"Rocket.me ou avec la configuration de ce serveur. Si vous continuez à avoir " +"des problèmes, contactez notre soutien technique." -#: inc/Engine/Admin/Settings/Page.php:993 -msgid "Media" -msgstr "Média" +#: inc/deprecated/3.4.php:18 +msgid "Choose a domain from the list" +msgstr "Choisissez un domaine dans la liste" -#: inc/Engine/Admin/Settings/Page.php:994 -msgid "LazyLoad, image dimensions" -msgstr "LazyLoad, dimensions des images" +#: inc/deprecated/3.4.php:31 +msgid "No domain available in your Cloudflare account" +msgstr "Aucun domaine disponible dans votre compte Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1003 -msgid "Autoptimize" -msgstr "Autoptimize" +#: inc/deprecated/3.5.php:71 inc/deprecated/3.5.php:195 +msgid "" +"Curl is disabled on your server. Please ask your host to enable it. This is " +"required for the Cloudflare Add-on to work correctly." +msgstr "" +"CURL est désactivé sur votre serveur. Veuillez demander à votre hébergeur de" +" l'activer. Ceci est requis pour que l'ajout Cloudflare fonctionne " +"correctement." -#: inc/Engine/Admin/Settings/Page.php:1048 -msgid "LazyLoad" -msgstr "Chargement différé" +#. translators: %1$s = opening link; %2$s = closing link +#: inc/deprecated/3.5.php:79 +msgid "" +"Cloudflare email, API key and Zone ID are not set. Read the " +"%1$sdocumentation%2$s for further guidance." +msgstr "" +"Le courriel, la clé d'API et le Zone ID de Cloudflare de sont pas définis. " +"Lisez la %1$sdocumentation%2$s pour plus d'assistance." -#: inc/Engine/Admin/Settings/Page.php:1051 -#, php-format -msgid "It can improve actual and perceived loading time as images, iframes, and videos will be loaded only as they enter (or about to enter) the viewport and reduces the number of HTTP requests. %1$sMore Info%2$s" -msgstr "Peut améliorer le temps de chargement réel et perçu car les images, iframes et vidéos ne seront chargées que lorsqu'elles entreront (ou seront sur le point d'entrer) dans la zone visible. Réduit le nombre de requêtes HTTP. %1$sPlus d'informations.%2$s" +#. translators: %1$s = opening link; %2$s = closing link +#: inc/deprecated/3.5.php:206 +msgid "" +"Cloudflare email and API key are not set. Read the %1$sdocumentation%2$s for" +" further guidance." +msgstr "" +"Le courriel et la clé d'API de Cloudflare ne sont pas configurés. Lisez la " +"%1$sdocumentation%2$s pour plus d'assistance." -#: inc/Engine/Admin/Settings/Page.php:1058 -#, php-format -msgid "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s LazyLoad, disable this option in %2$s." -msgstr "LazyLoad est présentement activé dans %2$s. Si vous désirez utiliser le LazyLoad de WP Rocket, désactivez cette option dans %2$s." +#: inc/deprecated/3.5.php:271 +msgid "Connection to Cloudflare failed" +msgstr "La connexion à Cloudflare a échoué" -#: inc/Engine/Admin/Settings/Page.php:1061 -msgid "Image Dimensions" -msgstr "Dimensions de l'image" +#. translators: %s = CloudFare API return message. +#: inc/deprecated/3.5.php:587 +msgid "WP Rocket: %s" +msgstr "WP Rocket : %s" -#: inc/Engine/Admin/Settings/Page.php:1064 -#, php-format -msgid "Add missing width and height attributes to images. Helps prevent layout shifts and improve the reading experience for your visitors. %1$sMore info%2$s" -msgstr "Ajoutez les attributs manquants de hauteur et largeur aux images. Ceci aide à prévenir les sauts de mise en page et améliorer l'expérience de lecture pour vos visiteurs. %1$sPlus d'info%2$s" +#: inc/deprecated/3.5.php:592 +msgid "WP Rocket: Cloudflare cache successfully purged." +msgstr "WP Rocket: Cache de Cloudflare purgé avec succès." -#: inc/Engine/Admin/Settings/Page.php:1083 -msgid "Enable for images" -msgstr "Activer pour les images" +#: inc/deprecated/3.5.php:858 inc/Engine/HealthCheck/HealthCheck.php:81 +msgid "" +"The following scheduled event failed to run. This may indicate the CRON " +"system is not running properly, which can prevent some WP Rocket features " +"from working as intended:" +msgid_plural "" +"The following scheduled events failed to run. This may indicate the CRON " +"system is not running properly, which can prevent some WP Rocket features " +"from working as intended:" +msgstr[0] "" +"L'évènement planifié suivant n'a pas fonctionné. Ceci pourrait indiquer que " +"le système CRON ne fonctionne pas correctement, ce qui peut prévenir " +"certaines fonctionnalités WP Rocket de fonctionner tel que prévu :" +msgstr[1] "" +"Les évènements planifiés suivants n'ont pas fonctionné. Ceci pourrait " +"indiquer que le système CRON ne fonctionne pas correctement, ce qui peut " +"prévenir certaines fonctionnalités WP Rocket de fonctionner tel que prévu :" +msgstr[2] "" +"Les évènements planifiés suivants n'ont pas fonctionné. Ceci pourrait " +"indiquer que le système CRON ne fonctionne pas correctement, ce qui peut " +"prévenir certaines fonctionnalités WP Rocket de fonctionner tel que prévu :" + +#: inc/deprecated/3.5.php:867 inc/Engine/HealthCheck/HealthCheck.php:88 +msgid "Please contact your host to check if CRON is working." +msgstr "" +"Veuillez contacter votre hébergeur afin de valider si le CRON est " +"fonctionnel." -#: inc/Engine/Admin/Settings/Page.php:1095 -#, php-format -msgid "LazyLoad for images is currently activated in %2$s. If you want to use %1$s’s LazyLoad, disable this option in %2$s." -msgstr "LazyLoad pour les images est présentement activé dans %2$s. Si vous désirez utiliser le LazyLoad de %1$s, désactivez cette option dans %2$s." +#: inc/deprecated/3.10.php:163 +msgid "OPcache purge failed." +msgstr "La purge de OpCache a échoué." -#: inc/Engine/Admin/Settings/Page.php:1103 -msgid "Enable for iframes and videos" -msgstr "Activer pour les iframes et vidéos" +#: inc/deprecated/3.10.php:168 +msgid "OPcache successfully purged" +msgstr "OpCache purgé avec succès" -#: inc/Engine/Admin/Settings/Page.php:1118 -msgid "Replace YouTube iframe with preview image" -msgstr "Remplacer l'iframe YouTube par une image d'aperçu" +#: inc/deprecated/3.11.php:81 +msgid "Yoast SEO XML sitemap" +msgstr "Sitemap XML Yoast SEO" -#: inc/Engine/Admin/Settings/Page.php:1120 -#, php-format -msgid "Replace YouTube iframe with preview image is not compatible with %2$s." -msgstr "Le remplacement du iFrame YouTube par une image d'aperçu n'est pas compatible avec %2$s." +#. translators: %s = Name of the plugin. +#. translators: %s = plugin name, e.g. Yoast SEO. +#: inc/deprecated/3.11.php:83 inc/deprecated/3.12.php:58 +#: inc/deprecated/3.12.php:87 inc/deprecated/3.12.php:186 +#: inc/deprecated/3.12.php:253 inc/deprecated/3.12.php:342 +msgid "" +"We automatically detected the sitemap generated by the %s plugin. You can " +"check the option to preload it." +msgstr "" +"Nous avons automatiquement détecté le sitemap généré par l'extension %s. " +"Vous pouvez cocher l'option pour l'inclure dans le préchargement." -#: inc/Engine/Admin/Settings/Page.php:1120 -msgid "This can significantly improve your loading time if you have a lot of YouTube videos on a page." -msgstr "Ceci peut considérablement améliorer votre vitesse de chargement si vous avez beaucoup de vidéos YouTube sur une page." +#. translators: 1 and 3 are link openings, 2 is a link closing. +#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:514 +msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" +msgstr "" +"%1$sRetourner à WP Rocket%2$s ou %3$saller à la page des extensions%2$s" -#: inc/Engine/Admin/Settings/Page.php:1135 -msgid "Excluded images or iframes" -msgstr "Exclure les images ou iFrames" +#: inc/deprecated/3.12.php:56 +msgid "All in One SEO XML sitemap" +msgstr "Sitemap XML All in One SEO" -#: inc/Engine/Admin/Settings/Page.php:1137 -#, php-format -msgid "Specify keywords (e.g. image filename, CSS class, domain) from the image or iframe code to be excluded (one per line). %1$sMore info%2$s" -msgstr "Spécifiez les mots-clés (ie. nom de fichier d'image, classe CSS, nom de domaine) de l'image ou du code iFrame à être exclu (un par ligne). %1$sPlus d'info%2$s" +#: inc/deprecated/3.12.php:85 +msgid "Rank Math XML sitemap" +msgstr "Sitemap XML de Rank Math" -#: inc/Engine/Admin/Settings/Page.php:1145 -msgid "Add missing image dimensions" -msgstr "Ajouter les dimensions manquantes de l'image" +#: inc/deprecated/3.12.php:184 +msgid "SEOPress XML sitemap" +msgstr "Sitemap XML SEOPress" -#: inc/Engine/Admin/Settings/Page.php:1164 -#: inc/deprecated/deprecated.php:1776 -msgid "Preload" -msgstr "Préchargement" +#: inc/deprecated/3.12.php:251 +msgid "The SEO Framework XML sitemap" +msgstr "Le sitemap XML de The SEO Framework" -#: inc/Engine/Admin/Settings/Page.php:1165 -msgid "Generate cache files, preload fonts" -msgstr "Générer les fichiers de cache, précharger les fontes" +#: inc/deprecated/3.12.php:332 +msgid "Jetpack XML Sitemaps" +msgstr "Sitemaps XML Jetpack" -#: inc/Engine/Admin/Settings/Page.php:1177 -msgid "Preload Cache" -msgstr "Précharger la cache" +#: inc/deprecated/3.12.php:334 +msgid "Preload the sitemap from the Jetpack plugin" +msgstr "Précharger le sitemap de l'extension Jetpack" -#: inc/Engine/Admin/Settings/Page.php:1180 -msgid "When you enable preloading WP Rocket will automatically detect your sitemaps and save all URLs to the database. The plugin will make sure that your cache is always preloaded." -msgstr "Lorsque vous activez le préchargement, WP Rocket détecte automatiquement vos sitemaps et enregistre toutes les URLs dans la base de données. L'extension s'assurera que votre cache est toujours préchargé." +#: inc/deprecated/3.15.php:28 +#: inc/Engine/Admin/Metaboxes/PostEditOptionsSubscriber.php:74 +msgid "WP Rocket Options" +msgstr "Options WP Rocket" -#: inc/Engine/Admin/Settings/Page.php:1188 -msgid "Preload Links" -msgstr "Précharger les liens" +#: inc/deprecated/3.15.php:57 views/metaboxes/post_edit_options.php:19 +msgid "Never cache this page" +msgstr "Ne jamais mettre en cache cette page" -#: inc/Engine/Admin/Settings/Page.php:1191 -#, php-format -msgid "Link preloading improves the perceived load time by downloading a page when a user hovers over the link. %1$sMore info%2$s" -msgstr "Le pré-chargement de liens améliore la perception du temps de chargement du site en téléchargeant une page lorsque l'usager survole un hyperlien. %1$sPlus d'info%2$s" +#: inc/deprecated/3.15.php:61 views/metaboxes/post_edit_options.php:23 +msgid "Activate these options on this post:" +msgstr "Activer ces options sur cette page :" -#: inc/Engine/Admin/Settings/Page.php:1199 -msgid "Prefetch DNS Requests" -msgstr "Préchargement des requêtes DNS" +#. translators: %s is the name of the option. +#: inc/deprecated/3.15.php:81 +#: inc/Engine/Admin/Metaboxes/PostEditOptionsSubscriber.php:121 +msgid "Activate first the %s option." +msgstr "Activer d’abord l’option de %s." -#: inc/Engine/Admin/Settings/Page.php:1201 -msgid "DNS prefetching can make external files load faster, especially on mobile networks" -msgstr "Le préchargement des requêtes DNS peut permettre aux ressources externes de charger plus rapidement, surtout sur les réseaux mobiles." +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. +#: inc/deprecated/3.15.php:97 views/metaboxes/post_edit_options.php:38 +msgid "" +"%1$sNote:%2$s None of these options will be applied if this post has been " +"excluded from cache in the global cache settings." +msgstr "" +"%1$sNote:%2$s Aucune de ces options ne sera appliquée à ce contenu s'il a " +"été exclu des paramètres globaux de gestion du cache." -#: inc/Engine/Admin/Settings/Page.php:1206 -msgid "Preload Fonts" -msgstr "Précharger les fontes" +#: inc/deprecated/deprecated.php:240 +msgid "JS files with Deferred Loading JavaScript" +msgstr "Fichiers JS en chargement différé du JavaScript" -#: inc/Engine/Admin/Settings/Page.php:1209 -#, php-format -msgid "Improves performance by helping browsers discover fonts in CSS files. %1$sMore info%2$s" -msgstr "Améliore les performances en aidant les navigateurs à découvrir les fontes dans les ficheirs CSS. %1$sPlus d'info%2$s" +#: inc/deprecated/deprecated.php:293 +msgid "Add URL" +msgstr "Ajouter un URL" -#: inc/Engine/Admin/Settings/Page.php:1223 -msgid "Activate Preloading" -msgstr "Activer le pré-chargement" +#: inc/deprecated/deprecated.php:1245 +#: inc/Engine/Admin/Settings/Settings.php:451 +msgid "Settings saved." +msgstr "Réglages sauvegardés." -#: inc/Engine/Admin/Settings/Page.php:1234 -msgid "Exclude URLs" -msgstr "URLs à exclure" +#: inc/deprecated/deprecated.php:1277 views/settings/fields/import-form.php:22 +msgid "" +"Before you can upload your import file, you will need to fix the following " +"error:" +msgstr "" +"Avant de pouvoir envoyer votre fichier d’import, vous devez régler l’erreur " +"suivante :" -#: inc/Engine/Admin/Settings/Page.php:1239 -#, php-format -msgid "Specify URLs to be excluded from the preload feature (one per line). %1$sMore info%2$s" -msgstr "Indiquez les URL à exclure du préchargement (une par ligne). %1$sPlus d'infos%2$s" +#. translators: %s is the maximum upload size set on the current server. +#: inc/deprecated/deprecated.php:1288 views/settings/fields/import-form.php:35 +msgid "Choose a file from your computer (maximum size: %s)" +msgstr "Choisissez un fichier de votre ordinateur (poids maximum : %s)" -#: inc/Engine/Admin/Settings/Page.php:1250 -msgid "URLs to prefetch" -msgstr "URLs à précharger" +#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:469 +msgid "Upload file and import settings" +msgstr "Envoyer le fichier et importer les réglages" -#: inc/Engine/Admin/Settings/Page.php:1251 -msgid "Specify external hosts to be prefetched (no http:, one per line)" -msgstr "Indiquez les hôtes externes à précharger (sans http:, un par ligne)" +#: inc/deprecated/deprecated.php:1385 +msgid "Your Cloudflare credentials are valid." +msgstr "Vos accès Cloudflare sont valides." -#: inc/Engine/Admin/Settings/Page.php:1260 -msgid "Fonts to preload" -msgstr "Fontes à précharger" +#: inc/deprecated/deprecated.php:1389 +msgid "Your Cloudflare credentials are invalid!" +msgstr "Vos accès Cloudflare sont invalides!" -#: inc/Engine/Admin/Settings/Page.php:1261 -msgid "Specify urls of the font files to be preloaded (one per line). Fonts must be hosted on your own domain, or the domain you have specified on the CDN tab." -msgstr "Spécifiez les URLs des fichiers de fontes à être pré-chargées (un par ligne). Les fontes doivent être hébergées sur votre propre domaine, ou le domaine spécifié dans l'onglet CDN." +#: inc/deprecated/deprecated.php:1453 +msgid "Save and optimize" +msgstr "Sauvegarder et optimiser" -#: inc/Engine/Admin/Settings/Page.php:1262 -msgid "The domain part of the URL will be stripped automatically.
Allowed font extensions: otf, ttf, svg, woff, woff2." -msgstr "La portion domaine de l'URL sera retirée automatiquement.
Extensions de fontes permises : otf, ttf, svg, woff, woff2." +#: inc/deprecated/deprecated.php:1453 +msgid "Optimize" +msgstr "Optimiser" -#: inc/Engine/Admin/Settings/Page.php:1271 -msgid "Enable link preloading" -msgstr "Activer le préchargement des liens" +#: inc/deprecated/deprecated.php:1464 inc/deprecated/deprecated.php:1666 +msgctxt "screen-reader-text" +msgid "Note:" +msgstr "Note :" -#: inc/Engine/Admin/Settings/Page.php:1290 -msgid "Advanced Rules" -msgstr "Règles avancées" +#: inc/deprecated/deprecated.php:1470 +msgctxt "screen-reader-text" +msgid "Performance tip:" +msgstr "Truc de performance :" -#: inc/Engine/Admin/Settings/Page.php:1291 -msgid "Fine-tune cache rules" -msgstr "Affiner les règles du cache" +#: inc/deprecated/deprecated.php:1476 +msgctxt "screen-reader-text" +msgid "Third-party feature detected:" +msgstr "Autre fonctionnalité détectée :" -#: inc/Engine/Admin/Settings/Page.php:1302 -msgid "Sensitive pages like custom login/logout URLs should be excluded from cache." -msgstr "Les pages sensibles telles que les URLs de connexion / déconnexion personnalisés doivent être exclus du cache." +#: inc/deprecated/deprecated.php:1488 inc/deprecated/deprecated.php:1672 +msgctxt "screen-reader-text" +msgid "Warning:" +msgstr "Attention : " -#: inc/Engine/Admin/Settings/Page.php:1305 -msgctxt "plugin name" -msgid "WooCommerce" -msgstr "WooCommerce" +#: inc/deprecated/deprecated.php:1501 +msgctxt "button text" +msgid "Download settings" +msgstr "Télécharger les réglages" -#: inc/Engine/Admin/Settings/Page.php:1307 -msgctxt "plugin name" -msgid "Easy Digital Downloads" -msgstr "Easy Digital Downloads" +#: inc/deprecated/deprecated.php:1531 +msgid "Replace site's hostname with:" +msgstr "Remplacer le nom d’hôte du site par :" -#: inc/Engine/Admin/Settings/Page.php:1309 -msgctxt "plugin name" -msgid "iThemes Exchange" -msgstr "iThemes Exchange" +#: inc/deprecated/deprecated.php:1550 inc/deprecated/deprecated.php:1587 +#: inc/deprecated/deprecated.php:1615 views/settings/fields/cnames.php:41 +#: views/settings/fields/cnames.php:75 views/settings/fields/cnames.php:105 +msgid "reserved for" +msgstr "réservé pour" -#: inc/Engine/Admin/Settings/Page.php:1311 -msgctxt "plugin name" -msgid "Jigoshop" -msgstr "Jigoshop" +#: inc/deprecated/deprecated.php:1552 inc/deprecated/deprecated.php:1589 +#: inc/deprecated/deprecated.php:1617 views/settings/fields/cnames.php:44 +#: views/settings/fields/cnames.php:78 views/settings/fields/cnames.php:108 +msgid "All files" +msgstr "Tous les fichiers" -#: inc/Engine/Admin/Settings/Page.php:1313 -msgctxt "plugin name" -msgid "WP-Shop" -msgstr "WP-Shop" +#: inc/deprecated/deprecated.php:1564 inc/deprecated/deprecated.php:1594 +#: inc/deprecated/deprecated.php:1622 views/settings/fields/cnames.php:56 +#: views/settings/fields/cnames.php:90 views/settings/fields/cnames.php:120 +msgid "Images" +msgstr "Images" -#: inc/Engine/Admin/Settings/Page.php:1319 -#, php-format -msgid "
Cart, checkout and \"my account\" pages set in %1$s%2$s%3$s will be detected and never cached by default." -msgstr "
Les pages panier, commande et \"mon compte\" réglées dans %1$s%2$s%3$s seront automatiquement détectées et exclues du cache par défaut." +#: inc/deprecated/deprecated.php:1635 views/settings/fields/cnames.php:132 +msgid "Add CNAME" +msgstr "Ajouter un CNAME" -#: inc/Engine/Admin/Settings/Page.php:1329 -#: inc/admin/options.php:129 -msgid "Never Cache URL(s)" -msgstr "Ne jamais mettre en cache ces URL(s)" +#: inc/deprecated/deprecated.php:1706 +msgid "Watch the video" +msgstr "Voir la vidéo" -#: inc/Engine/Admin/Settings/Page.php:1337 -msgid "Never Cache Cookies" -msgstr "Ne jamais mettre en cache ces témoins" +#: inc/deprecated/deprecated.php:1771 +msgid "Basic" +msgstr "Base" -#: inc/Engine/Admin/Settings/Page.php:1343 -#: inc/admin/options.php:130 -msgid "Never Cache User Agent(s)" -msgstr "Ne jamais mettre en cache ces agents utilisateurs" +#: inc/deprecated/deprecated.php:1772 +msgid "Static Files" +msgstr "Fichiers statiques" -#: inc/Engine/Admin/Settings/Page.php:1349 -#: inc/admin/options.php:131 -msgid "Always Purge URL(s)" -msgstr "Toujours purger ces URL(s)" +#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 +#: inc/Engine/CDN/Admin/Subscriber.php:28 +msgid "CDN" +msgstr "CDN" -#: inc/Engine/Admin/Settings/Page.php:1355 -msgid "Cache Query String(s)" -msgstr "Cacher les “Query String(s)”" +#: inc/deprecated/deprecated.php:1774 +msgid "Advanced" +msgstr "Avancé" -#: inc/Engine/Admin/Settings/Page.php:1358 -#, php-format -msgid "%1$sCache for query strings%2$s enables you to force caching for specific GET parameters." -msgstr "%1$sCacher les “Query Strings”%2$s vous permet de forcer la mise en cache de paramètres GET spécifiques." +#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1319 +msgid "Database" +msgstr "Base de données" -#: inc/Engine/Admin/Settings/Page.php:1369 -msgid "Specify URLs of pages or posts that should never be cached (one per line)" -msgstr "Indiquez les URLs des pages ou articles qui doivent être exclus de la mise en cache (un par ligne)" +#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1025 +msgid "Preload" +msgstr "Préchargement" -#: inc/Engine/Admin/Settings/Page.php:1370 -#: inc/Engine/Admin/Settings/Page.php:1398 -msgid "The domain part of the URL will be stripped automatically.
Use (.*) wildcards to address multiple URLs under a given path." -msgstr "Le nom de domaine sera supprimé automatiquement de l'URL .
Utilisez les expressions régulières (.*) pour exclure plusieurs URLs pour un chemin donné." +#: inc/deprecated/deprecated.php:1786 +#: inc/Engine/Admin/Settings/Subscriber.php:173 +#: views/settings/page-sections/tools.php:33 +msgid "Tools" +msgstr "Outils" -#: inc/Engine/Admin/Settings/Page.php:1379 -msgid "Specify full or partial IDs of cookies that, when set in the visitor's browser, should prevent a page from getting cached (one per line)" -msgstr "Spécifiez les IDs complets ou partiels de témoins qui, lorsque définis dans le navigateur du visiteur, devraient prévenir une page d'être mise en cache (un par ligne)." +#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 +#: views/settings/page-sections/dashboard.php:81 +msgid "License" +msgstr "Licence" -#: inc/Engine/Admin/Settings/Page.php:1387 -msgid "Specify user agent strings that should never see cached pages (one per line)" -msgstr "Indiquez les chaînes des agents utilisateurs qui ne devraient jamais voir les pages mises en cache (une par ligne)" +#. Translators: %1$s = Plugin name, %2$s = Plugin version, %3$s = PHP version +#. required. +#: inc/deprecated/deprecated.php:1944 +msgid "" +"%1$s %2$s requires at least PHP %3$s to function properly. To use this " +"version, please ask your web host how to upgrade your server to PHP %3$s or " +"higher. If you are not able to upgrade, you can rollback to the previous " +"version by using the button below." +msgstr "" +"%1$s %2$s requiert au moins PHP %3$s pour fonctionner correctement. Pour " +"utiliser cette version, demandez à votre hébergeur de mettre à jour votre " +"serveur vers PHP %3$s ou plus. Si cette mise-à-jour n'est pas possible, vous" +" pouvez revenir à la version précédente en utilisant le bouton ci-dessous." -#: inc/Engine/Admin/Settings/Page.php:1388 -msgid "Use (.*) wildcards to detect parts of UA strings." -msgstr "Utilisez les expressions régulières (.*) pour détecter les parties des chaînes des agents utilisateurs." +#. translators: 1: PHP class name, 2: version number, 3: replacement class +#. name. +#: inc/deprecated/DeprecatedClassTrait.php:54 +msgid "" +"The called class %1$s is deprecated since version %2$s! Use" +" %3$s instead." +msgstr "" +"La classe appelée %1$s est obsolète depuis la version %2$s!" +" Utilisez %3$s à la place." -#: inc/Engine/Admin/Settings/Page.php:1397 -msgid "Specify URLs you always want purged from cache whenever you update any post or page (one per line)" -msgstr "Indiquez les URLs dont vous voulez systématiquement vider le cache lorsque vous mettez à jour n'importe quel article ou page (une par ligne)" +#. translators: 1: PHP class name, 2: version number. +#: inc/deprecated/DeprecatedClassTrait.php:65 +msgid "" +"The called class %1$s is deprecated since version %2$s!" +msgstr "" +"La classe appelée %1$s est obsolète depuis la version %2$s!" -#: inc/Engine/Admin/Settings/Page.php:1406 -msgid "Specify query strings for caching (one per line)" -msgstr "Indiquez les “query strings” qui peuvent être mises en cache (une par ligne)" +#: inc/deprecated/Engine/Addon/FacebookTracking/Subscriber.php:92 +#: inc/deprecated/Engine/Addon/GoogleTracking/Subscriber.php:137 +#: inc/Engine/Admin/Database/Subscriber.php:79 +msgid "weekly" +msgstr "hebdomadaire" -#: inc/Engine/Admin/Settings/Page.php:1431 -#: inc/deprecated/deprecated.php:1775 -msgid "Database" -msgstr "Base de données" +#: inc/Engine/Admin/Database/Optimization.php:30 +#: inc/Engine/Admin/Settings/Page.php:1363 +msgid "Revisions" +msgstr "Révisions" -#: inc/Engine/Admin/Settings/Page.php:1432 -msgid "Optimize, reduce bloat" -msgstr "Optimiser & nettoyer" +#: inc/Engine/Admin/Database/Optimization.php:31 +#: inc/Engine/Admin/Settings/Page.php:1373 +msgid "Auto Drafts" +msgstr "Brouillons automatiques" -#: inc/Engine/Admin/Settings/Page.php:1439 -msgid "Post Cleanup" -msgstr "Nettoyage des contenus" +#: inc/Engine/Admin/Database/Optimization.php:32 +#: inc/Engine/Admin/Settings/Page.php:1383 +msgid "Trashed Posts" +msgstr "Contenus dans la corbeille" -#: inc/Engine/Admin/Settings/Page.php:1441 -msgid "Post revisions and drafts will be permanently deleted. Do not use this option if you need to retain revisions or drafts." -msgstr "Les révisions et les brouillons seront supprimés définitivement. N'utilisez pas cette option si vous devez conserver vos révisions et brouillons." +#: inc/Engine/Admin/Database/Optimization.php:33 +#: inc/Engine/Admin/Settings/Page.php:1393 +msgid "Spam Comments" +msgstr "Commentaires indésirables" -#: inc/Engine/Admin/Settings/Page.php:1446 -msgid "Comments Cleanup" -msgstr "Nettoyage des commentaires" +#: inc/Engine/Admin/Database/Optimization.php:34 +#: inc/Engine/Admin/Settings/Page.php:1403 +msgid "Trashed Comments" +msgstr "Commentaires à la corbeille" -#: inc/Engine/Admin/Settings/Page.php:1448 -msgid "Spam and trashed comments will be permanently deleted." -msgstr "Les Spams et les commentaires mis à la corbeille seront supprimés" +#: inc/Engine/Admin/Database/Optimization.php:35 +msgid "Transients" +msgstr "Transients" -#: inc/Engine/Admin/Settings/Page.php:1452 -msgid "Transients Cleanup" -msgstr "Nettoyage des transients" +#: inc/Engine/Admin/Database/Optimization.php:36 +msgid "Tables" +msgstr "Tables" -#: inc/Engine/Admin/Settings/Page.php:1454 -msgid "Transients are temporary options; they are safe to remove. They will be automatically regenerated as your plugins require them." -msgstr "Les “transients” sont des options temporaires, leur suppression est sans danger. Elles seront automatiquement régénérées si vos extensions en ont besoin." +#: inc/Engine/Admin/Database/Subscriber.php:85 +msgid "monthly" +msgstr "mensuel" -#: inc/Engine/Admin/Settings/Page.php:1458 -msgid "Database Cleanup" -msgstr "Nettoyage de la base de données" +#: inc/Engine/Admin/Database/Subscriber.php:194 +msgid "Database optimization process is running" +msgstr "L'optimisation de la base de données est en cours" -#: inc/Engine/Admin/Settings/Page.php:1460 -msgid "Reduces overhead of database tables" -msgstr "Récupère l’espace inutilisé des tables de la base de données" +#: inc/Engine/Admin/Database/Subscriber.php:224 +msgid "" +"Database optimization process is complete. Everything was already optimized!" +msgstr "" +"L'optimisation de la base de donnée est terminée. Tout était déjà optimisé!" -#: inc/Engine/Admin/Settings/Page.php:1464 -msgid "Automatic Cleanup" -msgstr "Nettoyage automatique" +#: inc/Engine/Admin/Database/Subscriber.php:227 +msgid "" +"Database optimization process is complete. List of optimized items below:" +msgstr "" +"L'optimisation de la base de donnée est terminée. Voici la liste des " +"optimisations effectuées :" -#: inc/Engine/Admin/Settings/Page.php:1477 -#, php-format -msgid "%s revision in your database." -msgid_plural "%s revisions in your database." -msgstr[0] "%s révision dans votre base de données." -msgstr[1] "%s révisions dans votre base de données." -msgstr[2] "%s révisions dans votre base de données." +#. translators: %1$d = number of items optimized, %2$s = type of optimization +#: inc/Engine/Admin/Database/Subscriber.php:235 +msgid "%1$d %2$s optimized." +msgstr "%1$d %2$s optimisé(s)." -#: inc/Engine/Admin/Settings/Page.php:1487 -#, php-format -msgid "%s draft in your database." -msgid_plural "%s drafts in your database." -msgstr[0] "%s brouillon dans votre base de données." -msgstr[1] "%s brouillons dans votre base de données." -msgstr[2] "%s brouillons dans votre base de données." +#. translators: %1$s = , %2$s = , %3$s = , %4$s = . +#: inc/Engine/Admin/DomainChange/Subscriber.php:143 +msgid "" +"%1$sWP Rocket:%2$s We detected that the website domain has changed. The " +"configuration files must be regenerated for the page cache and all other " +"optimizations to work as intended. %3$sLearn More%4$s" +msgstr "" +"%1$sWP Rocket :%2$s Nous avons détecté que le nom de domaine a changé. Les " +"fichiers de configuration doivent être regénérés pour que le cache des pages" +" et les autres optimisations fonctionnent comme prévu. %3$sEn savoir " +"plus%4$s" -#: inc/Engine/Admin/Settings/Page.php:1497 -#, php-format -msgid "%s trashed post in your database." -msgid_plural "%s trashed posts in your database." -msgstr[0] "%s articles à la corbeille dans votre base de données." -msgstr[1] "%sarticles à la corbeille dans votre base de données." -msgstr[2] "%sarticles à la corbeille dans votre base de données." +#: inc/Engine/Admin/DomainChange/Subscriber.php:171 +msgid "Regenerate WP Rocket configuration files now" +msgstr "Regénérer les fichiers de configuration de WP Rocket maintenant" -#: inc/Engine/Admin/Settings/Page.php:1507 -#, php-format -msgid "%s spam comment in your database." -msgid_plural "%s spam comments in your database." -msgstr[0] "%s commentaire de SPAM dans votre base de données." -msgstr[1] "%s commentaires de SPAM dans votre base de données." -msgstr[2] "%s commentaires de SPAM dans votre base de données." +#: inc/Engine/Admin/Settings/Page.php:222 +msgid "Save Changes" +msgstr "Enregistrer les modifications" -#: inc/Engine/Admin/Settings/Page.php:1517 -#, php-format -msgid "%s trashed comment in your database." -msgid_plural "%s trashed comments in your database." -msgstr[0] "%s commentaire à la corbeille dans votre base de données." -msgstr[1] "%s commentaires à la corbeille dans votre base de données." -msgstr[2] "%s commentaires à la corbeille dans votre base de données." +#: inc/Engine/Admin/Settings/Page.php:222 +msgid "Validate License" +msgstr "Valider la licence" -#: inc/Engine/Admin/Settings/Page.php:1525 -msgid "All transients" -msgstr "Tous les transients" +#: inc/Engine/Admin/Settings/Page.php:278 +#: inc/Engine/Admin/Settings/Page.php:279 inc/functions/admin.php:550 +msgid "Unavailable" +msgstr "Indisponible" -#: inc/Engine/Admin/Settings/Page.php:1527 -#, php-format -msgid "%s transient in your database." -msgid_plural "%s transients in your database." -msgstr[0] "%s transient dans votre base de données." -msgstr[1] "%s transients dans votre base de données." -msgstr[2] "%s transients dans votre base de données." +#: inc/Engine/Admin/Settings/Page.php:385 +msgid "API key" +msgstr "Clé d’API" -#: inc/Engine/Admin/Settings/Page.php:1535 -msgid "Optimize Tables" -msgstr "Optimiser les tables" +#: inc/Engine/Admin/Settings/Page.php:400 +msgid "Email address" +msgstr "Adresse courriel" -#: inc/Engine/Admin/Settings/Page.php:1537 -#, php-format -msgid "%s table to optimize in your database." -msgid_plural "%s tables to optimize in your database." -msgstr[0] "%s table à optimiser dans votre base de données." -msgstr[1] "%s tables à optimiser dans votre base de données." -msgstr[2] "%s tables à optimiser dans votre base de données." +#: inc/Engine/Admin/Settings/Page.php:426 +msgid "Dashboard" +msgstr "Tableau de bord" -#: inc/Engine/Admin/Settings/Page.php:1548 -msgid "Schedule Automatic Cleanup" -msgstr "Planifier le nettoyage automatique" +#: inc/Engine/Admin/Settings/Page.php:427 +msgid "Get help, account info" +msgstr "Aide, info du compte" -#: inc/Engine/Admin/Settings/Page.php:1560 -msgid "Frequency" -msgstr "Fréquence" +#: inc/Engine/Admin/Settings/Page.php:475 +msgid "File Optimization" +msgstr "Optimisation des fichiers" -#: inc/Engine/Admin/Settings/Page.php:1568 -msgid "Daily" -msgstr "Quotidien" +#: inc/Engine/Admin/Settings/Page.php:476 +msgid "Optimize CSS & JS" +msgstr "Optimiser le CSS et le JS" -#: inc/Engine/Admin/Settings/Page.php:1569 -msgid "Weekly" -msgstr "Hebdomadaire" +#. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP +#. Rocket”. +#: inc/Engine/Admin/Settings/Page.php:484 +msgid "" +"%1$s Minification is currently activated in Autoptimize. If" +" you want to use %2$s’s minification, disable this option in Autoptimize." +msgstr "" +"La minification %1$s est actuellement activée dans " +"Autoptimize. Si vous souhaitez utiliser la minification de " +"%2$s, désactivez ces options dans Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:1570 -msgid "Monthly" -msgstr "Mensuel" +#: inc/Engine/Admin/Settings/Page.php:494 +msgid "CSS Files" +msgstr "Fichiers CSS" -#: inc/Engine/Admin/Settings/Page.php:1586 -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/admin/ui/meta-boxes.php:108 -#: inc/deprecated/deprecated.php:1773 -msgid "CDN" -msgstr "CDN" +#: inc/Engine/Admin/Settings/Page.php:503 +msgid "JavaScript Files" +msgstr "Fichiers JavaScript" -#: inc/Engine/Admin/Settings/Page.php:1587 -msgid "Integrate your CDN" -msgstr "Intégrer votre CDN" +#. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP +#. Rocket”. +#: inc/Engine/Admin/Settings/Page.php:510 +msgid "" +"%1$s Minification is currently activated in Autoptimize. If" +" you want to use %2$s’s minification, disable those options in Autoptimize." +msgstr "" +"La minification %1$s est actuellement activée dans " +"Autoptimize. Si vous souhaitez utiliser la minification de " +"%2$s, désactivez ces options dans Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:1599 -msgid "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s) you provide." -msgstr "Tous les URLs de vos fichiers statiques (CSS, JS, images) seront ré-écrits avec le CNAME fourni." +#: inc/Engine/Admin/Settings/Page.php:515 +msgid "" +"If you have problems after activating this option, copy and paste the " +"default exclusions to quickly resolve issues:" +msgstr "" +"Si vous rencontrez des problèmes après avoir activé cette option, copiez et " +"collez les exclusions par défaut pour résoudre rapidement les problèmes :" -#: inc/Engine/Admin/Settings/Page.php:1601 -#, php-format -msgid "Not required for services like Cloudflare and Sucuri. Please see our available %1$sAdd-ons%2$s." -msgstr "Non requis pour les services tels que Cloudflare et Sucuri. Veuillez consulter nos %1$sAjouts%2$s disponibles." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:519 +msgid "" +"Also, please check our %1$sdocumentation%2$s for a list of compatibility " +"exclusions." +msgstr "" +"Veuillez également consulter notre %1$sdocumentation%2$s pour une liste " +"d'exclusions de compatibilité." -#: inc/Engine/Admin/Settings/Page.php:1616 -#: inc/admin/options.php:132 -msgid "Exclude files from CDN" -msgstr "Exclure des fichiers du CDN" +#: inc/Engine/Admin/Settings/Page.php:524 +msgid "" +"Internal scripts are excluded by default to prevent issues. Remove them to " +"take full advantage of this option." +msgstr "" +"Les scripts internes sont exclus par défaut pour éviter tout problème. " +"Supprimez-les pour profiter pleinement de cette option." -#: inc/Engine/Admin/Settings/Page.php:1642 -msgid "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings is not required for %2$l to work on your site." -msgid_plural "%1$s%2$l Add-ons%3$s are currently enabled. Configuration of the CDN settings is not required for %2$l to work on your site." -msgstr[0] "%1$s%2$l Add-on%3$sest présentement activé. s. La configuration des réglages CDN n'est pas requise pour que %2$l fonctionne sur votre site." -msgstr[1] "%1$s%2$l Add-ons%3$s sont présentement activés. La configuration des réglages CDN n'est pas requise pour que %2$l fonctionne sur votre site." -msgstr[2] "%1$s%2$l Add-ons%3$s sont présentement activés. La configuration des réglages CDN n'est pas requise pour que %2$l fonctionne sur votre site." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:527 +msgid "" +"If this causes trouble, restore the default exclusions, found %1$shere%2$s" +msgstr "" +"En cas de problème, rétablissez les exclusions par défaut que vous trouverez" +" %1$sici%2$s" -#: inc/Engine/Admin/Settings/Page.php:1667 -msgid "Enable Content Delivery Network" -msgstr "Activer le Content Delivery Network." +#: inc/Engine/Admin/Settings/Page.php:536 +msgid "Minify CSS files" +msgstr "Minifier les fichiers CSS" -#: inc/Engine/Admin/Settings/Page.php:1676 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 -msgid "CDN CNAME(s)" -msgstr "CNAME(s) du CDN" +#: inc/Engine/Admin/Settings/Page.php:537 +msgid "Minify CSS removes whitespace and comments to reduce the file size." +msgstr "" +"Minifier le CSS supprime les espaces et les commentaires afin de réduire le " +"poids des fichiers." -#: inc/Engine/Admin/Settings/Page.php:1677 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 -msgid "Specify the CNAME(s) below" -msgstr "Indiquez le(s) CNAME(s) ci-dessous" +#: inc/Engine/Admin/Settings/Page.php:552 +msgid "" +"Specify URLs of CSS files to be excluded from minification (one per line)." +msgstr "" +"Indiquez l’URL des fichiers CSS à exclure de la minification (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:1684 -msgid "Specify URL(s) of files that should not get served via CDN (one per line)." -msgstr "Indiquez les URLs des fichiers qui ne doivent pas être servies par le CDN (une par ligne)." +#: inc/Engine/Admin/Settings/Page.php:553 +msgid "" +"Internal: The domain part of the URL will be stripped " +"automatically. Use (.*).css wildcards to exclude all CSS files located at a " +"specific path." +msgstr "" +"Interne : Le nom de domaine sera supprimé automatiquement " +"de l'URL. Utilisez les expressions régulières (.*).css afin d'exclure tous " +"les fichiers CSS pour un chemin donné." -#: inc/Engine/Admin/Settings/Page.php:1685 -msgid "The domain part of the URL will be stripped automatically.
Use (.*) wildcards to exclude all files of a given file type located at a specific path." -msgstr "Le nom de domaine sera supprimé automatiquement de l'URL .
Utilisez les expressions régulières (.*) pour exclure plusieurs URLs pour un chemin donné." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:555 +msgid "" +"3rd Party: Use either the full URL path or only the domain " +"name, to exclude external CSS. %1$sMore info%2$s" +msgstr "" +"Tierce-partie : Utilisez soit l'URL complet ou seulement le" +" nom de domaine afin d'exclure le CSS externe.. %1$sPlus d'info%2$s" -#: inc/Engine/Admin/Settings/Page.php:1708 -#: inc/Engine/Admin/Settings/Page.php:1716 -msgid "Heartbeat" -msgstr "Battement de coeur" +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 +msgid "Optimize CSS delivery" +msgstr "Optimiser le chargement du CSS" -#: inc/Engine/Admin/Settings/Page.php:1709 -msgid "Control WordPress Heartbeat API" -msgstr "Contrôler l'API du battement de coeur de WordPress" +#: inc/Engine/Admin/Settings/Page.php:573 +msgid "" +"Optimize CSS delivery eliminates render-blocking CSS on your website. Only " +"one method can be selected. Remove Unused CSS is recommended for optimal " +"performance, but limited only to the users with active license." +msgstr "" +"L'Optimisation du Chargement CSS élimine les CSS bloquant le rendu de votre " +"site Web. Une seule méthode peut être sélectionnée. La méthode Supprimer les" +" CSS inutilisés est recommandée pour des performances optimales." -#: inc/Engine/Admin/Settings/Page.php:1717 -msgid "Reducing or disabling the Heartbeat API’s activity can help save some of your server’s resources." -msgstr "Réduire ou désactiver l'API du signal de battement de coeur peut aider à économier des ressources serveur." +#: inc/Engine/Admin/Settings/Page.php:573 +msgid "" +"Optimize CSS delivery eliminates render-blocking CSS on your website. Only " +"one method can be selected. Remove Unused CSS is recommended for optimal " +"performance." +msgstr "" +"L'Optimisation du Chargement CSS élimine les CSS bloquant le rendu sur votre" +" site Web. Une seule méthode peut être sélectionnée. La méthode Supprimer " +"les CSS inutilisés est recommandée pour des performances optimales." -#: inc/Engine/Admin/Settings/Page.php:1723 -msgid "Reduce or disable Heartbeat activity" -msgstr "Réduire ou désactiver le signal de battement de coeur" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:583 +msgid "" +"Optimize CSS Delivery features are disabled on local environments. %1$sLearn" +" more%2$s" +msgstr "" +"Les options Optimiser le chargement CSS sont désactivées en local. %1$sEn " +"savoir plus%2$s" -#: inc/Engine/Admin/Settings/Page.php:1724 -msgid "Reducing activity will change Heartbeat frequency from one hit each minute to one hit every 2 minutes." -msgstr "Réduire l'activité changera la fréquence de battement de coeur de une pulsation par minute à une pulsation aux 2 minutes." +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" +msgstr "Supprimer les ressources CSS inutilisées (RUCSS)" -#: inc/Engine/Admin/Settings/Page.php:1724 -msgid "Disabling Heartbeat entirely may break plugins and themes using this API." -msgstr "Désactiver le battement de coeur complètement peut briser les extensions et thèmes utilisant cet API." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:606 +msgid "" +"Removes unused CSS per page and helps to reduce page size and HTTP requests." +" Recommended for best performance. Test thoroughly! %1$sMore info%2$s" +msgstr "" +"Supprime le CSS inutilisé par page et contribue à réduire la taille des " +"pages et les requêtes HTTP. Recommandé pour de meilleures performances. " +"Testez-le rigoureusement ! %1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1738 -msgid "Do not limit" -msgstr "Ne pas limiter" +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "Ceci pourrait briser des choses!" -#: inc/Engine/Admin/Settings/Page.php:1739 -msgid "Reduce activity" -msgstr "Réduire l'activité" +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "" +"If you notice any errors on your website after having activated this " +"setting, just deactivate it again, and your site will be back to normal." +msgstr "" +"Si vous remarquez des erreurs sur votre site après avoir activé cette " +"option, il vous suffit de la désactiver et votre site sera de retour à la " +"normale." -#: inc/Engine/Admin/Settings/Page.php:1740 -msgid "Disable" -msgstr "Désactiver" +#: inc/Engine/Admin/Settings/Page.php:610 +msgid "Activate Remove Unused CSS" +msgstr "Activer le retrait du CSS inutilisé" -#: inc/Engine/Admin/Settings/Page.php:1748 -msgid "Control Heartbeat" -msgstr "Contrôler le battement de coeur" +#: inc/Engine/Admin/Settings/Page.php:616 +msgid "CSS safelist" +msgstr "Liste sécuritaire CSS" -#: inc/Engine/Admin/Settings/Page.php:1757 -msgid "Behavior in backend" -msgstr "Comportement dans le tableau de bord" +#: inc/Engine/Admin/Settings/Page.php:617 +msgid "" +"Specify CSS filenames, IDs or classes that should not be removed (one per " +"line)." +msgstr "" +"Spécifiez les fichiers CSS, les IDs ou les classes qui ne devraient pas être" +" retirés (un par ligne)." -#: inc/Engine/Admin/Settings/Page.php:1764 -msgid "Behavior in post editor" -msgstr "Comportement dans l'éditeur" +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 +msgid "Load CSS asynchronously" +msgstr "Chargement asynchrone du CSS" -#: inc/Engine/Admin/Settings/Page.php:1770 -msgid "Behavior in frontend" -msgstr "Comportement sur le site" +#. translators: %1$s = plugin name. +#: inc/Engine/Admin/Settings/Page.php:635 +msgctxt "WP Critical CSS compatibility" +msgid "" +"Load CSS asynchronously is currently handled by the %1$s plugin. If you want" +" to use WP Rocket’s load CSS asynchronously option, disable the %1$s plugin." +msgstr "" +"Le Chargement asynchrone du CSS est actuellement géré par le plugin %1$s. Si" +" vous souhaitez utiliser l'option de chargement asynchrone du CSS de WP " +"Rocket, désactivez le plugin %1$s." -#: inc/Engine/Admin/Settings/Page.php:1787 -#: views/settings/page-sections/tutorials.php:39 -msgid "Add-ons" -msgstr "Ajouts" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:637 +msgid "" +"Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" +msgstr "" +"Génère le Critical Path CSS et charge les CSS de manière asynchrone. " +"%1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1788 -msgid "Add more features" -msgstr "Ajouter des fonctionnalités" +#: inc/Engine/Admin/Settings/Page.php:643 +msgid "Fallback critical CSS" +msgstr "CSS critique de secours" -#: inc/Engine/Admin/Settings/Page.php:1795 -msgid "One-click Rocket Add-ons" -msgstr "Ajouts Rockets en un clic" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:645 +msgid "" +"Provides a fallback if auto-generated critical path CSS is incomplete. " +"%1$sMore info%2$s" +msgstr "" +"Fournit une option de secours si le CSS critique auto-généré est " +"incomplet.%1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1796 -msgid "One-Click Add-ons are features extending available options without configuration needed. Switch the option \"on\" to enable from this screen." -msgstr "Les ajouts en un clic offrent des fonctionnalités complémentaires en augmentant les options déjà disponibles sans besoin de configuration. Mettez l'option à \"ON\" pour l'activer depuis cet écran." +#: inc/Engine/Admin/Settings/Page.php:660 +msgid "Minify JavaScript files" +msgstr "Minifier les fichiers JS" -#: inc/Engine/Admin/Settings/Page.php:1806 -msgid "Rocket Add-ons" -msgstr "Ajouts Rocket" +#: inc/Engine/Admin/Settings/Page.php:661 +msgid "" +"Minify JavaScript removes whitespace and comments to reduce the file size." +msgstr "" +"Minifier le JavaScript supprime les espace et les commentaires afin de " +"réduire le poids des fichiers." -#: inc/Engine/Admin/Settings/Page.php:1807 -msgid "Rocket Add-ons are complementary features extending available options." -msgstr "Les ajouts Rockets offrent des fonctionnalités complémentaires augmentant les options déjà disponibles." +#: inc/Engine/Admin/Settings/Page.php:675 +msgid "" +"Combine JavaScript files (Enable Minify JavaScript files to select)" +msgstr "" +"Combiner les fichiers JavaScript (activez la minification JavaScript " +"pour sélectionner)" -#: inc/Engine/Admin/Settings/Page.php:1817 -#: inc/Engine/Admin/Settings/Page.php:1986 -msgid "Cloudflare" -msgstr "Cloudflare" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:677 +msgid "" +"Combine JavaScript files combines your site’s internal, 3rd party and inline" +" JS reducing HTTP requests. Not recommended if your site uses HTTP/2. " +"%1$sMore info%2$s" +msgstr "" +"Combine vos fichiers JavaScript, les fichiers tiers et le inline JS en un " +"seul fichier, réduisant le nombre de requêtes HTTP. Ces réglages ne sont pas" +" recommandés si votre site utilise HTTP/2.%1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1823 -msgid "Integrate your Cloudflare account with this add-on." -msgstr "Intégrez votre compte Cloudflare avec cet add-on" +#: inc/Engine/Admin/Settings/Page.php:678 +msgid "" +"For compatibility and best results, this option is disabled when delay " +"javascript execution is enabled." +msgstr "" +"Pour assurer la compatibilité et obtenir de meilleurs résultats, cette " +"option est désactivée lorsque le délai du javascript est activé." -#: inc/Engine/Admin/Settings/Page.php:1824 -msgid "Provide your account email, global API key, and domain to use options such as clearing the Cloudflare cache and enabling optimal settings with WP Rocket." -msgstr "Entrez l’adresse courriel, la clé d’API globale et le domaine de votre compte Cloudflare afin d’ajouter l’option de purger le cache Cloudflare et activer les réglages optimaux pour fonctionner avec WP Rocket." +#: inc/Engine/Admin/Settings/Page.php:694 +msgid "Activate combine JavaScript" +msgstr "Activer la combinaison JavaScript" -#: inc/Engine/Admin/Settings/Page.php:1875 -msgid "Varnish" -msgstr "Varnish" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:701 +msgid "" +"Specify patterns of inline JavaScript to be excluded from concatenation (one" +" per line). %1$sMore info%2$s" +msgstr "" +"Indiquez les patterns du code JavaScript inline à exclure de la " +"concaténation (un par ligne).%1$sMore info%2$s" -#: inc/Engine/Admin/Settings/Page.php:1881 -msgid "If Varnish runs on your server, you must activate this add-on." -msgstr "Si votre serveur utilise Varnish, vous devez activer cet add-on" +#: inc/Engine/Admin/Settings/Page.php:718 +msgid "" +"Specify URLs of JavaScript files to be excluded from minification and " +"concatenation (one per line)." +msgstr "" +"Indiquez l’URL des fichiers JavaScript à exclure de la minification et de la" +" concaténation (une par ligne)" -#: inc/Engine/Admin/Settings/Page.php:1883 -#, php-format -msgid "Varnish cache will be purged each time WP Rocket clears its cache to ensure content is always up-to-date.
%1$sLearn more%2$s" -msgstr "Le cache Varnish sera purgé à chaque fois que WP Rocket purgera son cache pour vous assurer que le contenu soit toujours à jour.
%1$sEn savoir plus%2$s" +#: inc/Engine/Admin/Settings/Page.php:719 +msgid "" +"Internal: The domain part of the URL will be stripped " +"automatically. Use (.*).js wildcards to exclude all JS files located at a " +"specific path." +msgstr "" +"Interne :Le nom de domaine sera supprimé automatiquement de" +" l’URL. Utilisez les expressions régulières (.*).js afin d’exclure tous les " +"fichiers JS pour un chemin donné." -#: inc/Engine/Admin/Settings/Page.php:1918 -msgid "WebP Compatibility" -msgstr "Compatibilité WebP" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:721 +msgid "" +"3rd Party: Use either the full URL path or only the domain " +"name, to exclude external JS. %1$sMore info%2$s" +msgstr "" +"Tierce-partie : Utilisez soit l'URL complet ou seulement le" +" nom de domaine afin d'exclure le JS externe. %1$sPlus d'info%2$s" -#: inc/Engine/Admin/Settings/Page.php:1924 -msgid "Improve browser compatibility for WebP images." -msgstr "Améliore la compatibilité des navigateurs pour les images WebP." +#: inc/Engine/Admin/Settings/Page.php:737 +#: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 +msgid "Load JavaScript deferred" +msgstr "Charger les fichiers JavaScript en différé" -#: inc/Engine/Admin/Settings/Page.php:1928 -#, php-format -msgid "Enable this option if you would like WP Rocket to serve WebP images to compatible browsers. Please note that WP Rocket cannot create WebP images for you. To create WebP images we recommend %1$sImagify%2$s. %3$sMore info%2$s" -msgstr "Activez cette option si vous désirez que WP Rocket serve les images WebP au navigateurs compatibles. Veuillez noter que WP Rocket ne peut pas créer d'images WebP pour vous. Pour créez des images WebP nous recommandons %1$sImagify%2$s. %3$sPlus d'info %2$s" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:739 +msgid "" +"Load JavaScript deferred eliminates render-blocking JS on your site and can " +"improve load time. %1$sMore info%2$s" +msgstr "" +"Charger les fichiers JavaScript en différé élimine le blocage de l’affichage" +" de votre site dû au JS et peux améliorer le temps de chargement perçu. " +"%1$sPlus d'infos%2$s" -#: inc/Engine/Admin/Settings/Page.php:1948 -msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." -msgstr "Vider le cache Sucuri quand le cache de WP Rocket est vidé." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:752 +msgid "" +"Specify URLs or keywords of JavaScript files to be excluded from defer (one " +"per line). %1$sMore info%2$s" +msgstr "" +"Spécifiez les URLs ou mots-clés des fichiers JavaScript à être exclus du " +"chargement différé (un par ligne). %1$sPlus d'info%2$s" -#: inc/Engine/Admin/Settings/Page.php:1951 -msgid "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is cleared." -msgstr "Fournir votre clé d'API afin de vider le cache Sucuri quand le cache de WP Rocket sera vidé." +#: inc/Engine/Admin/Settings/Page.php:768 +#: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 +msgid "Delay JavaScript execution" +msgstr "Retarder l'exécution du JavaScript" -#: inc/Engine/Admin/Settings/Page.php:1959 -#: inc/Engine/Admin/Settings/Page.php:2103 -msgid "Sucuri" -msgstr "Sucuri" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:770 +msgid "" +"Improves performance by delaying the loading of JavaScript files until user " +"interaction (e.g. scroll, click). %1$sMore info%2$s" +msgstr "" +"Améliore les performances en retardant le chargement des fichiers JavaScript" +" jusqu'à une interaction de l'utilisateur (ie. défiler, cliquer). %1$sPlus " +"d'info%2$s" -#: inc/Engine/Admin/Settings/Page.php:1965 -msgid "Synchronize Sucuri cache with this add-on." -msgstr "Synchronisez le cache Sucuri avec cet add-on." +#: inc/Engine/Admin/Settings/Page.php:779 +msgid "One-click exclusions" +msgstr "Exclusions en un clic" -#: inc/Engine/Admin/Settings/Page.php:2003 -msgid "Cloudflare credentials" -msgstr "Accès Cloudflare" +#: inc/Engine/Admin/Settings/Page.php:780 +msgid "" +"When using the Delay JavaScript Execution, you might experience delay " +"loading elements located in the viewport that need to appear immediately - " +"e.g. slider, header, menu." +msgstr "" +"Lorsque vous utilisez l'option Reporter l’exécution du JavaScript, il se " +"peut que le chargement d'éléments qui doivent apparaître immédiatement soit " +"retardé - ex. : un slider, un en-tête, un menu." -#: inc/Engine/Admin/Settings/Page.php:2012 -msgid "Cloudflare settings" -msgstr "Réglages Cloudflare" +#: inc/Engine/Admin/Settings/Page.php:781 +msgid "" +"If you need instant visibility, click below on files that should NOT be " +"delayed. This selection will help users interact with the elements straight " +"away." +msgstr "" +"Si vous avez besoin d'une visibilité immédiate, cliquez ci-dessous sur les " +"fichiers qui ne doivent PAS être reportés. Cela permettra aux utilisateurs " +"d'interagir immédiatement avec ces éléments." -#: inc/Engine/Admin/Settings/Page.php:2026 -msgctxt "Cloudflare" -msgid "Global API key:" -msgstr "Clé d’API globale :" +#: inc/Engine/Admin/Settings/Page.php:798 +msgid "" +"Specify URLs or keywords that can identify inline or JavaScript files to be " +"excluded from delaying execution (one per line)." +msgstr "" +"Spécifiez les URLs ou mots-clés qui peuvent identifier le JavaScript en " +"ligne ou en fichiers à être exclus de l'exécution retardée (un par ligne)." -#: inc/Engine/Admin/Settings/Page.php:2027 -msgctxt "Cloudflare" -msgid "Find your API key" -msgstr "Trouver votre clé d’API" +#: inc/Engine/Admin/Settings/Page.php:830 +msgid "Media" +msgstr "Média" -#: inc/Engine/Admin/Settings/Page.php:2039 -msgctxt "Cloudflare" -msgid "Account email" -msgstr "Courriel du compte" +#: inc/Engine/Admin/Settings/Page.php:831 +msgid "LazyLoad, image dimensions" +msgstr "LazyLoad, dimensions des images" -#: inc/Engine/Admin/Settings/Page.php:2048 -msgctxt "Cloudflare" -msgid "Zone ID" -msgstr "Identifiant de zone" +#: inc/Engine/Admin/Settings/Page.php:840 +msgid "Autoptimize" +msgstr "Autoptimize" -#: inc/Engine/Admin/Settings/Page.php:2058 -msgid "Development mode" -msgstr "Mode développement" +#: inc/Engine/Admin/Settings/Page.php:894 +msgid "LazyLoad" +msgstr "Chargement différé" -#: inc/Engine/Admin/Settings/Page.php:2060 -#, php-format -msgid "Temporarily activate development mode on your website. This setting will automatically turn off after 3 hours. %1$sLearn more%2$s" -msgstr "Active temporairement le mode développement sur votre site. Ce réglage se désactivera automatiquement après 3 heures. %1$sEn savoir plus%2$s" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:897 +msgid "" +"It can improve actual and perceived loading time as images, iframes, and " +"videos will be loaded only as they enter (or about to enter) the viewport " +"and reduces the number of HTTP requests. %1$sMore Info%2$s" +msgstr "" +"Peut améliorer le temps de chargement réel et perçu car les images, iframes " +"et vidéos ne seront chargées que lorsqu'elles entreront (ou seront sur le " +"point d'entrer) dans la zone visible. Réduit le nombre de requêtes HTTP. " +"%1$sPlus d'informations.%2$s" -#: inc/Engine/Admin/Settings/Page.php:2068 -msgid "Optimal settings" -msgstr "Réglages optimaux" +#. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. +#: inc/Engine/Admin/Settings/Page.php:904 +msgid "" +"LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s " +"LazyLoad, disable this option in %2$s." +msgstr "" +"LazyLoad est présentement activé dans %2$s. Si vous désirez utiliser le " +"LazyLoad de WP Rocket, désactivez cette option dans %2$s." -#: inc/Engine/Admin/Settings/Page.php:2069 -msgid "Automatically enhances your Cloudflare configuration for speed, performance grade and compatibility." -msgstr "Améliore automatiquement votre configuration Cloudflare pour la rapidité de chargement, les notes de performance et la compatibilité." +#: inc/Engine/Admin/Settings/Page.php:907 +msgid "Image Dimensions" +msgstr "Dimensions de l'image" -#: inc/Engine/Admin/Settings/Page.php:2077 -msgid "Relative protocol" -msgstr "Relatif au protocole" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:910 +msgid "" +"Add missing width and height attributes to images. Helps prevent layout " +"shifts and improve the reading experience for your visitors. %1$sMore " +"info%2$s" +msgstr "" +"Ajoutez les attributs manquants de hauteur et largeur aux images. Ceci aide " +"à prévenir les sauts de mise en page et améliorer l'expérience de lecture " +"pour vos visiteurs. %1$sPlus d'info%2$s" + +#: inc/Engine/Admin/Settings/Page.php:929 +msgid "Enable for images" +msgstr "Activer pour les images" + +#. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. +#: inc/Engine/Admin/Settings/Page.php:941 +msgid "" +"LazyLoad for images is currently activated in %2$s. If you want to use " +"%1$s’s LazyLoad, disable this option in %2$s." +msgstr "" +"LazyLoad pour les images est présentement activé dans %2$s. Si vous désirez " +"utiliser le LazyLoad de %1$s, désactivez cette option dans %2$s." + +#: inc/Engine/Admin/Settings/Page.php:949 +msgid "Enable for CSS background images" +msgstr "Activer pour les images background CSS" + +#: inc/Engine/Admin/Settings/Page.php:964 +msgid "Enable for iframes and videos" +msgstr "Activer pour les iframes et vidéos" + +#: inc/Engine/Admin/Settings/Page.php:979 +msgid "Replace YouTube iframe with preview image" +msgstr "Remplacer l'iframe YouTube par une image d'aperçu" + +#. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. +#: inc/Engine/Admin/Settings/Page.php:981 +msgid "Replace YouTube iframe with preview image is not compatible with %2$s." +msgstr "" +"Le remplacement du iFrame YouTube par une image d'aperçu n'est pas " +"compatible avec %2$s." + +#. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. +#: inc/Engine/Admin/Settings/Page.php:981 +msgid "" +"This can significantly improve your loading time if you have a lot of " +"YouTube videos on a page." +msgstr "" +"Ceci peut considérablement améliorer votre vitesse de chargement si vous " +"avez beaucoup de vidéos YouTube sur une page." + +#: inc/Engine/Admin/Settings/Page.php:996 +msgid "Excluded images or iframes" +msgstr "Exclure les images ou iFrames" + +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:998 +msgid "" +"Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from" +" the image or iframe code to be excluded (one per line). %1$sMore info%2$s" +msgstr "" +"Indiquez les mots-clés (ex: nom de fichier image, classe CSS, domaine) des " +"images ou le code de l'iframe à exclure (une par ligne). %1$sPlus " +"d'infos%2$s" + +#: inc/Engine/Admin/Settings/Page.php:1006 +msgid "Add missing image dimensions" +msgstr "Ajouter les dimensions manquantes de l'image" + +#: inc/Engine/Admin/Settings/Page.php:1026 +msgid "Generate cache files, preload fonts" +msgstr "Générer les fichiers de cache, précharger les fontes" + +#: inc/Engine/Admin/Settings/Page.php:1038 +msgid "Preload Cache" +msgstr "Précharger la cache" + +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1041 +msgid "" +"When you enable preloading WP Rocket will automatically detect your sitemaps" +" and save all URLs to the database. The plugin will make sure that your " +"cache is always preloaded." +msgstr "" +"Lorsque vous activez le préchargement, WP Rocket détecte automatiquement vos" +" sitemaps et enregistre toutes les URLs dans la base de données. L'extension" +" s'assurera que votre cache est toujours préchargé." + +#: inc/Engine/Admin/Settings/Page.php:1049 +msgid "Preload Links" +msgstr "Précharger les liens" + +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1052 +msgid "" +"Link preloading improves the perceived load time by downloading a page when " +"a user hovers over the link. %1$sMore info%2$s" +msgstr "" +"Le pré-chargement de liens améliore la perception du temps de chargement du " +"site en téléchargeant une page lorsque l'usager survole un hyperlien. " +"%1$sPlus d'info%2$s" + +#: inc/Engine/Admin/Settings/Page.php:1060 +msgid "Prefetch DNS Requests" +msgstr "Préchargement des requêtes DNS" -#: inc/Engine/Admin/Settings/Page.php:2078 -msgid "Should only be used with Cloudflare's flexible SSL feature. URLs of static files (CSS, JS, images) will be rewritten to use // instead of http:// or https://." -msgstr "Ne devrait être utilisé qu’avec la fonction Flexible SSL de Cloudflare. Les URLs de vos fichiers statiques (CSS, JS, images) seront ré-écrits pour utiliser // au lieu de http:// ou https://." +#: inc/Engine/Admin/Settings/Page.php:1062 +msgid "" +"DNS prefetching can make external files load faster, especially on mobile " +"networks" +msgstr "" +"Le préchargement des requêtes DNS peut permettre aux ressources externes de " +"charger plus rapidement, surtout sur les réseaux mobiles." -#: inc/Engine/Admin/Settings/Page.php:2116 -msgid "Sucuri credentials" -msgstr "Accès Sucuri" +#: inc/Engine/Admin/Settings/Page.php:1067 +msgid "Preload Fonts" +msgstr "Précharger les fontes" -#: inc/Engine/Admin/Settings/Page.php:2130 -msgctxt "Sucuri" -msgid "Find your API key" -msgstr "Trouver votre clé d’API" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1070 +msgid "" +"Improves performance by helping browsers discover fonts in CSS files. " +"%1$sMore info%2$s" +msgstr "" +"Améliore les performances en aidant les navigateurs à découvrir les fontes " +"dans les ficheirs CSS. %1$sPlus d'info%2$s" -#: inc/Engine/Admin/Settings/Render.php:422 -#: inc/deprecated/deprecated.php:1294 -msgid "Upload file and import settings" -msgstr "Envoyer le fichier et importer les réglages" +#: inc/Engine/Admin/Settings/Page.php:1084 +msgid "Activate Preloading" +msgstr "Activer le pré-chargement" -#: inc/Engine/Admin/Settings/Settings.php:362 -msgid "Sucuri Add-on: The API key for the Sucuri firewall must be in format {32 characters}/{32 characters}." -msgstr "Ajout Sucuri : la clé d'API pour le pare-feu Sucuri doit être au format {32 caractères}/{32 caractères}." +#: inc/Engine/Admin/Settings/Page.php:1095 +msgid "Exclude URLs" +msgstr "URLs à exclure" -#: inc/Engine/Admin/Settings/Settings.php:452 -#: inc/deprecated/deprecated.php:1245 -msgid "Settings saved." -msgstr "Réglages sauvegardés." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1100 +msgid "" +"Specify URLs to be excluded from the preload feature (one per line). " +"%1$sMore info%2$s" +msgstr "" +"Indiquez les URL à exclure du préchargement (une par ligne). %1$sPlus " +"d'infos%2$s" -#: inc/Engine/Admin/Settings/Settings.php:668 -msgid "Sorry! Adding /(.*) in Advanced Rules > Never Cache URL(s) was not saved because it disables caching and optimizations for every page on your site." -msgstr "Désolé ! L'ajout de /(.*) dans Règles avancées > Ne jamais mettre en cache ces URL(s) n'a pas été sauvegardé car cette valeur désactive le cache et les optimisations sur toutes les pages du site." +#: inc/Engine/Admin/Settings/Page.php:1111 +msgid "URLs to prefetch" +msgstr "URLs à précharger" -#: inc/Engine/Admin/Settings/Subscriber.php:168 -#: inc/deprecated/deprecated.php:1786 -#: views/settings/page-sections/tools.php:33 -msgid "Tools" -msgstr "Outils" +#: inc/Engine/Admin/Settings/Page.php:1112 +msgid "" +"Specify external hosts to be prefetched (no http:, one per " +"line)" +msgstr "" +"Indiquez les hôtes externes à précharger (sans http:, un par " +"ligne)" -#: inc/Engine/Admin/Settings/Subscriber.php:169 -msgid "Import, Export, Rollback" -msgstr "Import, export, restauration" +#: inc/Engine/Admin/Settings/Page.php:1121 +msgid "Fonts to preload" +msgstr "Fontes à précharger" -#: inc/Engine/Admin/Settings/Subscriber.php:194 -#: views/settings/page-sections/imagify.php:14 -msgid "Image Optimization" -msgstr "Optimisation des images" +#: inc/Engine/Admin/Settings/Page.php:1122 +msgid "" +"Specify urls of the font files to be preloaded (one per line). Fonts must be" +" hosted on your own domain, or the domain you have specified on the CDN tab." +msgstr "" +"Spécifiez les URLs des fichiers de fontes à être pré-chargées (un par " +"ligne). Les fontes doivent être hébergées sur votre propre domaine, ou le " +"domaine spécifié dans l'onglet CDN." -#: inc/Engine/Admin/Settings/Subscriber.php:195 -msgid "Compress your images" -msgstr "Compresser vos images" +#: inc/Engine/Admin/Settings/Page.php:1123 +msgid "" +"The domain part of the URL will be stripped automatically.
Allowed font " +"extensions: otf, ttf, svg, woff, woff2." +msgstr "" +"La portion domaine de l'URL sera retirée automatiquement.
Extensions de " +"fontes permises : otf, ttf, svg, woff, woff2." -#: inc/Engine/Admin/Settings/Subscriber.php:212 -#: views/settings/page-sections/tutorials.php:48 -msgid "Tutorials" -msgstr "Tutoriels" +#: inc/Engine/Admin/Settings/Page.php:1132 +msgid "Enable link preloading" +msgstr "Activer le préchargement des liens" -#: inc/Engine/Admin/Settings/Subscriber.php:213 -msgid "Getting started and how to videos" -msgstr "Bien démarrer et vidéos d'assistance" +#: inc/Engine/Admin/Settings/Page.php:1151 +msgid "Advanced Rules" +msgstr "Règles avancées" -#: inc/Engine/CDN/RocketCDN/APIClient.php:134 -msgid "We could not fetch the current price because RocketCDN API returned an unexpected error code." -msgstr "Nous n'avons pas pu récupérer le prix actuel car l'API RocketCDN a renvoyé un code d'erreur inattendu." +#: inc/Engine/Admin/Settings/Page.php:1152 +msgid "Fine-tune cache rules" +msgstr "Affiner les règles du cache" -#: inc/Engine/CDN/RocketCDN/APIClient.php:140 -msgid "RocketCDN is not available at the moment. Please retry later." -msgstr "RocketCDN n'est pas disponible pour le moment. Veuillez réessayer plus tard." +#: inc/Engine/Admin/Settings/Page.php:1165 +msgid "" +"Sensitive pages like custom login/logout URLs should be excluded from cache." +msgstr "" +"Les pages sensibles telles que les URLs de connexion / déconnexion " +"personnalisés doivent être exclus du cache." -#: inc/Engine/CDN/RocketCDN/APIClient.php:177 -msgid "RocketCDN cache purge failed: Missing identifier parameter." -msgstr "La purge du cache RocketCDN a échoué : identifiant de réglage manquant." +#: inc/Engine/Admin/Settings/Page.php:1168 +msgctxt "plugin name" +msgid "WooCommerce" +msgstr "WooCommerce" -#: inc/Engine/CDN/RocketCDN/APIClient.php:186 -msgid "RocketCDN cache purge failed: Missing user token." -msgstr "La purge du cache RocketCDN a échoué : identifiant d'utilisateur manquant." +#: inc/Engine/Admin/Settings/Page.php:1170 +msgctxt "plugin name" +msgid "Easy Digital Downloads" +msgstr "Easy Digital Downloads" -#: inc/Engine/CDN/RocketCDN/APIClient.php:212 -msgid "RocketCDN cache purge failed: The API returned an unexpected response code." -msgstr "La purge du cache RocketCDN a échoué : l'API a retourné un code de réponse inattendu." +#: inc/Engine/Admin/Settings/Page.php:1172 +msgctxt "plugin name" +msgid "iThemes Exchange" +msgstr "iThemes Exchange" -#: inc/Engine/CDN/RocketCDN/APIClient.php:221 -msgid "RocketCDN cache purge failed: The API returned an empty response." -msgstr "La purge du cache RocketCDN a échoué : l'API a retourné une réponse vide." +#: inc/Engine/Admin/Settings/Page.php:1174 +msgctxt "plugin name" +msgid "Jigoshop" +msgstr "Jigoshop" -#: inc/Engine/CDN/RocketCDN/APIClient.php:230 -msgid "RocketCDN cache purge failed: The API returned an unexpected response." -msgstr "La purge du cache RocketCDN a échoué : l'API a retourné une réponse inattendue." +#: inc/Engine/Admin/Settings/Page.php:1176 +msgctxt "plugin name" +msgid "WP-Shop" +msgstr "WP-Shop" -#: inc/Engine/CDN/RocketCDN/APIClient.php:239 -#, php-format -msgid "RocketCDN cache purge failed: %s." -msgstr "La purge du cache RocketCDN a échoué : %s." +#. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing +#. tag. +#: inc/Engine/Admin/Settings/Page.php:1182 +msgid "" +"
Cart, checkout and \"my account\" pages set in " +"%1$s%2$s%3$s will be detected and never cached by default." +msgstr "" +"
Les pages panier, commande et \"mon compte\" réglées dans " +"%1$s%2$s%3$s seront automatiquement détectées et exclues du" +" cache par défaut." -#: inc/Engine/CDN/RocketCDN/APIClient.php:247 -msgid "RocketCDN cache purge successful." -msgstr "La purge du cache de RocketCDN a été effectuée avec succès." +#: inc/Engine/Admin/Settings/Page.php:1192 +msgid "Cache Lifespan" +msgstr "Délai de nettoyage du cache" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 -msgid "Next Billing Date" -msgstr "Prochaine date de facturation" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1195 +msgid "" +"Cache files older than the specified lifespan will be deleted.
Enable " +"%1$spreloading%2$s for the cache to be rebuilt automatically after lifespan " +"expiration." +msgstr "" +"Les fichiers en cache plus vieux que la durée de vie spécifiée seront " +"effacés.
Activer %1$spré-chargement %2$s pour que le cache soit généré de" +" nouveau automatiquement après l'expiration de la durée de vie." -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 -msgid "No Subscription" -msgstr "Aucun abonnement" +#: inc/Engine/Admin/Settings/Page.php:1211 +msgid "Never Cache Cookies" +msgstr "Ne jamais mettre en cache ces témoins" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 -msgid "Your RocketCDN subscription is currently active." -msgstr "Votre abonnement à RocketCDN est présentement activé." +#: inc/Engine/Admin/Settings/Page.php:1229 +msgid "Cache Query String(s)" +msgstr "Cacher les “Query String(s)”" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 -#, php-format -msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." -msgstr "Pour utiliser RocketCDN, remplacer votre CNAME avec %1$s%2$s%3$s." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1232 +msgid "" +"%1$sCache for query strings%2$s enables you to force caching for specific " +"GET parameters." +msgstr "" +"%1$sCacher les “Query Strings”%2$s vous permet de forcer la mise en cache de" +" paramètres GET spécifiques." -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 -#: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 -#: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 -#, php-format -msgid "%1$sMore Info%2$s" -msgstr "%1$sPlus d'Info%2$s" +#: inc/Engine/Admin/Settings/Page.php:1243 +msgid "" +"Specify time after which the global cache is cleared
(0 = unlimited )" +msgstr "" +"Indiquez le nombre d’heures après quoi le cache global doit être vidé
(0 " +"= illimité)" -#: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:137 -msgid "RocketCDN enabled" -msgstr "RocketCDN activé" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1245 +msgid "" +"Reduce lifespan to 10 hours or less if you notice issues that seem to appear" +" periodically. %1$sWhy?%2$s" +msgstr "" +"Réduisez le délai à 10 heures ou moins si vous remarquez des problèmes " +"apparaissant de façon intermittente. %1$sPourquoi ?%2$s" -#: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:160 -msgid "RocketCDN disabled" -msgstr "RocketCDN désactivé" +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 +msgid "Hours" +msgstr "Heures" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 -#, php-format -msgid "Valid until %s only!" -msgstr "Valide seulement jusqu'à %s!" +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 +msgid "Days" +msgstr "Jours" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 -msgid "Speed up your website thanks to:" -msgstr "Accélérez votre site web grâce à :" +#: inc/Engine/Admin/Settings/Page.php:1257 +msgid "" +"Specify URLs of pages or posts that should never be cached (one per line)" +msgstr "" +"Indiquez les URLs des pages ou articles qui doivent être exclus de la mise " +"en cache (un par ligne)" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 -#, php-format -msgid "High performance Content Delivery Network (CDN) with %1$sunlimited bandwidth%2$s" -msgstr "CDN (Content Delivery Network) de haute performance à %1$sbande passante illimitée%2$s" +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 +msgid "" +"The domain part of the URL will be stripped automatically.
Use (.*) " +"wildcards to address multiple URLs under a given path." +msgstr "" +"Le nom de domaine sera supprimé automatiquement de l'URL .
Utilisez les " +"expressions régulières (.*) pour exclure plusieurs URLs pour un chemin " +"donné." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 -#, php-format -msgid "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" -msgstr "Configuration simplifiée : les %1$smeilleurs réglages CDN%2$s sont automatiquement appliqués" +#: inc/Engine/Admin/Settings/Page.php:1267 +msgid "" +"Specify full or partial IDs of cookies that, when set in the visitor's " +"browser, should prevent a page from getting cached (one per line)" +msgstr "" +"Spécifiez les IDs complets ou partiels de témoins qui, lorsque définis dans " +"le navigateur du visiteur, devraient prévenir une page d'être mise en cache " +"(un par ligne)." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 -#, php-format -msgid "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in our plugin" -msgstr "Intégration WP Rocket : l'option CDN est %1$sautomatiquement configurée%2$s dans notre extension" +#: inc/Engine/Admin/Settings/Page.php:1275 +msgid "" +"Specify user agent strings that should never see cached pages (one per line)" +msgstr "" +"Indiquez les chaînes des agents utilisateurs qui ne devraient jamais voir " +"les pages mises en cache (une par ligne)" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 -msgid "Learn more about RocketCDN" -msgstr "En savoir plus sur RocketCDN" +#: inc/Engine/Admin/Settings/Page.php:1276 +msgid "Use (.*) wildcards to detect parts of UA strings." +msgstr "" +"Utilisez les expressions régulières (.*) pour détecter les parties des " +"chaînes des agents utilisateurs." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 -#, php-format -msgid "*$%1$s/month for 12 months then $%2$s/month. You can cancel your subscription at any time." -msgstr "*%1$s$/mois pour 12 mois puis %2$s$/mois. Vous pouvez résilier votre abonnement à tout moment." +#: inc/Engine/Admin/Settings/Page.php:1285 +msgid "" +"Specify URLs you always want purged from cache whenever you update any post " +"or page (one per line)" +msgstr "" +"Indiquez les URLs dont vous voulez systématiquement vider le cache lorsque " +"vous mettez à jour n'importe quel article ou page (une par ligne)" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 -msgid "Billed monthly" -msgstr "Facturation mensuelle" +#: inc/Engine/Admin/Settings/Page.php:1294 +msgid "Specify query strings for caching (one per line)" +msgstr "" +"Indiquez les “query strings” qui peuvent être mises en cache (une par ligne)" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 -msgid "Get Started" -msgstr "Démarrez" +#: inc/Engine/Admin/Settings/Page.php:1320 +msgid "Optimize, reduce bloat" +msgstr "Optimiser & nettoyer" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 -msgid "Reduce this banner" -msgstr "Réduire cette bannière" +#: inc/Engine/Admin/Settings/Page.php:1327 +msgid "Post Cleanup" +msgstr "Nettoyage des contenus" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 -msgid "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." -msgstr "Accélérez votre site web avec RocketCDN, le réseau de livraison de contenu de WP Rocket." +#: inc/Engine/Admin/Settings/Page.php:1329 +msgid "" +"Post revisions and drafts will be permanently deleted. Do not use this " +"option if you need to retain revisions or drafts." +msgstr "" +"Les révisions et les brouillons seront supprimés définitivement. N'utilisez " +"pas cette option si vous devez conserver vos révisions et brouillons." -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 -#: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 -msgid "Learn More" -msgstr "En savoir plus" +#: inc/Engine/Admin/Settings/Page.php:1334 +msgid "Comments Cleanup" +msgstr "Nettoyage des commentaires" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 -msgid "RocketCDN is unavailable on local domains and staging sites." -msgstr "RocketCDN est indisponible pour les domaines locaux et les sites de test." +#: inc/Engine/Admin/Settings/Page.php:1336 +msgid "Spam and trashed comments will be permanently deleted." +msgstr "Les Spams et les commentaires mis à la corbeille seront supprimés" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 -msgid "Get RocketCDN" -msgstr "Obtenir RocketCDN" +#: inc/Engine/Admin/Settings/Page.php:1340 +msgid "Transients Cleanup" +msgstr "Nettoyage des transients" -#: inc/Engine/CDN/RocketCDN/views/promote-notice.php:11 -msgid "New!" -msgstr "Nouveau!" +#: inc/Engine/Admin/Settings/Page.php:1342 +msgid "" +"Transients are temporary options; they are safe to remove. They will be " +"automatically regenerated as your plugins require them." +msgstr "" +"Les “transients” sont des options temporaires, leur suppression est sans " +"danger. Elles seront automatiquement régénérées si vos extensions en ont " +"besoin." -#: inc/Engine/CDN/RocketCDN/views/promote-notice.php:12 -msgid "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network!" -msgstr "Accélérez votre site web avec RocketCDN, le réseau de livraison de contenu de WP Rocket." +#: inc/Engine/Admin/Settings/Page.php:1346 +msgid "Database Cleanup" +msgstr "Nettoyage de la base de données" -#: inc/Engine/Cache/AdminSubscriber.php:118 -#: inc/admin/admin.php:96 -#: inc/admin/admin.php:118 -#: inc/deprecated/3.5.php:898 -msgid "Clear this cache" -msgstr "Vider ce cache" +#: inc/Engine/Admin/Settings/Page.php:1348 +msgid "Reduces overhead of database tables" +msgstr "Récupère l’espace inutilisé des tables de la base de données" -#: inc/Engine/Cache/PurgeExpired/Subscriber.php:75 -msgid "WP Rocket Expired Cache Interval" -msgstr "Intervalle d'expiration du cache WP Rocket" +#: inc/Engine/Admin/Settings/Page.php:1352 +msgid "Automatic Cleanup" +msgstr "Nettoyage automatique" -#: inc/Engine/Cache/WPCache.php:337 -msgid "WP_CACHE value" -msgstr "Valeur de WP_CACHE" +#. translators: %s is the number of revisions found in the database. It's a +#. formatted number, don't use %d. +#: inc/Engine/Admin/Settings/Page.php:1365 +msgid "%s revision in your database." +msgid_plural "%s revisions in your database." +msgstr[0] "%s révision dans votre base de données." +msgstr[1] "%s révisions dans votre base de données." +msgstr[2] "%s révisions dans votre base de données." -#: inc/Engine/Cache/WPCache.php:358 -msgid "The WP_CACHE constant needs to be set to true for WP Rocket cache to work properly" -msgstr "La constante WP_CACHE doit être à \"true\" pour que le cache de WP Rocket fonctionne correctement" +#. translators: %s is the number of revisions found in the database. It's a +#. formatted number, don't use %d. +#: inc/Engine/Admin/Settings/Page.php:1375 +msgid "%s draft in your database." +msgid_plural "%s drafts in your database." +msgstr[0] "%s brouillon dans votre base de données." +msgstr[1] "%s brouillons dans votre base de données." +msgstr[2] "%s brouillons dans votre base de données." -#: inc/Engine/Cache/WPCache.php:367 -msgid "WP_CACHE is set to true" -msgstr "WP_CACHE est à \"true\"" +#. translators: %s is the number of revisions found in the database. It's a +#. formatted number, don't use %d. +#: inc/Engine/Admin/Settings/Page.php:1385 +msgid "%s trashed post in your database." +msgid_plural "%s trashed posts in your database." +msgstr[0] "%s articles à la corbeille dans votre base de données." +msgstr[1] "%sarticles à la corbeille dans votre base de données." +msgstr[2] "%sarticles à la corbeille dans votre base de données." -#: inc/Engine/Cache/WPCache.php:375 -msgid "WP_CACHE is not set" -msgstr "WP_CACHE n'est pas défini" +#. translators: %s is the number of revisions found in the database. It's a +#. formatted number, don't use %d. +#: inc/Engine/Admin/Settings/Page.php:1395 +msgid "%s spam comment in your database." +msgid_plural "%s spam comments in your database." +msgstr[0] "%s commentaire de SPAM dans votre base de données." +msgstr[1] "%s commentaires de SPAM dans votre base de données." +msgstr[2] "%s commentaires de SPAM dans votre base de données." -#: inc/Engine/Cache/WPCache.php:383 -msgid "WP_CACHE is set to false" -msgstr "WP_CACHE est à \"false\"" +#. translators: %s is the number of revisions found in the database. It's a +#. formatted number, don't use %d. +#: inc/Engine/Admin/Settings/Page.php:1405 +msgid "%s trashed comment in your database." +msgid_plural "%s trashed comments in your database." +msgstr[0] "%s commentaire à la corbeille dans votre base de données." +msgstr[1] "%s commentaires à la corbeille dans votre base de données." +msgstr[2] "%s commentaires à la corbeille dans votre base de données." -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:253 -msgid "Every minute" -msgstr "Chaque minute" +#: inc/Engine/Admin/Settings/Page.php:1413 +msgid "All transients" +msgstr "Tous les transients" -#: inc/Engine/CriticalPath/APIClient.php:64 -#, php-format -msgid "Critical CSS for %1$s not generated. Error: %2$s" -msgstr "Le CSS critique pour %1$s n'a pas été généré. Erreur : %2$s" +#. translators: %s is the number of revisions found in the database. It's a +#. formatted number, don't use %d. +#: inc/Engine/Admin/Settings/Page.php:1415 +msgid "%s transient in your database." +msgid_plural "%s transients in your database." +msgstr[0] "%s transient dans votre base de données." +msgstr[1] "%s transients dans votre base de données." +msgstr[2] "%s transients dans votre base de données." -#: inc/Engine/CriticalPath/APIClient.php:170 -#, php-format -msgid "Critical CSS for %1$s on mobile not generated. Error: The API returned an empty response." -msgstr "CSS critique aux mobiles pour %1$s non-généré. Erreur : l'API a retourné une réponse vide." +#: inc/Engine/Admin/Settings/Page.php:1423 +msgid "Optimize Tables" +msgstr "Optimiser les tables" -#: inc/Engine/CriticalPath/APIClient.php:173 -#, php-format -msgid "Critical CSS for %1$s not generated. Error: The API returned an empty response." -msgstr "CSS critique pour %1$s non généré. Erreur : l'API a retourné une réponse vide." +#. translators: %s is the number of revisions found in the database. It's a +#. formatted number, don't use %d. +#: inc/Engine/Admin/Settings/Page.php:1425 +msgid "%s table to optimize in your database." +msgid_plural "%s tables to optimize in your database." +msgstr[0] "%s table à optimiser dans votre base de données." +msgstr[1] "%s tables à optimiser dans votre base de données." +msgstr[2] "%s tables à optimiser dans votre base de données." -#: inc/Engine/CriticalPath/APIClient.php:185 -#, php-format -msgid "Critical CSS for %1$s on mobile not generated." -msgstr "CSS critique aux mobiles pour %1$s non-généré." +#: inc/Engine/Admin/Settings/Page.php:1436 +msgid "Schedule Automatic Cleanup" +msgstr "Planifier le nettoyage automatique" -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 -#, php-format -msgid "Critical CSS for %1$s not generated." -msgstr "CSS critique pour %1$s non-généré." +#: inc/Engine/Admin/Settings/Page.php:1448 +msgid "Frequency" +msgstr "Fréquence" -#: inc/Engine/CriticalPath/APIClient.php:195 -#, php-format -msgid "Critical CSS for %1$s on mobile not generated. Error: The API returned an invalid response code." -msgstr "CSS critique aux mobiles pour %1$s non-généré. Erreur : l'API a retourné un code de réponse invalide." +#: inc/Engine/Admin/Settings/Page.php:1456 +msgid "Daily" +msgstr "Quotidien" -#: inc/Engine/CriticalPath/APIClient.php:197 -#, php-format -msgid "Critical CSS for %1$s not generated. Error: The API returned an invalid response code." -msgstr "CSS critique pour %1$s non-généré. Erreur : l'API a retourné un code de réponse invalide" +#: inc/Engine/Admin/Settings/Page.php:1457 +msgid "Weekly" +msgstr "Hebdomadaire" -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 -#, php-format -msgid "Error: %1$s" -msgstr "Erreur : %1$s" +#: inc/Engine/Admin/Settings/Page.php:1458 +msgid "Monthly" +msgstr "Mensuel" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 -msgid "Regenerate Critical Path CSS" -msgstr "Régénérer le CSS critique" +#: inc/Engine/Admin/Settings/Page.php:1475 +msgid "Integrate your CDN" +msgstr "Intégrer votre CDN" -#: inc/Engine/CriticalPath/Admin/Post.php:144 -#: views/cpcss/metabox/generate.php:47 -msgid "Generate Specific CPCSS" -msgstr "Générer le CPCSS spécifique" +#: inc/Engine/Admin/Settings/Page.php:1487 +msgid "" +"All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s)" +" you provide." +msgstr "" +"Tous les URLs de vos fichiers statiques (CSS, JS, images) seront ré-écrits " +"avec le CNAME fourni." -#: inc/Engine/CriticalPath/Admin/Post.php:145 -#: views/cpcss/metabox/generate.php:45 -msgid "Regenerate specific CPCSS" -msgstr "Regénérer le CPCSS spécifique" +#. translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/Engine/Admin/Settings/Page.php:1489 +msgid "" +"Not required for services like Cloudflare and Sucuri. Please see our " +"available %1$sAdd-ons%2$s." +msgstr "" +"Non requis pour les services tels que Cloudflare et Sucuri. Veuillez " +"consulter nos %1$sAjouts%2$s disponibles." -#: inc/Engine/CriticalPath/Admin/Post.php:216 -msgid "This feature is not available for non-public post types." -msgstr "Cette fonctionnalité n'est pas disponible pour les publications qui ne sont pas publiques." +#. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = +#. closing em tag. +#: inc/Engine/Admin/Settings/Page.php:1533 +msgid "" +"%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings " +"is not required for %2$l to work on your site." +msgid_plural "" +"%1$s%2$l Add-ons%3$s are currently enabled. Configuration of the CDN " +"settings is not required for %2$l to work on your site." +msgstr[0] "" +"%1$s%2$l Add-on%3$sest présentement activé. s. La configuration des réglages" +" CDN n'est pas requise pour que %2$l fonctionne sur votre site." +msgstr[1] "" +"%1$s%2$l Add-ons%3$s sont présentement activés. La configuration des " +"réglages CDN n'est pas requise pour que %2$l fonctionne sur votre site." +msgstr[2] "" +"%1$s%2$l Add-ons%3$s sont présentement activés. La configuration des " +"réglages CDN n'est pas requise pour que %2$l fonctionne sur votre site." + +#: inc/Engine/Admin/Settings/Page.php:1559 +msgid "Enable Content Delivery Network" +msgstr "Activer le Content Delivery Network." -#: inc/Engine/CriticalPath/Admin/Post.php:219 -msgid "%l to use this feature." -msgstr "%l pour utiliser cette fonction." +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 +msgid "CDN CNAME(s)" +msgstr "CNAME(s) du CDN" -#: inc/Engine/CriticalPath/Admin/Post.php:222 -#, php-format -msgid "Publish the %s" -msgstr "Publier le %s" +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 +msgid "Specify the CNAME(s) below" +msgstr "Indiquez le(s) CNAME(s) ci-dessous" -#: inc/Engine/CriticalPath/Admin/Post.php:223 -msgid "Enable Load CSS asynchronously in WP Rocket settings" -msgstr "Activez Chargement Asynchrone du CSS dans les réglages de WP Rocket" +#: inc/Engine/Admin/Settings/Page.php:1576 +msgid "" +"Specify URL(s) of files that should not get served via CDN (one per line)." +msgstr "" +"Indiquez les URLs des fichiers qui ne doivent pas être servies par le CDN " +"(une par ligne)." -#: inc/Engine/CriticalPath/Admin/Post.php:224 -msgid "Enable Load CSS asynchronously in the options above" -msgstr "Activez Chargement Asynchrone du CSS dans les options ci-dessus" +#: inc/Engine/Admin/Settings/Page.php:1577 +msgid "" +"The domain part of the URL will be stripped automatically.
Use (.*) " +"wildcards to exclude all files of a given file type located at a specific " +"path." +msgstr "" +"Le nom de domaine sera supprimé automatiquement de l'URL .
Utilisez les " +"expressions régulières (.*) pour exclure plusieurs URLs pour un chemin " +"donné." -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:176 -msgid "Critical CSS generation is currently running." -msgstr "La génération du CSS critique est en cours." +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 +msgid "Heartbeat" +msgstr "Battement de coeur" -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:181 -#, php-format -msgid "Go to the %1$sWP Rocket settings%2$s page to track progress." -msgstr "Allez à la page des %1$sparamètres WP Rocket %2$s afin d'en suivre l'évolution." +#: inc/Engine/Admin/Settings/Page.php:1601 +msgid "Control WordPress Heartbeat API" +msgstr "Contrôler l'API du battement de coeur de WordPress" -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:396 -#, php-format -msgid "Critical CSS generation is currently running: %1$d of %2$d page types completed. (Refresh this page to view progress)" -msgstr "La génération du CSS critique est en cours : %1$d de %2$d de types de contenus complétés. (Rafraîchir pour voir la progression)" +#: inc/Engine/Admin/Settings/Page.php:1609 +msgid "" +"Reducing or disabling the Heartbeat API’s activity can help save some of " +"your server’s resources." +msgstr "" +"Réduire ou désactiver l'API du signal de battement de coeur peut aider à " +"économier des ressources serveur." -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:472 -#, php-format -msgid "Critical CSS generation finished for %1$d of %2$d page types." -msgstr "La génération du CSS critique est terminée pour %1$d des %2$d types de contenus." +#: inc/Engine/Admin/Settings/Page.php:1615 +msgid "Reduce or disable Heartbeat activity" +msgstr "Réduire ou désactiver le signal de battement de coeur" -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:479 -msgid "Critical CSS generation encountered one or more errors." -msgstr "La génération du CSS critique a rencontré une ou plusieurs erreur(s)." +#: inc/Engine/Admin/Settings/Page.php:1616 +msgid "" +"Reducing activity will change Heartbeat frequency from one hit each minute " +"to one hit every 2 minutes." +msgstr "" +"Réduire l'activité changera la fréquence de battement de coeur de une " +"pulsation par minute à une pulsation aux 2 minutes." -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:479 -msgid "Learn more." -msgstr "En savoir plus." +#: inc/Engine/Admin/Settings/Page.php:1616 +msgid "" +"Disabling Heartbeat entirely may break plugins and themes using this API." +msgstr "" +"Désactiver le battement de coeur complètement peut briser les extensions et " +"thèmes utilisant cet API." -#: inc/Engine/CriticalPath/DataManager.php:68 -#, php-format -msgid "Critical CSS for %1$s on mobile not generated. Error: The destination folder could not be created." -msgstr "CSS critique pour %1$s sur mobile non-généré. Erreur : Le répertoire de destination n'a pas pu être créé." +#: inc/Engine/Admin/Settings/Page.php:1630 +msgid "Do not limit" +msgstr "Ne pas limiter" -#: inc/Engine/CriticalPath/DataManager.php:71 -#, php-format -msgid "Critical CSS for %1$s not generated. Error: The destination folder could not be created." -msgstr "CSS critique pour %1$s non-généré. Erreur : Le répertoire de destination n'a pu être créé." +#: inc/Engine/Admin/Settings/Page.php:1631 +msgid "Reduce activity" +msgstr "Réduire l'activité" -#: inc/Engine/CriticalPath/DataManager.php:106 -msgid "Critical CSS file for mobile does not exist" -msgstr "Fichier critique CSS pour mobiles n'existe pas" +#: inc/Engine/Admin/Settings/Page.php:1632 +msgid "Disable" +msgstr "Désactiver" -#: inc/Engine/CriticalPath/DataManager.php:108 -msgid "Critical CSS file does not exist" -msgstr "Fichier critique CSS n'existe pas" +#: inc/Engine/Admin/Settings/Page.php:1640 +msgid "Control Heartbeat" +msgstr "Contrôler le battement de coeur" -#: inc/Engine/CriticalPath/DataManager.php:120 -msgid "Critical CSS file for mobile cannot be deleted" -msgstr "Fichier critique CSS pour mobiles ne peut être effacé" +#: inc/Engine/Admin/Settings/Page.php:1649 +msgid "Behavior in backend" +msgstr "Comportement dans le tableau de bord" -#: inc/Engine/CriticalPath/DataManager.php:122 -msgid "Critical CSS file cannot be deleted" -msgstr "Fichier critique CSS ne peut être effacé" +#: inc/Engine/Admin/Settings/Page.php:1656 +msgid "Behavior in post editor" +msgstr "Comportement dans l'éditeur" -#: inc/Engine/CriticalPath/ProcessorService.php:187 -#, php-format -msgid "Mobile Critical CSS for %1$s not generated." -msgstr "Le CSS critique aux mobiles pour %1$s n'a pas été généré." +#: inc/Engine/Admin/Settings/Page.php:1662 +msgid "Behavior in frontend" +msgstr "Comportement sur le site" -#: inc/Engine/CriticalPath/ProcessorService.php:228 -#, php-format -msgid "Critical CSS for %s in progress." -msgstr "Le CSS critique pour %s est en cours." +#: inc/Engine/Admin/Settings/Page.php:1681 +#: views/settings/page-sections/tutorials.php:39 +msgid "Add-ons" +msgstr "Ajouts" -#: inc/Engine/CriticalPath/ProcessorService.php:262 -#, php-format -msgid "Mobile Critical CSS for %s generated." -msgstr "Le CSS critique aux mobiles pour %s est généré." +#: inc/Engine/Admin/Settings/Page.php:1682 +msgid "Add more features" +msgstr "Ajouter des fonctionnalités" -#: inc/Engine/CriticalPath/ProcessorService.php:273 -#, php-format -msgid "Critical CSS for %s generated." -msgstr "Le CSS critique pour %s a été généré." +#: inc/Engine/Admin/Settings/Page.php:1689 +msgid "One-click Rocket Add-ons" +msgstr "Ajouts Rockets en un clic" -#: inc/Engine/CriticalPath/ProcessorService.php:295 -msgid "Critical CSS file deleted successfully." -msgstr "Fichier de CSS critique effacé avec succès" +#: inc/Engine/Admin/Settings/Page.php:1690 +msgid "" +"One-Click Add-ons are features extending available options without " +"configuration needed. Switch the option \"on\" to enable from this screen." +msgstr "" +"Les ajouts en un clic offrent des fonctionnalités complémentaires en " +"augmentant les options déjà disponibles sans besoin de configuration. Mettez" +" l'option à \"ON\" pour l'activer depuis cet écran." -#: inc/Engine/CriticalPath/ProcessorService.php:317 -#, php-format -msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." -msgstr "Délai d'attente du CSS critique aux mobiles pour %1$s. Veuillez essayer de nouveau plus tard." +#: inc/Engine/Admin/Settings/Page.php:1700 +msgid "Rocket Add-ons" +msgstr "Ajouts Rocket" -#: inc/Engine/CriticalPath/ProcessorService.php:330 -#, php-format -msgid "Critical CSS for %1$s timeout. Please retry a little later." -msgstr "Délai d'attente pour le CSS critique pour %1$s. Veuillez essayer de nouveau plus tard." +#: inc/Engine/Admin/Settings/Page.php:1701 +msgid "Rocket Add-ons are complementary features extending available options." +msgstr "" +"Les ajouts Rockets offrent des fonctionnalités complémentaires augmentant " +"les options déjà disponibles." -#: inc/Engine/CriticalPath/RESTWP.php:141 -msgid "Mobile CPCSS generation not enabled." -msgstr "Génération du CPCSS pour mobiles non-activé" +#: inc/Engine/Admin/Settings/Page.php:1712 +msgid "User Cache" +msgstr "Cache utilisateur" -#: inc/Engine/CriticalPath/RESTWPPost.php:36 -#: inc/Engine/CriticalPath/RESTWPPost.php:69 -msgid "Requested post does not exist." -msgstr "L'article demandé n'existe pas" +#: inc/Engine/Admin/Settings/Page.php:1718 +msgid "" +"If you need to create a dedicated set of cache files for each logged-in " +"WordPress user, you must activate this add-on." +msgstr "" +"Si vous avez besoin de créer un ensemble de fichiers de cache dédiés à " +"chaque utilisateur connecté à WordPress, vous devez activer cet add-on." -#: inc/Engine/CriticalPath/RESTWPPost.php:46 -msgid "Cannot generate CPCSS for unpublished post." -msgstr "Impossible de générer le CPCSS pour les articles non-publiés" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1720 +msgid "" +"User cache is great when you have user-specific or restricted content on " +"your website.
%1$sLearn more%2$s" +msgstr "" +"Le cache utilisateur est parfait si vous avez du contenu spécifique ou " +"restreint pour les utilisateurs de votre site.
%1$sEn savoir plus%2$s" -#: inc/Engine/HealthCheck/HealthCheck.php:82 -#: inc/deprecated/3.5.php:858 -msgid "The following scheduled event failed to run. This may indicate the CRON system is not running properly, which can prevent some WP Rocket features from working as intended:" -msgid_plural "The following scheduled events failed to run. This may indicate the CRON system is not running properly, which can prevent some WP Rocket features from working as intended:" -msgstr[0] "L'évènement planifié suivant n'a pas fonctionné. Ceci pourrait indiquer que le système CRON ne fonctionne pas correctement, ce qui peut prévenir certaines fonctionnalités WP Rocket de fonctionner tel que prévu :" -msgstr[1] "Les évènements planifiés suivants n'ont pas fonctionné. Ceci pourrait indiquer que le système CRON ne fonctionne pas correctement, ce qui peut prévenir certaines fonctionnalités WP Rocket de fonctionner tel que prévu :" -msgstr[2] "Les évènements planifiés suivants n'ont pas fonctionné. Ceci pourrait indiquer que le système CRON ne fonctionne pas correctement, ce qui peut prévenir certaines fonctionnalités WP Rocket de fonctionner tel que prévu :" +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 +msgid "Cloudflare" +msgstr "Cloudflare" -#: inc/Engine/HealthCheck/HealthCheck.php:88 -#: inc/deprecated/3.5.php:867 -msgid "Please contact your host to check if CRON is working." -msgstr "Veuillez contacter votre hébergeur afin de valider si le CRON est fonctionnel." +#: inc/Engine/Admin/Settings/Page.php:1739 +msgid "Integrate your Cloudflare account with this add-on." +msgstr "Intégrez votre compte Cloudflare avec cet add-on" -#: inc/Engine/HealthCheck/HealthCheck.php:142 -msgid "Scheduled Cache Purge" -msgstr "Purge planifiée de la cache" +#: inc/Engine/Admin/Settings/Page.php:1740 +msgid "" +"Provide your account email, global API key, and domain to use options such " +"as clearing the Cloudflare cache and enabling optimal settings with WP " +"Rocket." +msgstr "" +"Entrez l’adresse courriel, la clé d’API globale et le domaine de votre " +"compte Cloudflare afin d’ajouter l’option de purger le cache Cloudflare et " +"activer les réglages optimaux pour fonctionner avec WP Rocket." -#: inc/Engine/HealthCheck/HealthCheck.php:143 -msgid "Scheduled Database Optimization" -msgstr "Optimisation planifiée de la base de données" +#. translators: %1$s = opening span tag, %2$s = closing span tag. +#: inc/Engine/Admin/Settings/Page.php:1743 +msgid "" +"%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just " +"activate the official Cloudflare plugin and configure it. WP Rocket will " +"automatically enable compatibility." +msgstr "" +"%1$sVous envisagez d'utiliser Automatic Platform Optimization (APO) ?%2$s Il" +" suffit d'activer le plugin officiel Cloudflare et de le configurer. WP " +"Rocket activera automatiquement la compatibilité." -#: inc/Engine/HealthCheck/HealthCheck.php:144 -msgid "Database Optimization Process" -msgstr "Processus d'optimisation de la base de données" +#: inc/Engine/Admin/Settings/Page.php:1791 +msgid "Varnish" +msgstr "Varnish" -#: inc/Engine/HealthCheck/HealthCheck.php:145 -msgctxt "noun" -msgid "Preload" -msgstr "Préchargement" +#: inc/Engine/Admin/Settings/Page.php:1797 +msgid "If Varnish runs on your server, you must activate this add-on." +msgstr "Si votre serveur utilise Varnish, vous devez activer cet add-on" -#: inc/Engine/HealthCheck/HealthCheck.php:146 -msgid "Critical Path CSS Generation Process" -msgstr "Processus de génération du CSS pour chemin critique" +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1799 +msgid "" +"Varnish cache will be purged each time WP Rocket clears its cache to ensure " +"content is always up-to-date.
%1$sLearn more%2$s" +msgstr "" +"Le cache Varnish sera purgé à chaque fois que WP Rocket purgera son cache " +"pour vous assurer que le contenu soit toujours à jour.
%1$sEn savoir " +"plus%2$s" -#: inc/Engine/License/Renewal.php:139 -#, php-format -msgid "Renew your license for 1 year now at %1$s%3$s%2$s." -msgstr "Renouvelez votre licence pour 1 an maintenant à %1$s%3$s%2$s." +#: inc/Engine/Admin/Settings/Page.php:1834 +msgid "WebP Compatibility" +msgstr "Compatibilité WebP" -#: inc/Engine/License/Renewal.php:152 -#, php-format -msgid "Renew your license for 1 year now and get %1$s%3$s OFF%2$s immediately: you will only pay %1$s%4$s%2$s!" -msgstr "Renouvelez votre licence pour 1 an et bénéficiez d’une réduction immédiate %1$sde %3$s%2$s: vous ne paierez que %1$s%4$s%2$s!" +#: inc/Engine/Admin/Settings/Page.php:1840 +msgid "Improve browser compatibility for WebP images." +msgstr "Améliore la compatibilité des navigateurs pour les images WebP." -#: inc/Engine/License/Renewal.php:218 -#, php-format -msgid "Renew before it is too late, you will pay %1$s%3$s%2$s." -msgstr "Renouvelez avant qu'il ne soit trop tard, vous payerez %1$s%3$s%2$s." +#. translators: %1$s and %3$s = opening tag, %2$s = closing tag. +#: inc/Engine/Admin/Settings/Page.php:1844 +msgid "" +"Enable this option if you would like WP Rocket to serve WebP images to " +"compatible browsers. Please note that WP Rocket cannot create WebP images " +"for you. To create WebP images we recommend %1$sImagify%2$s. %3$sMore " +"info%2$s" +msgstr "" +"Activez cette option si vous désirez que WP Rocket serve les images WebP au " +"navigateurs compatibles. Veuillez noter que WP Rocket ne peut pas créer " +"d'images WebP pour vous. Pour créez des images WebP nous recommandons " +"%1$sImagify%2$s. %3$sPlus d'info %2$s" -#: inc/Engine/License/Renewal.php:227 -#, php-format -msgid "Renew with a %1$s%2$s discount%3$s before it is too late, you will only pay %1$s%4$s%3$s!" -msgstr "Renouvelez avec un %1$s%2$s escompte%3$s avant qu'il ne soit trop tard, vous ne payerez seulement que %1$s%4$s%3$s!" +#: inc/Engine/Admin/Settings/Page.php:1864 +msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." +msgstr "Vider le cache Sucuri quand le cache de WP Rocket est vidé." -#: inc/Engine/License/Renewal.php:546 -#, php-format -msgid "You need a valid license to continue using this feature. %1$sRenew now%2$s before losing access." -msgstr "Vous devez détenir une licence valide pour continuer à utiliser cette option. %1$sRenouveler maintenant%2$s avant de perdre l'accès." +#: inc/Engine/Admin/Settings/Page.php:1867 +msgid "" +"Provide your API key to clear the Sucuri cache when WP Rocket’s cache is " +"cleared." +msgstr "" +"Fournir votre clé d'API afin de vider le cache Sucuri quand le cache de WP " +"Rocket sera vidé." -#: inc/Engine/License/Renewal.php:567 -#, php-format -msgid "You need an active license to enable this option. %1$sRenew now%2$s." -msgstr "Vous devez détenir une licence active pour activer cette option. %1$sRenouveler maintenant%2$s." +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 +msgid "Sucuri" +msgstr "Sucuri" -#: inc/Engine/License/Renewal.php:595 -#, php-format -msgid "You need an active license to enable this option. %1$sMore info%2$s." -msgstr "Vous devez détenir une licence active pour activer cette option. %1$sPlus d'infos%2$s." - -#: inc/Engine/License/Upgrade.php:252 -#, php-format -msgid "Take advantage of %1$s to speed up more websites:%2$s get a %3$s%4$s off%5$s for %3$supgrading your license to Plus or Infinite!%5$s" -msgid_plural "Take advantage of %1$s to speed up more websites:%2$s get a %3$s%4$s off%5$s for %3$supgrading your license to Infinite!%5$s" -msgstr[0] "Prenez avantage de %1$s afin d'accéléler plus de sites web :%2$s obtenez %3$s%4$s d'escompte%5$s pour %3$srehausser votre licence à \"Plus\" ou \"Infinite\" !%5$s" -msgstr[1] "Prenez avantage de %1$s afin d'accélérer plus de sites web :%2$s obtenez %3$s%4$s d'escompte%5$s pour %3$srehausser votre licence à \"Infinite\" !%5$s" -msgstr[2] "Prenez avantage de %1$s afin d'accélérer plus de sites web :%2$s obtenez %3$s%4$s d'escompte%5$s pour %3$srehausser votre licence à \"Infinite\" !%5$s" - -#: inc/Engine/License/Upgrade.php:382 -#: inc/Engine/License/Upgrade.php:405 -msgid "Unlimited" -msgstr "Illimité" +#: inc/Engine/Admin/Settings/Page.php:1881 +msgid "Synchronize Sucuri cache with this add-on." +msgstr "Synchronisez le cache Sucuri avec cet add-on." -#: inc/Engine/License/views/promo-banner.php:16 -#, php-format -msgid "%s off" -msgstr "%s d'escompte" +#: inc/Engine/Admin/Settings/Page.php:1919 +msgid "Cloudflare credentials" +msgstr "Accès Cloudflare" -#: inc/Engine/License/views/promo-banner.php:21 -#, php-format -msgid "%s promotion is live!" -msgstr "La promotion %s est en cours!" +#: inc/Engine/Admin/Settings/Page.php:1928 +msgid "Cloudflare settings" +msgstr "Réglages Cloudflare" -#: inc/Engine/License/views/promo-banner.php:27 -msgid "Hurry Up! Deal ends in:" -msgstr "Dépêchez-vous! La promotion se termine dans :" +#: inc/Engine/Admin/Settings/Page.php:1942 +msgctxt "Cloudflare" +msgid "Global API key:" +msgstr "Clé d’API globale :" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 -msgid "Minutes" -msgstr "Minutes" +#: inc/Engine/Admin/Settings/Page.php:1943 +msgctxt "Cloudflare" +msgid "Find your API key" +msgstr "Trouver votre clé d’API" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 -msgid "Seconds" -msgstr "secondes" +#: inc/Engine/Admin/Settings/Page.php:1955 +msgctxt "Cloudflare" +msgid "Account email" +msgstr "Courriel du compte" -#: inc/Engine/License/views/promo-banner.php:34 -#: inc/Engine/License/views/upgrade-section.php:11 -msgid "Upgrade now" -msgstr "Rehausser maintenant" +#: inc/Engine/Admin/Settings/Page.php:1964 +msgctxt "Cloudflare" +msgid "Zone ID" +msgstr "Identifiant de zone" -#: inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 -#: inc/admin/ui/notices.php:739 -#: views/settings/page-sections/dashboard.php:46 -msgid "Dismiss this notice" -msgstr "Ne pas tenir compte de cet avertissement." +#: inc/Engine/Admin/Settings/Page.php:1974 +msgid "Development mode" +msgstr "Mode développement" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 -msgid "The Optimize CSS Delivery feature is disabled." -msgstr "L'option Optimiser le chargement du CSS est désactivée." +#. translators: %1$s = link opening tag, %2$s = link closing tag. +#: inc/Engine/Admin/Settings/Page.php:1976 +msgid "" +"Temporarily activate development mode on your website. This setting will " +"automatically turn off after 3 hours. %1$sLearn more%2$s" +msgstr "" +"Active temporairement le mode développement sur votre site. Ce réglage se " +"désactivera automatiquement après 3 heures. %1$sEn savoir plus%2$s" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 -msgid "You can no longer use the Remove Unused CSS or Load CSS asynchronously options." -msgstr "Vous ne pouvez plus utiliser les options Supprimer les ressources CSS inutilisées ou Chargement asynchrone du CSS." +#: inc/Engine/Admin/Settings/Page.php:1984 +msgid "Optimal settings" +msgstr "Réglages optimaux" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 -#, php-format -msgid "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, which addresses a PageSpeed Insights recommendation and improves your page performance." -msgstr "Vous avez besoin d'une %1$slicence active%2$s pour continuer à optimiser le chargement de votre CSS, ce qui répond à une recommandation de PageSpeed Insights et améliore les performances de vos pages." +#: inc/Engine/Admin/Settings/Page.php:1985 +msgid "" +"Automatically enhances your Cloudflare configuration for speed, performance " +"grade and compatibility." +msgstr "" +"Améliore automatiquement votre configuration Cloudflare pour la rapidité de " +"chargement, les notes de performance et la compatibilité." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 -msgid "Renew now" -msgstr "Renouveler maintenant" +#: inc/Engine/Admin/Settings/Page.php:1993 +msgid "Relative protocol" +msgstr "Relatif au protocole" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 -msgid "You will soon lose access to some features" -msgstr "Vous perdrez bientôt l'accès à certaines options" +#: inc/Engine/Admin/Settings/Page.php:1994 +msgid "" +"Should only be used with Cloudflare's flexible SSL feature. URLs of static " +"files (CSS, JS, images) will be rewritten to use // instead of http:// or " +"https://." +msgstr "" +"Ne devrait être utilisé qu’avec la fonction Flexible SSL de Cloudflare. Les " +"URLs de vos fichiers statiques (CSS, JS, images) seront ré-écrits pour " +"utiliser // au lieu de http:// ou https://." -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 -#, php-format -msgid "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." -msgstr "Vous avez besoin d'une %1$slicence active pour continuer à optimiser le chargement de votre CSS%2$s." +#: inc/Engine/Admin/Settings/Page.php:2032 +msgid "Sucuri credentials" +msgstr "Accès Sucuri" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 -msgid "The Remove Unused CSS and Load CSS asynchronously features are great options to address the PageSpeed Insights recommendations and improve your website performance." -msgstr "Les options Supprimer les ressources CSS inutilisées et Chargement Asynchrone du CSS sont des options intéressantes pour répondre aux recommandations de PageSpeed Insights et améliorer les performances de votre site Web." +#: inc/Engine/Admin/Settings/Page.php:2045 +msgctxt "Sucuri" +msgid "" +"Firewall API key (for plugin), must be in format {32 characters}/{32 " +"characters}:" +msgstr "" +"La clé API du pare-feu (pour cette extension) doit être au format {32 " +"caractères}/{32 caractères} :" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 -#, php-format -msgid "They will be %1$sautomatically disabled on %3$s%2$s." -msgstr "Elles seront %1$sautomatiquement désactivées le %3$s%2$s." +#: inc/Engine/Admin/Settings/Page.php:2046 +msgctxt "Sucuri" +msgid "Find your API key" +msgstr "Trouver votre clé d’API" -#: inc/Engine/License/views/renewal-expired-banner.php:11 -msgid "Your WP Rocket license is expired!" -msgstr "Votre licence WP Rocket est expirée!" +#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: +#. opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 +msgid "" +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " +"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " +"more about it." +msgstr "" +"%1$sWP Rocket :%2$s le plugin a été mis à jour vers la version 3.17. " +"Nouvelle fonctionnalité : %3$s Rendu différé automatique %4$s. Consultez " +"notre documentation pour en savoir plus." -#: inc/Engine/License/views/renewal-expired-banner.php:18 -#, php-format -msgid "Your website could be much faster if it could take advantage of our %1$snew features and enhancements%2$s. 🚀" -msgstr "Votre site web pourrait être beaucoup plus rapide s'il pouvait profiter de nos %1$s nouvelles fonctionnalités et améliorations%2$s.🚀" +#: inc/Engine/Admin/Settings/Settings.php:361 +msgid "" +"Sucuri Add-on: The API key for the Sucuri firewall must be in format " +"{32 characters}/{32 characters}." +msgstr "" +"Ajout Sucuri : la clé d'API pour le pare-feu Sucuri doit être au format " +"{32 caractères}/{32 caractères}." -#: inc/Engine/License/views/renewal-soon-banner.php:22 -#, php-format -msgid "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access to product updates and support." -msgstr "Votre %1$slicence WP Rocket est sur le point d'expirer%2$s : vous perdrez bientôt l'accès aux mises à jour et au support." +#: inc/Engine/Admin/Settings/Settings.php:667 +msgid "" +"Sorry! Adding /(.*) in Advanced Rules > Never Cache URL(s) was not saved " +"because it disables caching and optimizations for every page on your site." +msgstr "" +"Désolé ! L'ajout de /(.*) dans Règles avancées > Ne jamais mettre en cache " +"ces URL(s) n'a pas été sauvegardé car cette valeur désactive le cache et les" +" optimisations sur toutes les pages du site." -#: inc/Engine/License/views/upgrade-popin.php:12 -msgid "Speed Up More Websites" -msgstr "Accélérez plus de sites web" +#: inc/Engine/Admin/Settings/Subscriber.php:174 +msgid "Import, Export, Rollback" +msgstr "Import, export, restauration" -#: inc/Engine/License/views/upgrade-popin.php:19 -#, php-format -msgid "You can use WP Rocket on more websites by upgrading your license. To upgrade, simply pay the %1$sprice difference%2$s between your current and new licenses, as shown below." -msgstr "Vous pouvez utiliser WP Rocket sur plus de sites web en rehaussant votre licence. Pour rehausser, simplement payer la %1$sdifférence de prix %2$s entre votre licence actuelle et la nouvelle, tel que montré ci-dessous." +#: inc/Engine/Admin/Settings/Subscriber.php:199 +#: views/settings/page-sections/imagify.php:14 +msgid "Image Optimization" +msgstr "Optimisation des images" -#: inc/Engine/License/views/upgrade-popin.php:25 -#, php-format -msgid "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" -msgstr "%1$sP.S.%2$s: rehausser votre licence ne change pas votre date de renouvellement." +#: inc/Engine/Admin/Settings/Subscriber.php:200 +msgid "Compress your images" +msgstr "Compresser vos images" -#: inc/Engine/License/views/upgrade-popin.php:35 -#, php-format -msgid "Save $%s" -msgstr "Sauvegarder $%s" +#: inc/Engine/Admin/Settings/Subscriber.php:217 +#: views/settings/page-sections/tutorials.php:48 +msgid "Tutorials" +msgstr "Tutoriels" -#: inc/Engine/License/views/upgrade-popin.php:48 -#, php-format -msgid "%s websites" -msgstr "%s sites web" +#: inc/Engine/Admin/Settings/Subscriber.php:218 +msgid "Getting started and how to videos" +msgstr "Bien démarrer et vidéos d'assistance" -#: inc/Engine/License/views/upgrade-popin.php:54 -#, php-format -msgid "Upgrade to %s" -msgstr "Rehausser à %s" +#: inc/Engine/Cache/PurgeExpired/Subscriber.php:75 +msgid "WP Rocket Expired Cache Interval" +msgstr "Intervalle d'expiration du cache WP Rocket" -#: inc/Engine/License/views/upgrade-section.php:11 -msgid "You can use WP Rocket on more websites by upgrading your license (you will only pay the price difference between your current and new licenses)." -msgstr "Vous pouvez utiliser WP Rocket sur plus de sites web en rehaussant votre licence (vous ne payerez que la différence de prix entre votre licence courante et la nouvelle)." +#: inc/Engine/Cache/WPCache.php:338 +msgid "WP_CACHE value" +msgstr "Valeur de WP_CACHE" -#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:101 -msgid "You need an active license to get the latest version of the lists from our server." -msgstr "Vous devez avoir une licence active pour obtenir la dernière version des listes de notre serveur." +#: inc/Engine/Cache/WPCache.php:355 +msgid "Cache" +msgstr "Cache" -#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:115 -msgid "Could not get updated lists from server." -msgstr "Impossible d'obtenir les listes mises à jour depuis le serveur." +#: inc/Engine/Cache/WPCache.php:359 +msgid "" +"The WP_CACHE constant needs to be set to true for WP Rocket cache to work " +"properly" +msgstr "" +"La constante WP_CACHE doit être à \"true\" pour que le cache de WP Rocket " +"fonctionne correctement" -#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:124 -msgid "Lists are up to date." -msgstr "Les listes sont à jour." +#: inc/Engine/Cache/WPCache.php:368 +msgid "WP_CACHE is set to true" +msgstr "WP_CACHE est à \"true\"" -#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:133 -msgid "Could not update lists." -msgstr "Impossible de mettre à jour les listes." +#: inc/Engine/Cache/WPCache.php:376 +msgid "WP_CACHE is not set" +msgstr "WP_CACHE n'est pas défini" -#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:142 -msgid "Lists are successfully updated." -msgstr "Les listes ont été mises à jour avec succès." +#: inc/Engine/Cache/WPCache.php:384 +msgid "WP_CACHE is set to false" +msgstr "WP_CACHE est à \"false\"" -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:131 -#: views/settings/page-sections/dashboard.php:188 -msgid "Clear Used CSS" -msgstr "Vider le CSS utilisé" +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 +msgid "Next Billing Date" +msgstr "Prochaine date de facturation" -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:219 -#, php-format -msgid "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing your pages." -msgstr "%1$s: Veuillez patienter %2$s secondes. Le service Supprimer les ressources CSS inutilisées analyse vos pages." +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 +msgid "No Subscription" +msgstr "Aucun abonnement" -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:264 -#, php-format -msgid "%1$s: The Used CSS of your homepage has been processed. WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." -msgstr "%1$s: Le CSS utilisé de votre page d'accueil a été généré. WP Rocket va continuer de générer le CSS jusqu'à %2$s URLs par %3$s seconde(s)." +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 +msgid "Your RocketCDN subscription is currently active." +msgstr "Votre abonnement à RocketCDN est présentement activé." -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:273 -#, php-format -msgid "We suggest enabling %1$sPreload%2$s for the fastest results." -msgstr "Nous vous suggérons d'activer le %1$sPréchargement%2$s pour obtenir des résultats plus rapides." +#. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing +#. tag. +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 +msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." +msgstr "Pour utiliser RocketCDN, remplacer votre CNAME avec %1$s%2$s%3$s." -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:283 -#, php-format -msgid "To learn more about the process check our %1$sdocumentation%2$s." -msgstr "Pour en apprendre plus sur le processus, consultez notre %1$sdocumentation%2$s." +#. translators: %1$is = opening link tag, %2$s = closing link tag. +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 +#: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 +#: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 +msgid "%1$sMore Info%2$s" +msgstr "%1$sPlus d'Info%2$s" -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:481 -msgid "We couldn't generate the used CSS because you're using a nulled version of WP Rocket. You need an active license to use the Remove Unused CSS feature and further improve your website's performance." -msgstr "Nous n'avons pas pu générer le CSS utilisé car vous utilisez une version piratée de WP Rocket. Vous avez besoin d'une licence active pour utiliser l'option Supprimer les CSS inutilisés et améliorer davantage les performances de votre site Web." +#: inc/Engine/CDN/RocketCDN/APIClient.php:134 +msgid "" +"We could not fetch the current price because RocketCDN API returned an " +"unexpected error code." +msgstr "" +"Nous n'avons pas pu récupérer le prix actuel car l'API RocketCDN a renvoyé " +"un code d'erreur inattendu." -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:484 -#, php-format -msgid "Click here to get a WP Rocket single license at %1$s off!" -msgstr "Cliquez ici pour obtenir une licence Single de WP Rocket à moins %1$s !" +#: inc/Engine/CDN/RocketCDN/APIClient.php:140 +msgid "RocketCDN is not available at the moment. Please retry later." +msgstr "" +"RocketCDN n'est pas disponible pour le moment. Veuillez réessayer plus tard." -#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:521 -#, php-format -msgid "Could not create the %2$s table in the database which is necessary for the Remove Unused CSS feature to work. Please reach out to our support." -msgstr "Il n'a pas été possible de créer la table %2$s dans la base de données, qui est nécessaire pour que Supprimer les ressources CSS inutilisées fonctionne. Veuillez contacter notre support." +#: inc/Engine/CDN/RocketCDN/APIClient.php:177 +msgid "RocketCDN cache purge failed: Missing identifier parameter." +msgstr "" +"La purge du cache RocketCDN a échoué : identifiant de réglage manquant." -#: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:322 -#, php-format -msgid "%1$s: Used CSS option is not enabled!" -msgstr "%1$s: L'option du CSS utilisé n'est pas activée!" +#: inc/Engine/CDN/RocketCDN/APIClient.php:186 +msgid "RocketCDN cache purge failed: Missing user token." +msgstr "" +"La purge du cache RocketCDN a échoué : identifiant d'utilisateur manquant." -#: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:343 -#, php-format -msgid "%1$s: Used CSS cache cleared!" -msgstr "%1$s: Cache du CSS utilisé vidée!" +#: inc/Engine/CDN/RocketCDN/APIClient.php:212 +msgid "" +"RocketCDN cache purge failed: The API returned an unexpected response code." +msgstr "" +"La purge du cache RocketCDN a échoué : l'API a retourné un code de réponse " +"inattendu." -#: inc/Engine/Optimization/RUCSS/Controller/UsedCSS.php:776 -msgid "Clear Used CSS of this URL" -msgstr "Nettoyer le CSS utilisé pour cet URL" +#: inc/Engine/CDN/RocketCDN/APIClient.php:221 +msgid "RocketCDN cache purge failed: The API returned an empty response." +msgstr "" +"La purge du cache RocketCDN a échoué : l'API a retourné une réponse vide." -#: inc/Engine/Optimization/RUCSS/Cron/Subscriber.php:160 -msgid "WP Rocket Remove Unused CSS pending jobs" -msgstr "Tâches en attente de l’option Supprimer les ressources CSS inutilisées de WP Rocket" +#: inc/Engine/CDN/RocketCDN/APIClient.php:230 +msgid "RocketCDN cache purge failed: The API returned an unexpected response." +msgstr "" +"La purge du cache RocketCDN a échoué : l'API a retourné une réponse " +"inattendue." -#: inc/Engine/Plugin/UpdaterApiTools.php:32 -#: inc/deprecated/3.3.php:761 -#: inc/deprecated/3.3.php:770 -#, php-format -msgid "An unexpected error occurred. Something may be wrong with WP-Rocket.me or this server’s configuration. If you continue to have problems, contact support." -msgstr "Une erreur inattendue s’est produite. Quelque chose ne va pas avec WP-Rocket.me ou avec la configuration de ce serveur. Si vous continuez à avoir des problèmes, contactez notre soutien technique." - -#: inc/Engine/Plugin/UpdaterSubscriber.php:472 -#: inc/Engine/Plugin/UpdaterSubscriber.php:486 -#: inc/classes/class-wp-rocket-requirements-check.php:203 -#: inc/classes/class-wp-rocket-requirements-check.php:214 -#: inc/deprecated/3.11.php:236 -#: inc/deprecated/3.11.php:251 -#, php-format -msgid "%s Update Rollback" -msgstr "Retour à la version %s" +#. translators: %s = message returned by the API. +#: inc/Engine/CDN/RocketCDN/APIClient.php:239 +msgid "RocketCDN cache purge failed: %s." +msgstr "La purge du cache RocketCDN a échoué : %s." -#: inc/Engine/Plugin/UpdaterSubscriber.php:509 -#: inc/deprecated/3.11.php:279 -#, php-format -msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" -msgstr "%1$sRetourner à WP Rocket%2$s ou %3$saller à la page des extensions%2$s" +#: inc/Engine/CDN/RocketCDN/APIClient.php:247 +msgid "RocketCDN cache purge successful." +msgstr "La purge du cache de RocketCDN a été effectuée avec succès." -#: inc/Engine/Preload/Admin/Settings.php:57 -#, php-format -msgid "%1$s: The preload service is now active. After the initial preload it will continue to cache all your pages whenever they are purged. No further action is needed." -msgstr "%1$s: Le Préchargement est maintenant actif. Après le préchargement initial, il continuera à mettre en cache toutes vos pages chaque fois qu'elles seront purgées. Aucune autre action n'est nécessaire." +#: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:137 +#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/enable.php:72 +#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerEnableRoute.php:302 +msgid "RocketCDN enabled" +msgstr "RocketCDN activé" -#: inc/Engine/Preload/Cron/Subscriber.php:138 -msgid "WP Rocket Preload pending jobs" -msgstr "Tâches en attente de l'option Préchargement de WP Rocket" +#: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:160 +#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/disable.php:31 +#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerDisableRoute.php:147 +msgid "RocketCDN disabled" +msgstr "RocketCDN désactivé" -#: inc/ThirdParty/Hostings/Cloudways.php:82 -#, php-format -msgid "Varnish auto-purge will be automatically enabled once Varnish is enabled on your %s server." -msgstr "La purge automatiquement de Varnish sera automatiquement activée lorsque Varnish sera activé sur votre %s serveur." +#. Translators: %s = date formatted using date_i18n() and get_option( +#. 'date_format' ). +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 +msgid "Valid until %s only!" +msgstr "Valide seulement jusqu'à %s!" -#: inc/ThirdParty/Hostings/Kinsta.php:158 -#, php-format -msgid "Your installation seems to be missing core Kinsta files managing Cache clearing, which will prevent your Kinsta installation and WP Rocket from working correctly. Please get in touch with Kinsta support through your %1$sMyKinsta%2$s account to resolve this issue." -msgstr "Des fichiers Kinsta de base, gérant l'effacement du cache et du CDN, semblent manquer dans votre installation, ce qui empêchera Kinsta et WP Rocket de fonctionner correctement. Veuillez contacter le support Kinsta via votre compte %1$sMyKinsta%2$s pour résoudre ce problème." +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 +msgid "Speed up your website thanks to:" +msgstr "Accélérez votre site web grâce à :" -#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:114 -#, php-format -msgid "%1$s: Cloudflare's HTTP/2 Server Push is incompatible with the features of Remove Unused CSS and Combine CSS files. We strongly recommend disabling it." -msgstr "%1$s: Le Server Push HTTP/2 de Cloudflare est incompatible avec les options Supprimer les ressources CSS inutilisées et Combiner les fichier CSS. Nous vous recommandons vivement de la désactiver." +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 +msgid "" +"High performance Content Delivery Network (CDN) with %1$sunlimited " +"bandwidth%2$s" +msgstr "" +"CDN (Content Delivery Network) de haute performance à %1$sbande passante " +"illimitée%2$s" -#: inc/ThirdParty/Plugins/ModPagespeed.php:102 -#, php-format -msgid "%1$s: Mod PageSpeed is not compatible with this plugin and may cause unexpected results. %2$sMore Info%3$s" -msgstr "%1$s: Mod PageSpeed n'est pas compatible avec cette extension et peut causer des résultats inattendus. %2$sPlus d'Info%3$s" +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 +msgid "" +"Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" +msgstr "" +"Configuration simplifiée : les %1$smeilleurs réglages CDN%2$s sont " +"automatiquement appliqués" -#: inc/ThirdParty/Plugins/Optimization/Autoptimize.php:76 -#, php-format -msgid "%1$sWP Rocket: %2$sWe have detected that Autoptimize's JavaScript Aggregation feature is enabled. WP Rocket's Delay JavaScript Execution will not be applied to the file it creates. We suggest disabling %1$sJavaScript Aggregation%2$s to take full advantage of Delay JavaScript Execution." -msgstr "%1$sWP Rocket : %2$sNous avons détecté que l'option Concaténer les fichiers JS d'Autoptimize est activée. L'option Reporter l'exécution JavaScript de WP Rocket ne sera pas appliquée au fichier qu'elle crée. Nous vous suggérons de désactiver %1$sConcaténer les fichiers JS%2$s pour profiter pleinement de Reporter l'exécution JavaScript." +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 +msgid "" +"WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in" +" our plugin" +msgstr "" +"Intégration WP Rocket : l'option CDN est %1$sautomatiquement configurée%2$s " +"dans notre extension" -#: inc/ThirdParty/Plugins/Optimization/Autoptimize.php:131 -#, php-format -msgid "%1$sWP Rocket: %2$sWe have detected that Autoptimize's Aggregate Inline CSS feature is enabled. WP Rocket's Load CSS Asynchronously will not work correctly. We suggest disabling %1$sAggregate Inline CSS%2$s to take full advantage of Load CSS Asynchronously Execution." -msgstr "%1$sWP Rocket : %2$sNous avons détecté que l'option Concaténer le CSS inline d'Autoptimize est activée. L'option Chargement Asychrone du CSS de WP Rocket ne sera pas appliquée au fichier qu'elle crée. Nous vous suggérons de désactiver %1$sConcaténer le CSS inline%2$s pour profiter pleinement du Chargement Asychrone du CSS." +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 +msgid "Learn more about RocketCDN" +msgstr "En savoir plus sur RocketCDN" -#: inc/ThirdParty/Plugins/Optimization/Ezoic.php:45 -#, php-format -msgid "This plugin blocks WP Rocket's caching and optimizations. Deactivate it and use %1$sEzoic's nameserver integration%2$s instead." -msgstr "Cette extension empêche la mise en cache et les optimisations de WP Rocket. Désactivez-la et utilisez %1$sl'intégration du serveur de noms d'Ezoic%2$s à la place." +#. translators: %1$s = discounted price, %2$s = regular price. +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 +msgid "" +"*$%1$s/month for 12 months then $%2$s/month. You can cancel your " +"subscription at any time." +msgstr "" +"*%1$s$/mois pour 12 mois puis %2$s$/mois. Vous pouvez résilier votre " +"abonnement à tout moment." -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:78 -#, php-format -msgctxt "Hummingbird notice" -msgid "Please deactivate the following %s option which conflicts with WP Rocket features:" -msgid_plural "Please deactivate the following %s options which conflict with WP Rocket features:" -msgstr[0] "Veuillez désactiver l'option %s qui entre en conflit avec les fonctionnalités de WP Rocket :" -msgstr[1] "Veuillez désactiver les %s options suivantes qui entrent en conflit avec les fonctionnalités de WP Rocket :" -msgstr[2] "Veuillez désactiver les %s options suivantes qui entrent en conflit avec les fonctionnalités de WP Rocket :" - -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 -#, php-format -msgctxt "Hummingbird notice" -msgid "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" -msgstr "%1$s %2$sdésactivation des emojis%3$s entre en conflit avec la %2$sdésactivation des emojis%3$s de WP Rocket" +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 +msgid "Billed monthly" +msgstr "Facturation mensuelle" -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 -#, php-format -msgctxt "Hummingbird notice" -msgid "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP compression%3$s" -msgstr "%1$s %2$scompression GZIP%3$s entre en conflit avec la %2$scompression GZIP%3$s avec WP Rocket" +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 +msgid "Get Started" +msgstr "Démarrez" -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 -#, php-format -msgctxt "Hummingbird notice" -msgid "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser caching%3$s" -msgstr "%1$s %2$scaching du fureteur%3$s entre en conflit avec le %2$scaching du fureteur%3$s de WP Rocket" +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 +msgid "Reduce this banner" +msgstr "Réduire cette bannière" -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 -#, php-format -msgctxt "Hummingbird notice" -msgid "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" -msgstr "%1$s %2$scaching de page%3$s entre en conflit le %2$spage caching%3$s de WP Rocket" +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 +msgid "" +"Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." +msgstr "" +"Accélérez votre site web avec RocketCDN, le réseau de livraison de contenu " +"de WP Rocket." -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 -#, php-format -msgctxt "Hummingbird notice" -msgid "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile optimization%3$s" -msgstr "%1$s %2$sl'optimisation des fichiers%3$s entre en conflit avec %2$sl'optimisation des fichiers%3$s de WP Rocket" +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 +#: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 +msgid "Learn More" +msgstr "En savoir plus" -#: inc/ThirdParty/Plugins/Optimization/WPMeteor.php:42 -#, php-format -msgid "Delay JS is currently activated in %1$s. If you want to use WP Rocket’s delay JS, disable %1$s" -msgstr "Le report de l'exécution des JS est activée dans %1$s. Si vous voulez utiliser le Report de l’exécution JavaScript de WP Rocket, désactivez %1$s" +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 +msgid "RocketCDN is unavailable on local domains and staging sites." +msgstr "" +"RocketCDN est indisponible pour les domaines locaux et les sites de test." -#: inc/ThirdParty/Plugins/Smush.php:108 -#: inc/ThirdParty/Plugins/Smush.php:126 -msgid "Smush" -msgstr "Smush" +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 +msgid "Get RocketCDN" +msgstr "Obtenir RocketCDN" -#: inc/ThirdParty/Themes/Avada.php:116 -msgid "Avada" -msgstr "Avada" +#: inc/Engine/CDN/RocketCDN/views/promote-notice.php:11 +msgid "New!" +msgstr "Nouveau!" -#: inc/admin/admin.php:18 -#: inc/common/admin-bar.php:255 -#: inc/deprecated/deprecated.php:1787 -msgid "Support" -msgstr "Soutien" +#: inc/Engine/CDN/RocketCDN/views/promote-notice.php:12 +msgid "" +"Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network!" +msgstr "" +"Accélérez votre site web avec RocketCDN, le réseau de livraison de contenu " +"de WP Rocket." -#: inc/admin/admin.php:20 -msgid "Docs" -msgstr "Documents" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "Trop de requêtes." -#: inc/admin/admin.php:22 -#: inc/common/admin-bar.php:243 -msgid "FAQ" -msgstr "FAQ" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "Réponse non valide." -#: inc/admin/admin.php:24 -#: inc/common/admin-bar.php:63 -msgid "Settings" -msgstr "Réglages" +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "Type de requête non valide." -#: inc/admin/admin.php:458 -msgid "Settings import failed: you do not have the permissions to do this." -msgstr "L'import des réglages a échoué : vous n'avez pas les permissions nécessaires pour faire ceci." +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 +msgid "WP Rocket process pending jobs" +msgstr "WP Rocket traite les tâches en attente" -#: inc/admin/admin.php:462 -msgid "Settings import failed: no file uploaded." -msgstr "L'import des réglages a échoué : aucun fichier téléversé." +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:204 +msgid "WP Rocket clear failed jobs" +msgstr "WP Rocket efface les tâches qui ont échoué" -#: inc/admin/admin.php:466 -msgid "Settings import failed: incorrect filename." -msgstr "L'import des réglages a échoué : nom de fichier incorrect." +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:221 +msgid "WP Rocket process on submit jobs" +msgstr "WP Rocket traite les tâches en cours" -#: inc/admin/admin.php:477 -msgid "Settings import failed: incorrect filetype." -msgstr "L'import des réglages a échoué : type de fichier incorrect." +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Priority Elements" +msgstr "Vider les Éléments prioritaires" -#: inc/admin/admin.php:487 -msgid "Settings import failed: " -msgstr "Échec de l'import des réglages :" +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Priority Elements of this URL" +msgstr "Vider les Éléments prioritaires pour cet URL" -#: inc/admin/admin.php:503 -msgid "Settings import failed: unexpected file content." -msgstr "Échec de l'import des réglages : contenu du fichier incorrect." +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Priority Elements" +msgstr "Éléments prioritaires" -#: inc/admin/admin.php:533 -msgid "Settings imported and saved." -msgstr "Réglages importés et sauvegardés." +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear" +msgstr "Vider" -#: inc/admin/options.php:127 -msgid "Defer JavaScript Files" -msgstr "Charger le JavaScript en différé" +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "" +"This action will clear the Critical Images and Lazily Rendered Content." +msgstr "Cette action videra les Images critiques et le Rendu différé." -#: inc/admin/options.php:128 -msgid "Excluded Delay JavaScript Files" -msgstr "Fichiers JavaScript exclus du report de l'éxecution" +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "%1$s : Images Critiques et Rendu différé effacés !" -#: inc/admin/options.php:150 -#, php-format -msgid "%1$s: %2$s" -msgstr "%1$s: %2$s" +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "Erreur du script" -#: inc/admin/options.php:160 -msgid "The following pattern is invalid and has been removed:" -msgid_plural "The following patterns are invalid and have been removed:" -msgstr[0] "Le modèle suivant est non-valide et a été retiré :" -msgstr[1] "Les modèles suivants sont non-valides et ont été retirés :" -msgstr[2] "Les modèles suivants sont non-valides et ont été retirés :" +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "Timeout du script" -#: inc/admin/options.php:176 -msgid "More info" -msgstr "Plus d'infos" +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "Il n'a pas été possible de déterminer une échéance valable : %s." -#: inc/admin/ui/meta-boxes.php:37 -#: inc/admin/ui/notices.php:748 -#: inc/common/admin-bar.php:84 -#: inc/common/admin-bar.php:136 -#: views/settings/page-sections/dashboard.php:150 -msgid "Clear cache" -msgstr "Vider le cache" +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 +msgid "Every minute" +msgstr "Chaque minute" -#: inc/admin/ui/meta-boxes.php:67 -msgid "WP Rocket Options" -msgstr "Options WP Rocket" +#: inc/Engine/CriticalPath/Admin/Admin.php:265 +msgid "Regenerate Critical Path CSS" +msgstr "Régénérer le CSS critique" -#: inc/admin/ui/meta-boxes.php:96 -msgid "Never cache this page" -msgstr "Ne jamais mettre en cache cette page" +#: inc/Engine/CriticalPath/Admin/Post.php:144 +#: views/cpcss/metabox/generate.php:47 +msgid "Generate Specific CPCSS" +msgstr "Générer le CPCSS spécifique" -#: inc/admin/ui/meta-boxes.php:100 -msgid "Activate these options on this post:" -msgstr "Activer ces options sur cette page :" +#: inc/Engine/CriticalPath/Admin/Post.php:145 +#: views/cpcss/metabox/generate.php:45 +msgid "Regenerate specific CPCSS" +msgstr "Regénérer le CPCSS spécifique" -#: inc/admin/ui/meta-boxes.php:103 -msgid "LazyLoad for images" -msgstr "Chargement différé des images" +#: inc/Engine/CriticalPath/Admin/Post.php:216 +msgid "This feature is not available for non-public post types." +msgstr "" +"Cette fonctionnalité n'est pas disponible pour les publications qui ne sont " +"pas publiques." -#: inc/admin/ui/meta-boxes.php:104 -msgid "LazyLoad for iframes/videos" -msgstr "Chargement différé des iframes et vidéos" +#: inc/Engine/CriticalPath/Admin/Post.php:219 +msgid "%l to use this feature." +msgstr "%l pour utiliser cette fonction." -#: inc/admin/ui/meta-boxes.php:105 -msgid "Minify CSS" -msgstr "Minifier le CSS" +#. translators: %s = post type. +#: inc/Engine/CriticalPath/Admin/Post.php:222 +msgid "Publish the %s" +msgstr "Publier le %s" -#: inc/admin/ui/meta-boxes.php:107 -msgid "Minify/combine JS" -msgstr "Minifier / combiner le JS" +#: inc/Engine/CriticalPath/Admin/Post.php:223 +msgid "Enable Load CSS asynchronously in WP Rocket settings" +msgstr "Activez Chargement Asynchrone du CSS dans les réglages de WP Rocket" -#: inc/admin/ui/meta-boxes.php:110 -msgid "Defer JS" -msgstr "Différer le JS" +#: inc/Engine/CriticalPath/Admin/Post.php:224 +msgid "Enable Load CSS asynchronously in the options above" +msgstr "Activez Chargement Asynchrone du CSS dans les options ci-dessus" -#: inc/admin/ui/meta-boxes.php:117 -#, php-format -msgid "Activate first the %s option." -msgstr "Activer d’abord l’option de %s." +#. translators: %1$s = type of content, %2$s = error message. +#: inc/Engine/CriticalPath/APIClient.php:64 +msgid "Critical CSS for %1$s not generated. Error: %2$s" +msgstr "Le CSS critique pour %1$s n'a pas été généré. Erreur : %2$s" -#: inc/admin/ui/meta-boxes.php:133 -#, php-format -msgid "%1$sNote:%2$s None of these options will be applied if this post has been excluded from cache in the global cache settings." -msgstr "%1$sNote:%2$s Aucune de ces options ne sera appliquée à ce contenu s'il a été exclu des paramètres globaux de gestion du cache." +#. translators: %s = item URL. +#: inc/Engine/CriticalPath/APIClient.php:174 +msgid "" +"Critical CSS for %1$s on mobile not generated. Error: The API returned an " +"empty response." +msgstr "" +"CSS critique aux mobiles pour %1$s non-généré. Erreur : l'API a retourné une" +" réponse vide." -#: inc/admin/ui/notices.php:31 -#: inc/admin/ui/notices.php:44 -#, php-format +#. translators: %s = item URL. +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "" -"%1$s has not been deactivated due to missing writing permissions.
\n" -"Make %2$s writeable and retry deactivation, or force deactivation now:" +"Critical CSS for %1$s not generated. Error: The API returned an empty " +"response." msgstr "" -"%1$s n'a pas été désactivé en raisons de l'absence des permissions d'écriture.
\n" -"Rendez %2$s inscriptible et réessayez de désactiver, ou forcez la désactivation maintenant :" +"CSS critique pour %1$s non généré. Erreur : l'API a retourné une réponse " +"vide." -#: inc/admin/ui/notices.php:97 -#, php-format -msgid "%s: One or more plugins have been enabled or disabled, clear the cache if they affect the front end of your site." -msgstr "%s: Une ou plusieurs extensions ont été activées ou désactivées, videz le cache si elles influent sur l’apparence de votre site." +#. translators: %s = item URL. +#: inc/Engine/CriticalPath/APIClient.php:189 +msgid "Critical CSS for %1$s on mobile not generated." +msgstr "CSS critique aux mobiles pour %1$s non-généré." -#: inc/admin/ui/notices.php:218 -#, php-format -msgid "%s: The following plugins are not compatible with this plugin and may cause unexpected results:" -msgstr "%s: Les extensions suivantes ne sont pas compatibles avec cette extension et peuvent générer des résultats inattendus :" +#. translators: %s = item URL. +#. translators: %1$s = item URL or item type. +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 +msgid "Critical CSS for %1$s not generated." +msgstr "CSS critique pour %1$s non-généré." -#: inc/admin/ui/notices.php:224 -msgid "Deactivate" -msgstr "Désactiver" +#. translators: %s = URL. +#: inc/Engine/CriticalPath/APIClient.php:199 +msgid "" +"Critical CSS for %1$s on mobile not generated. Error: The API returned an " +"invalid response code." +msgstr "" +"CSS critique aux mobiles pour %1$s non-généré. Erreur : l'API a retourné un " +"code de réponse invalide." -#: inc/admin/ui/notices.php:266 -msgid "WP Rocket Footer JS is not an official add-on. It prevents some options in WP Rocket from working correctly. Please deactivate it if you have problems." -msgstr "WP Rocket Footer JS n'est pas un ajout officiel. Il prévient certaines options dans WP Rocket de fonctionner correctement. Veuillez le désactiver si vous avez des problèmes." +#. translators: %s = URL. +#: inc/Engine/CriticalPath/APIClient.php:201 +msgid "" +"Critical CSS for %1$s not generated. Error: The API returned an invalid " +"response code." +msgstr "" +"CSS critique pour %1$s non-généré. Erreur : l'API a retourné un code de " +"réponse invalide" -#: inc/admin/ui/notices.php:306 -#, php-format -msgid "Endurance Cache is currently enabled, which will conflict with WP Rocket Cache. Please set the Endurance Cache cache level to Off (Level 0) on the %1$sSettings > General%2$s page to prevent any issues." -msgstr "Endurance Cache est présentement activé, ce qui peut causer conflit avec le cache de WP Rocket. Veuillez configurer le niveau de Endurance Cache à \"Off\" (Niveau 0) sur la page %1$sParamètres > Général%2$s afin de prévenir tout problème." +#. translators: %1$s = error message. +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 +msgid "Error: %1$s" +msgstr "Erreur : %1$s" -#: inc/admin/ui/notices.php:327 -#, php-format -msgid "%1$s: A custom permalink structure is required for the plugin to work properly. %2$sGo to permalinks settings%3$s" -msgstr "%1$s: Une structure de permalien personnalisée est requise pour que cette extension fonctionne. %2$sRendez-vous aux réglages des permaliens%3$s" +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:177 +msgid "Critical CSS generation is currently running." +msgstr "La génération du CSS critique est en cours." -#: inc/admin/ui/notices.php:374 -#, php-format -msgid "%s could not modify the .htaccess file due to missing writing permissions." -msgstr "%s n'a pas pu modifier le fichier .htaccess dû à l'absence de permissions d'écriture.." +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:182 +msgid "Go to the %1$sWP Rocket settings%2$s page to track progress." +msgstr "" +"Allez à la page des %1$sparamètres WP Rocket %2$s afin d'en suivre " +"l'évolution." -#: inc/admin/ui/notices.php:380 -#: inc/admin/ui/notices.php:843 -#, php-format -msgid "Troubleshoot: %1$sHow to make system files writeable%2$s" -msgstr "Pour résoudre le problème : %1$sComment rendre les fichiers systèmes accessible à l'écriture%2$s" +#. Translators: %1$d = number of critical CSS generated, %2$d = total number +#. of critical CSS to generate. +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:397 +msgid "" +"Critical CSS generation is currently running: %1$d of %2$d page types " +"completed. (Refresh this page to view progress)" +msgstr "" +"La génération du CSS critique est en cours : %1$d de %2$d de types de " +"contenus complétés. (Rafraîchir pour voir la progression)" -#: inc/admin/ui/notices.php:382 -#: inc/admin/ui/notices.php:845 -msgid "https://docs.wp-rocket.me/article/626-how-to-make-system-files-htaccess-wp-config-writeable/?utm_source=wp_plugin&utm_medium=wp_rocket" -msgstr "https://fr.docs.wp-rocket.me/article/945-fichiers-systemes-accessible-ecriture/?utm_source=wp_plugin&utm_medium=wp_rocket" +#. Translators: %1$d = number of critical CSS generated, %2$d = total number +#. of critical CSS to generate. +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:473 +msgid "Critical CSS generation finished for %1$d of %2$d page types." +msgstr "" +"La génération du CSS critique est terminée pour %1$d des %2$d types de " +"contenus." -#: inc/admin/ui/notices.php:388 -msgid "Don’t worry, WP Rocket’s page caching and settings will still function correctly." -msgstr "Pas d'inquiétude, la mise en cache de pages et les paramètres fonctionneront correctement." +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:480 +msgid "Critical CSS generation encountered one or more errors." +msgstr "La génération du CSS critique a rencontré une ou plusieurs erreur(s)." -#: inc/admin/ui/notices.php:388 -msgid "For optimal performance, adding the following lines into your .htaccess is recommended (not required):" -msgstr "Pour une performance optimale, il est recommandé d'ajouter les lignes suivantes à votre fichier .htaccess (optionnel) :" +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:480 +msgid "Learn more." +msgstr "En savoir plus." -#: inc/admin/ui/notices.php:535 -#, php-format -msgid "%1$s is good to go! %2$sTest your load time%4$s, or visit your %3$ssettings%4$s." -msgstr "%1$s est prêt à décoller ! %2$sTestez votre temps de chargement%4$s, ou jetez un oeil aux %3$sréglages%4$s." +#. translators: %1$ = opening bold tag, %2$ = closing bold tag. +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:841 +msgid "" +"We highly recommend the %1$supdated Remove Unused CSS%2$s for a better CSS " +"optimization. Load CSS Asynchronously is always available as a back-up." +msgstr "" +"Nous recommandons vivement %1$sSupprimer les ressources CSS inutilisées%2$s " +"pour une meilleure optimisation CSS. Le Chargement Asynchrone du CSS est " +"toujours disponible comme solution de secours." -#: inc/admin/ui/notices.php:576 -msgid "Would you allow WP Rocket to collect non-sensitive diagnostic data from this website?" -msgstr "Autorisez-vous WP Rocket à recueillir des données de diagnostic non-sensibles de ce site web ?" +#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:846 +msgid "Stay with the old option" +msgstr "Garder l'ancienne option" -#: inc/admin/ui/notices.php:577 -msgid "This would help us to improve WP Rocket for you in the future." -msgstr "Cela nous aiderait à améliorer WP Rocket pour vous dans le futur." +#. translators: %s = item URL. +#: inc/Engine/CriticalPath/DataManager.php:68 +msgid "" +"Critical CSS for %1$s on mobile not generated. Error: The destination folder" +" could not be created." +msgstr "" +"CSS critique pour %1$s sur mobile non-généré. Erreur : Le répertoire de " +"destination n'a pas pu être créé." -#: inc/admin/ui/notices.php:583 -msgid "What info will we collect?" -msgstr "Quelles infos recueillerons-nous ?" +#. translators: %s = item URL. +#: inc/Engine/CriticalPath/DataManager.php:71 +msgid "" +"Critical CSS for %1$s not generated. Error: The destination folder could not" +" be created." +msgstr "" +"CSS critique pour %1$s non-généré. Erreur : Le répertoire de destination n'a" +" pu être créé." -#: inc/admin/ui/notices.php:588 -msgid "Below is a detailed view of all data WP Rocket will collect if granted permission. WP Rocket will never transmit any domain names or email addresses (except for license validation), IP addresses, or third-party API keys." -msgstr "Vous trouverez ci-dessous une vue détaillée de toutes les données que WP Rocket recueillera si vous nous le permettez. WP Rocket ne transmettra jamais de noms de domaine ou d'adresses courriel (sauf pour la validation de licence), d'adresses IP ou de clés d’API tierce-partie." +#: inc/Engine/CriticalPath/DataManager.php:106 +msgid "Critical CSS file for mobile does not exist" +msgstr "Fichier critique CSS pour mobiles n'existe pas" -#: inc/admin/ui/notices.php:597 -msgid "Yes, allow" -msgstr "Oui, autoriser" +#: inc/Engine/CriticalPath/DataManager.php:108 +msgid "Critical CSS file does not exist" +msgstr "Fichier critique CSS n'existe pas" -#: inc/admin/ui/notices.php:600 -msgid "No, thanks" -msgstr "Non, merci" +#: inc/Engine/CriticalPath/DataManager.php:120 +msgid "Critical CSS file for mobile cannot be deleted" +msgstr "Fichier critique CSS pour mobiles ne peut être effacé" -#: inc/admin/ui/notices.php:639 -msgid "Thank you!" -msgstr "Merci!" +#: inc/Engine/CriticalPath/DataManager.php:122 +msgid "Critical CSS file cannot be deleted" +msgstr "Fichier critique CSS ne peut être effacé" -#: inc/admin/ui/notices.php:644 -msgid "WP Rocket now collects these metrics from your website:" -msgstr "WP Rocket recueille désormais ces données de votre site web :" +#. translators: %1$s = item URL or item type. +#: inc/Engine/CriticalPath/ProcessorService.php:189 +msgid "Mobile Critical CSS for %1$s not generated." +msgstr "Le CSS critique aux mobiles pour %1$s n'a pas été généré." -#: inc/admin/ui/notices.php:682 -#, php-format -msgid "%s: Cache cleared." -msgstr "%s : Cache vidé." +#. translators: %1$s = Item URL or item type. +#: inc/Engine/CriticalPath/ProcessorService.php:230 +msgid "Critical CSS for %s in progress." +msgstr "Le CSS critique pour %s est en cours." -#: inc/admin/ui/notices.php:689 -#, php-format -msgid "%s: Post cache cleared." -msgstr "%s : Cache des articles vidé." +#. translators: %1$s = Item URL or item type. +#: inc/Engine/CriticalPath/ProcessorService.php:264 +msgid "Mobile Critical CSS for %s generated." +msgstr "Le CSS critique aux mobiles pour %s est généré." -#: inc/admin/ui/notices.php:696 -#, php-format -msgid "%s: Term cache cleared." -msgstr "%s : Cache des termes vidé." +#. translators: %1$s = Item URL or item type. +#: inc/Engine/CriticalPath/ProcessorService.php:275 +msgid "Critical CSS for %s generated." +msgstr "Le CSS critique pour %s a été généré." -#: inc/admin/ui/notices.php:703 -#, php-format -msgid "%s: User cache cleared." -msgstr "%s : Cache des utilisateurs vidé." +#: inc/Engine/CriticalPath/ProcessorService.php:297 +msgid "Critical CSS file deleted successfully." +msgstr "Fichier de CSS critique effacé avec succès" -#: inc/admin/ui/notices.php:751 -msgid "Stop Preload" -msgstr "Cesser le pré-chargement" +#. translators: %1$s = Item URL or item type. +#: inc/Engine/CriticalPath/ProcessorService.php:319 +msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." +msgstr "" +"Délai d'attente du CSS critique aux mobiles pour %1$s. Veuillez essayer de " +"nouveau plus tard." -#: inc/admin/ui/notices.php:781 -msgid "Force deactivation " -msgstr "Forcer la désactivation " +#. translators: %1$s = Item URL or item type. +#: inc/Engine/CriticalPath/ProcessorService.php:332 +msgid "Critical CSS for %1$s timeout. Please retry a little later." +msgstr "" +"Délai d'attente pour le CSS critique pour %1$s. Veuillez essayer de nouveau " +"plus tard." -#: inc/admin/ui/notices.php:800 -msgid "The following code should have been written to this file:" -msgstr "Le code suivant aurait dû être écrit dans ce fichier :" +#: inc/Engine/CriticalPath/RESTWP.php:141 +msgid "Mobile CPCSS generation not enabled." +msgstr "Génération du CPCSS pour mobiles non-activé" -#: inc/admin/ui/notices.php:831 -#, php-format -msgid "%s cannot configure itself due to missing writing permissions." -msgstr "%s ne peut pas s’auto-configurer en raison de l'absence de permissions en écriture." +#: inc/Engine/CriticalPath/RESTWPPost.php:36 +#: inc/Engine/CriticalPath/RESTWPPost.php:69 +msgid "Requested post does not exist." +msgstr "L'article demandé n'existe pas" -#: inc/admin/ui/notices.php:837 -#, php-format -msgid "Affected file/folder: %s" -msgstr "Fichier/dossier affecté : %s" +#: inc/Engine/CriticalPath/RESTWPPost.php:46 +msgid "Cannot generate CPCSS for unpublished post." +msgstr "Impossible de générer le CPCSS pour les articles non-publiés" -#: inc/classes/admin/class-logs.php:124 -msgid "The debug file could not be deleted." -msgstr "Le fichier de debug n'a pu être effacé." +#: inc/Engine/HealthCheck/HealthCheck.php:142 +msgid "Scheduled Cache Purge" +msgstr "Purge planifiée de la cache" -#: inc/classes/class-wp-rocket-requirements-check.php:147 -#, php-format -msgid "To function properly, %1$s %2$s requires at least:" -msgstr "Pour fonctionner correctement, %1$s %2$s nécessite au moins :" +#: inc/Engine/HealthCheck/HealthCheck.php:143 +msgid "Scheduled Database Optimization" +msgstr "Optimisation planifiée de la base de données" -#: inc/classes/class-wp-rocket-requirements-check.php:151 -#, php-format -msgid "PHP %1$s. To use this WP Rocket version, please ask your web host how to upgrade your server to PHP %1$s or higher." -msgstr "PHP %1$s. Pour utiliser cette version de WP Rocket, demandez à votre hébergeur comment mettre à niveau votre serveur vers PHP %1$s ou supérieur." +#: inc/Engine/HealthCheck/HealthCheck.php:144 +msgid "Database Optimization Process" +msgstr "Processus d'optimisation de la base de données" -#: inc/classes/class-wp-rocket-requirements-check.php:156 -#, php-format -msgid "WordPress %1$s. To use this WP Rocket version, please upgrade WordPress to version %1$s or higher." -msgstr "WordPress %1$s. Pour utiliser cette version de WP Rocket, mettez à jour WordPress à la version %1$s ou plus récente." +#: inc/Engine/HealthCheck/HealthCheck.php:145 +msgctxt "noun" +msgid "Preload" +msgstr "Préchargement" -#: inc/classes/class-wp-rocket-requirements-check.php:159 -msgid "If you are not able to upgrade, you can rollback to the previous version by using the button below." -msgstr "Si vous n'êtes pas en mesure d’effectuer le rehaussement, vous pouvez restaurer WP Rocket à sa version précédente en utilisant le bouton ci-dessous." +#: inc/Engine/HealthCheck/HealthCheck.php:146 +msgid "Critical Path CSS Generation Process" +msgstr "Processus de génération du CSS pour chemin critique" -#: inc/classes/class-wp-rocket-requirements-check.php:161 -#: inc/deprecated/deprecated.php:1947 -#, php-format -msgid "Re-install version %s" -msgstr "Réinstaller la version %s" +#. translators: %1$s = , %2$s = price, %3$s = . +#: inc/Engine/License/Renewal.php:76 +msgid "Renew before it is too late, you will only pay %1$s%2$s%3$s!" +msgstr "" +"Renouvelez avant qu'il ne soit trop tard, vous ne payerez que %1$s%3$s%2$s." -#: inc/classes/dependencies/wp-media/background-processing/wp-background-process.php:447 -#, php-format -msgid "Every %d Minutes" -msgstr "Toutes les %d minutes" +#. translators: %1$s = , %2$s = discount, %3$s = ,%4$s = +#. , %5$s = price, %6$s=. +#: inc/Engine/License/Renewal.php:85 +msgid "" +"Renew with a %1$s%2$s discount%3$s before it is too late, you will only pay " +"%4$s%5$s%6$s!" +msgstr "" +"Renouvelez maintenant avant qu'il ne soit trop tard et profitez d'une " +"%1$sréduction de %2$s %3$s, vous ne paierez que %4$s%6$s%5$s !" -#: inc/classes/logger/class-logger.php:260 -#: inc/classes/logger/class-logger.php:292 -msgid "The log file does not exist." -msgstr "Le fichier de log n'existe pas." +#. translators: %1$s = , %2$s = , %3$s = price. +#: inc/Engine/License/Renewal.php:139 +msgid "Renew your license for 1 year now at %1$s%3$s%2$s." +msgstr "Renouvelez votre licence pour 1 an maintenant à %1$s%3$s%2$s." -#: inc/classes/logger/class-logger.php:266 -#: inc/classes/logger/class-logger.php:298 -msgid "The log file could not be read." -msgstr "Le fichier de log n'a pu être lu." +#. translators: %1$s = , %2$s = , %3$s = discount percentage, +#. %4$s = price. +#: inc/Engine/License/Renewal.php:152 +msgid "" +"Renew your license for 1 year now and get %1$s%3$s OFF%2$s immediately: you " +"will only pay %1$s%4$s%2$s!" +msgstr "" +"Renouvelez votre licence pour 1 an et bénéficiez d’une réduction immédiate " +"%1$sde %3$s%2$s: vous ne paierez que %1$s%4$s%2$s!" -#: inc/classes/logger/class-logger.php:285 -msgid "The logs are not saved into a file." -msgstr "Les logs n'ont pu être sauvés dans un fichier." +#. translators: %1$s = , %2$s = , %3$s = discount price. +#: inc/Engine/License/Renewal.php:218 +msgid "Renew before it is too late, you will pay %1$s%3$s%2$s." +msgstr "Renouvelez avant qu'il ne soit trop tard, vous payerez %1$s%3$s%2$s." -#: inc/Addon/WebP/AdminSubscriber.php:93 -#, php-format -msgid "You are using %1$s to serve WebP images so you do not need to enable this option. %2$sMore info%3$s %4$s If you prefer to have WP Rocket serve WebP for you instead, please disable WebP display in %1$s." -msgid_plural "You are using %1$s to serve WebP images so you do not need to enable this option. %2$sMore info%3$s %4$s If you prefer to have WP Rocket serve WebP for you instead, please disable WebP display in %1$s." -msgstr[0] "Vous utilisez %1$s pour servir les images WebP, vous n'avez donc pas besoin d'activer cette option. %2$sPlus d'infos%3$s %4$s Si vous préférez que WP Rocket serve les WebP pour vous, veuillez désactiver l’affichage des WebP de %1$s. " -msgstr[1] "Vous utilisez %1$s pour servir les images WebP, vous n'avez donc pas besoin d'activer cette option. %2$sPlus d'infos%3$s %4$s Si vous préférez que WP Rocket serve les WebP pour vous, veuillez désactiver l’affichage des WebP de %1$s. " -msgstr[2] "Vous utilisez %1$s pour servir les images WebP, vous n'avez donc pas besoin d'activer cette option. %2$sPlus d'infos%3$s %4$s Si vous préférez que WP Rocket serve les WebP pour vous, veuillez désactiver l’affichage des WebP de %1$s. " +#. translators: %1$s = , %2$s = discount percentage, %3$s = , +#. %4$s = discount price. +#: inc/Engine/License/Renewal.php:227 +msgid "" +"Renew with a %1$s%2$s discount%3$s before it is too late, you will only pay " +"%1$s%4$s%3$s!" +msgstr "" +"Renouvelez avec un %1$s%2$s escompte%3$s avant qu'il ne soit trop tard, vous" +" ne payerez seulement que %1$s%4$s%3$s!" -#: inc/Addon/WebP/AdminSubscriber.php:105 -msgid "WebP cache is disabled by filter." -msgstr "La mise en cache de WebP est désactivée par filtre." +#. translators: %1$s = , %2$s = . +#: inc/Engine/License/Renewal.php:542 +msgid "" +"You need a valid license to continue using this feature. %1$sRenew now%2$s " +"before losing access." +msgstr "" +"Vous devez détenir une licence valide pour continuer à utiliser cette " +"option. %1$sRenouveler maintenant%2$s avant de perdre l'accès." -#: inc/Addon/WebP/AdminSubscriber.php:115 -#: inc/Addon/WebP/AdminSubscriber.php:141 -#, php-format -msgid "You are using %1$s to convert images to WebP. If you want WP Rocket to serve them for you, activate this option. %2$sMore info%3$s" -msgid_plural "You are using %1$s to convert images to WebP. If you want WP Rocket to serve them for you, activate this option. %2$sMore info%3$s" -msgstr[0] "Vous utilisez %1$s pour convertir vos images à WebP. Si vous voulez que WP Rocket les serve pour vous, activez cette options. %2$sPlus d'info %3$s" -msgstr[1] "Vous utilisez %1$s pour convertir vos images à WebP. Si vous voulez que WP Rocket les serve pour vous, activez cette options. %2$sPlus d'info %3$s" -msgstr[2] "Vous utilisez %1$s pour convertir vos images à WebP. Si vous voulez que WP Rocket les serve pour vous, activez cette options. %2$sPlus d'info %3$s" +#. translators: %1$s = , %2$s = . +#: inc/Engine/License/Renewal.php:563 +msgid "You need an active license to enable this option. %1$sRenew now%2$s." +msgstr "" +"Vous devez détenir une licence active pour activer cette option. " +"%1$sRenouveler maintenant%2$s." -#: inc/Addon/WebP/AdminSubscriber.php:127 -#: inc/Addon/WebP/AdminSubscriber.php:153 -#, php-format -msgid "You are using %1$s to convert images to WebP. WP Rocket will create separate cache files to serve your WebP images. %2$sMore info%3$s" -msgid_plural "You are using %1$s to convert images to WebP. WP Rocket will create separate cache files to serve your WebP images. %2$sMore info%3$s" -msgstr[0] "Vous utilisez %1$s pour convertir des images à WebP. WP Rocket va créer des fichiers de cache séparés afin de servir vos images WebP. %2$sPlus d'info %3$s" -msgstr[1] "Vous utilisez %1$s pour convertir des images à WebP. WP Rocket va créer des fichiers de cache séparés afin de servir vos images WebP. %2$sPlus d'info %3$s" -msgstr[2] "Vous utilisez %1$s pour convertir des images à WebP. WP Rocket va créer des fichiers de cache séparés afin de servir vos images WebP. %2$sPlus d'info %3$s" +#. translators: %1$s = , %2$s = . +#: inc/Engine/License/Renewal.php:591 +msgid "You need an active license to enable this option. %1$sMore info%2$s." +msgstr "" +"Vous devez détenir une licence active pour activer cette option. %1$sPlus " +"d'infos%2$s." -#: inc/Addon/WebP/AdminSubscriber.php:173 -#, php-format -msgid "%5$sWe have not detected any compatible WebP plugin!%6$s%4$s If you don’t already have WebP images on your site consider using %3$sImagify%2$s or another supported plugin. %1$sMore info%2$s %4$s If you are not using WebP do not enable this option." -msgstr "%5$sNous n'avons pas détecté de plugin WebP compatible !%6$s%4$s Si vous n'avez pas encore d'images WebP sur votre site, envisagez d'utiliser %3$sImagify%2$s ou une autre extension supportée. %1$sPlus d'infos%2$s %4$s Si vous n'utilisez pas WebP, n'activez pas cette option." +#. translators: %1$s = promotion name, %2$s =
, %3$s = , %4$s = +#. promotion discount percentage, %5$s = . +#: inc/Engine/License/Upgrade.php:251 +msgid "" +"Take advantage of %1$s to speed up more websites:%2$s get a %3$s%4$s off%5$s" +" for %3$supgrading your license to Plus or Infinite!%5$s" +msgid_plural "" +"Take advantage of %1$s to speed up more websites:%2$s get a %3$s%4$s off%5$s" +" for %3$supgrading your license to Infinite!%5$s" +msgstr[0] "" +"Prenez avantage de %1$s afin d'accéléler plus de sites web :%2$s obtenez " +"%3$s%4$s d'escompte%5$s pour %3$srehausser votre licence à \"Plus\" ou " +"\"Infinite\" !%5$s" +msgstr[1] "" +"Prenez avantage de %1$s afin d'accélérer plus de sites web :%2$s obtenez " +"%3$s%4$s d'escompte%5$s pour %3$srehausser votre licence à \"Infinite\" " +"!%5$s" +msgstr[2] "" +"Prenez avantage de %1$s afin d'accélérer plus de sites web :%2$s obtenez " +"%3$s%4$s d'escompte%5$s pour %3$srehausser votre licence à \"Infinite\" " +"!%5$s" + +#: inc/Engine/License/Upgrade.php:382 inc/Engine/License/Upgrade.php:405 +msgid "Unlimited" +msgstr "Illimité" -#: inc/Addon/WebP/AdminSubscriber.php:185 -msgid "WP Rocket will create separate cache files to serve your WebP images." -msgstr "WP Rocket va créer des fichier de cache séparés afin de servir vos images WebP" +#. translators: %s = promotion discount percentage. +#: inc/Engine/License/views/promo-banner.php:18 +msgid "%s off" +msgstr "%s d'escompte" -#: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:151 -#, php-format -msgid "Failed to detect the following requirement in your theme: closing %1$s." -msgid_plural "Failed to detect the following requirements in your theme: closing %1$s." -msgstr[0] "Échec de la détection du requis suivant de votre thème : fermer %1$s." -msgstr[1] "Échec de la détection des requis suivants de votre thème : fermer %1$s." -msgstr[2] "Échec de la détection des requis suivants de votre thème : fermer %1$s." +#. translators: %s = promotion name. +#: inc/Engine/License/views/promo-banner.php:23 +msgid "%s promotion is live!" +msgstr "La promotion %s est en cours!" -#: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:159 -msgid "https://docs.wp-rocket.me/article/99-pages-not-cached-or-minify-cssjs-not-working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" -msgstr "https://docs.wp-rocket.me/article/99-pages-not-cached-or-minify-cssjs-not-working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" +#: inc/Engine/License/views/promo-banner.php:29 +msgid "Hurry Up! Deal ends in:" +msgstr "Dépêchez-vous! La promotion se termine dans :" -#: inc/common/admin-bar.php:84 -#: inc/common/admin-bar.php:136 -#: views/settings/page-sections/dashboard.php:150 -msgid "Clear and preload cache" -msgstr "Vider et précharger le cache" +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 +msgid "Minutes" +msgstr "Minutes" -#: inc/common/admin-bar.php:124 -#: inc/functions/i18n.php:41 -#: inc/functions/i18n.php:51 -msgid "All languages" -msgstr "Toutes les langues" +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 +msgid "Seconds" +msgstr "secondes" -#: inc/common/admin-bar.php:160 -msgid "Clear this post" -msgstr "Vider cet article" +#: inc/Engine/License/views/promo-banner.php:36 +#: inc/Engine/License/views/upgrade-section.php:11 +msgid "Upgrade now" +msgstr "Rehausser maintenant" -#: inc/common/admin-bar.php:174 -msgid "Purge this URL" -msgstr "Purger cet URL" +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 +msgid "The Optimize CSS Delivery feature is disabled." +msgstr "L'option Optimiser le chargement du CSS est désactivée." -#: inc/common/admin-bar.php:194 -msgid "Purge Sucuri cache" -msgstr "Purger le cache Sucuri" +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 +msgid "" +"You can no longer use the Remove Unused CSS or Load CSS asynchronously " +"options." +msgstr "" +"Vous ne pouvez plus utiliser les options Supprimer les ressources CSS " +"inutilisées ou Chargement asynchrone du CSS." -#: inc/common/admin-bar.php:218 -#: views/settings/fields/rocket-cdn.php:55 -msgid "Purge RocketCDN cache" -msgstr "Purger le cache RocketCDN" +#. translators: %1$s = , %2$s = . +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 +msgid "" +"You need an %1$sactive license%2$s to keep optimizing your CSS delivery, " +"which addresses a PageSpeed Insights recommendation and improves your page " +"performance." +msgstr "" +"Vous avez besoin d'une %1$slicence active%2$s pour continuer à optimiser le " +"chargement de votre CSS, ce qui répond à une recommandation de PageSpeed " +"Insights et améliore les performances de vos pages." + +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 +msgid "Renew now" +msgstr "Renouveler maintenant" -#: inc/common/admin-bar.php:231 -#: views/settings/partials/documentation.php:14 -msgid "Documentation" -msgstr "Documentation" +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 +msgid "You will soon lose access to some features." +msgstr "Vous perdrez bientôt l'accès à certaines options." -#: inc/deprecated/3.10.php:163 -msgid "OPcache purge failed." -msgstr "La purge de OpCache a échoué." +#. translators: %1$s = , %2$s = . +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 +msgid "" +"You need an %1$sactive license to continue optimizing your CSS delivery%2$s." +msgstr "" +"Vous avez besoin d'une %1$slicence active pour continuer à optimiser le " +"chargement de votre CSS%2$s." -#: inc/deprecated/3.10.php:168 -msgid "OPcache successfully purged" -msgstr "OpCache purgé avec succès" +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 +msgid "" +"The Remove Unused CSS and Load CSS asynchronously features are great options" +" to address the PageSpeed Insights recommendations and improve your website " +"performance." +msgstr "" +"Les options Supprimer les ressources CSS inutilisées et Chargement " +"Asynchrone du CSS sont des options intéressantes pour répondre aux " +"recommandations de PageSpeed Insights et améliorer les performances de votre" +" site Web." -#: inc/deprecated/3.11.php:81 -msgid "Yoast SEO XML sitemap" -msgstr "Sitemap XML Yoast SEO" +#. translators: %1$s = , %2$s = , %3$s = date. +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 +msgid "These features will be %1$sautomatically disabled on %3$s%2$s." +msgstr "Ces options seront %1$sautomatiquement désactivées le %3$s%2$s." -#: inc/deprecated/3.11.php:83 -#: inc/deprecated/3.12.php:58 -#: inc/deprecated/3.12.php:87 -#: inc/deprecated/3.12.php:186 -#: inc/deprecated/3.12.php:253 -#: inc/deprecated/3.12.php:342 -#, php-format -msgid "We automatically detected the sitemap generated by the %s plugin. You can check the option to preload it." -msgstr "Nous avons automatiquement détecté le sitemap généré par l'extension %s. Vous pouvez cocher l'option pour l'inclure dans le préchargement." +#: inc/Engine/License/views/renewal-expired-banner.php:13 +msgid "Your WP Rocket license is expired!" +msgstr "Votre licence WP Rocket est expirée!" -#: inc/deprecated/3.12.php:56 -msgid "All in One SEO XML sitemap" -msgstr "Sitemap XML All in One SEO" +#. translators: %1$s = , %2$s = . +#: inc/Engine/License/views/renewal-expired-banner.php:20 +msgid "" +"Your website could be much faster if it could take advantage of our %1$snew " +"features and enhancements%2$s. 🚀" +msgstr "" +"Votre site web pourrait être beaucoup plus rapide s'il pouvait profiter de " +"nos %1$s nouvelles fonctionnalités et améliorations%2$s.🚀" -#: inc/deprecated/3.12.php:85 -msgid "Rank Math XML sitemap" -msgstr "Sitemap XML de Rank Math" +#. translators: %1$s = , %2$s = . +#: inc/Engine/License/views/renewal-soon-banner.php:24 +msgid "" +"Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access" +" to product updates and support." +msgstr "" +"Votre %1$slicence WP Rocket est sur le point d'expirer%2$s : vous perdrez " +"bientôt l'accès aux mises à jour et au support." -#: inc/deprecated/3.12.php:184 -msgid "SEOPress XML sitemap" -msgstr "Sitemap XML SEOPress" +#: inc/Engine/License/views/upgrade-popin.php:14 +msgid "Speed Up More Websites" +msgstr "Accélérez plus de sites web" -#: inc/deprecated/3.12.php:251 -msgid "The SEO Framework XML sitemap" -msgstr "Le sitemap XML de The SEO Framework" +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. +#: inc/Engine/License/views/upgrade-popin.php:21 +msgid "" +"You can use WP Rocket on more websites by upgrading your license. To " +"upgrade, simply pay the %1$sprice difference%2$s between your current and " +"new licenses, as shown below." +msgstr "" +"Vous pouvez utiliser WP Rocket sur plus de sites web en rehaussant votre " +"licence. Pour rehausser, simplement payer la %1$sdifférence de prix %2$s " +"entre votre licence actuelle et la nouvelle, tel que montré ci-dessous." -#: inc/deprecated/3.12.php:332 -msgid "Jetpack XML Sitemaps" -msgstr "Sitemaps XML Jetpack" +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. +#: inc/Engine/License/views/upgrade-popin.php:27 +msgid "" +"%1$sN.B.%2$s: Upgrading your license does not change your expiration date" +msgstr "" +"%1$sP.S.%2$s: rehausser votre licence ne change pas votre date de " +"renouvellement." -#: inc/deprecated/3.12.php:334 -msgid "Preload the sitemap from the Jetpack plugin" -msgstr "Précharger le sitemap de l'extension Jetpack" +#. translators: %s = price. +#: inc/Engine/License/views/upgrade-popin.php:37 +msgid "Save $%s" +msgstr "Sauvegarder $%s" -#: inc/deprecated/3.2.php:52 -#: views/settings/page-sections/imagify.php:36 -msgid "Activate Imagify" -msgstr "Activer Imagify" +#. translators: %s = number of websites. +#: inc/Engine/License/views/upgrade-popin.php:50 +msgid "%s websites" +msgstr "%s sites web" -#: inc/deprecated/3.2.php:52 -msgid "Install Imagify for Free" -msgstr "Installer Imagify gratuitement" +#. translators: %s = license name. +#: inc/Engine/License/views/upgrade-popin.php:56 +msgid "Upgrade to %s" +msgstr "Rehausser à %s" -#: inc/deprecated/3.2.php:67 -msgid "Speed up your website and boost your SEO by reducing image file sizes without losing quality with Imagify." -msgstr "Accélérez votre site web et améliorez votre référencement en réduisant le poids de vos image sans perte de qualité avec Imagify." +#: inc/Engine/License/views/upgrade-section.php:11 +msgid "" +"You can use WP Rocket on more websites by upgrading your license (you will " +"only pay the price difference between your current and new licenses)." +msgstr "" +"Vous pouvez utiliser WP Rocket sur plus de sites web en rehaussant votre " +"licence (vous ne payerez que la différence de prix entre votre licence " +"courante et la nouvelle)." -#: inc/deprecated/3.2.php:72 -msgid "More details" -msgstr "Plus de détails" +#: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 +msgid "LazyLoad for images" +msgstr "Chargement différé des images" -#: inc/deprecated/3.2.php:228 -#, php-format -msgid "Sitemap preload: %d pages have been cached." -msgstr "Pré-chargement du Sitemap : %d pages ont été mises en cache." +#: inc/Engine/Media/Lazyload/AdminSubscriber.php:63 +msgid "LazyLoad for iframes/videos" +msgstr "Chargement différé des iframes et vidéos" -#: inc/deprecated/3.2.php:261 -#, php-format -msgid "Sitemap preload: %d uncached pages have now been preloaded. (refresh to see progress)" -msgstr "Pré-chargement du Sitemap : %d pages ont été pré-chargées. (rafraîchir pour voir la progression)" +#: inc/Engine/Media/Lazyload/CSS/Admin/Subscriber.php:48 +msgid "LazyLoad CSS backgrounds" +msgstr "LazyLoad background CSS" -#: inc/deprecated/3.4.php:18 -msgid "Choose a domain from the list" -msgstr "Choisissez un domaine dans la liste" +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 +msgid "Analytics & Ads" +msgstr "Analyses & publicités" -#: inc/deprecated/3.4.php:31 -msgid "No domain available in your Cloudflare account" -msgstr "Aucun domaine disponible dans votre compte Cloudflare" +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 +msgid "Plugins" +msgstr "Extensions" -#: inc/deprecated/3.5.php:71 -#: inc/deprecated/3.5.php:195 -msgid "Curl is disabled on your server. Please ask your host to enable it. This is required for the Cloudflare Add-on to work correctly." -msgstr "CURL est désactivé sur votre serveur. Veuillez demander à votre hébergeur de l'activer. Ceci est requis pour que l'ajout Cloudflare fonctionne correctement." +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 +msgid "Themes" +msgstr "Thèmes" -#: inc/deprecated/3.5.php:79 -#, php-format -msgid "Cloudflare email, API key and Zone ID are not set. Read the %1$sdocumentation%2$s for further guidance." -msgstr "Le courriel, la clé d'API et le Zone ID de Cloudflare de sont pas définis. Lisez la %1$sdocumentation%2$s pour plus d'assistance." +#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:101 +msgid "" +"You need an active license to get the latest version of the lists from our " +"server." +msgstr "" +"Vous devez avoir une licence active pour obtenir la dernière version des " +"listes de notre serveur." -#: inc/deprecated/3.5.php:206 -#, php-format -msgid "Cloudflare email and API key are not set. Read the %1$sdocumentation%2$s for further guidance." -msgstr "Le courriel et la clé d'API de Cloudflare ne sont pas configurés. Lisez la %1$sdocumentation%2$s pour plus d'assistance." +#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:116 +msgid "Could not get updated lists from server." +msgstr "Impossible d'obtenir les listes mises à jour depuis le serveur." -#: inc/deprecated/3.5.php:271 -msgid "Connection to Cloudflare failed" -msgstr "La connexion à Cloudflare a échoué" +#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:125 +msgid "Lists are up to date." +msgstr "Les listes sont à jour." -#: inc/deprecated/DeprecatedClassTrait.php:54 -#, php-format -msgid "The called class %1$s is deprecated since version %2$s! Use %3$s instead." -msgstr "La classe appelée %1$s est obsolète depuis la version %2$s! Utilisez %3$s à la place." +#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:134 +msgid "Could not update lists." +msgstr "Impossible de mettre à jour les listes." -#: inc/deprecated/DeprecatedClassTrait.php:65 -#, php-format -msgid "The called class %1$s is deprecated since version %2$s!" -msgstr "La classe appelée %1$s est obsolète depuis la version %2$s!" +#: inc/Engine/Optimization/DynamicLists/DynamicLists.php:143 +msgid "Lists are successfully updated." +msgstr "Les listes ont été mises à jour avec succès." -#: inc/deprecated/deprecated.php:240 -msgid "JS files with Deferred Loading JavaScript" -msgstr "Fichiers JS en chargement différé du JavaScript" +#: inc/Engine/Optimization/DynamicLists/ServiceProvider.php:72 +msgid "Default Lists" +msgstr "Listes de défaut" -#: inc/deprecated/deprecated.php:293 -msgid "Add URL" -msgstr "Ajouter un URL" +#: inc/Engine/Optimization/DynamicLists/ServiceProvider.php:78 +msgid "Delay JavaScript Execution Exclusion Lists" +msgstr "Listes d'exclusion pour Reporter l'exécution JavaScript" -#: inc/deprecated/deprecated.php:1277 -#: views/settings/fields/import-form.php:22 -msgid "Before you can upload your import file, you will need to fix the following error:" -msgstr "Avant de pouvoir envoyer votre fichier d’import, vous devez régler l’erreur suivante :" +#: inc/Engine/Optimization/DynamicLists/ServiceProvider.php:84 +msgid "Incompatible plugins Lists" +msgstr "Listes des extensions incompatibles" -#: inc/deprecated/deprecated.php:1288 -#: views/settings/fields/import-form.php:35 -#, php-format -msgid "Choose a file from your computer (maximum size: %s)" -msgstr "Choisissez un fichier de votre ordinateur (poids maximum : %s)" +#: inc/Engine/Optimization/Minify/AdminSubscriber.php:65 +msgid "Minify/combine JavaScript" +msgstr "Minifier / Combiner le JavaScript" -#: inc/deprecated/deprecated.php:1385 -msgid "Your Cloudflare credentials are valid." -msgstr "Vos accès Cloudflare sont valides." +#: inc/Engine/Optimization/Minify/CSS/AdminSubscriber.php:150 +msgid "Minify CSS" +msgstr "Minifier les fichiers CSS" -#: inc/deprecated/deprecated.php:1389 -msgid "Your Cloudflare credentials are invalid!" -msgstr "Vos accès Cloudflare sont invalides!" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +msgid "Remove Unused CSS" +msgstr "Retirer CSS inutilisé" -#: inc/deprecated/deprecated.php:1453 -msgid "Save and optimize" -msgstr "Sauvegarder et optimiser" +#. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, +#. %4$s = closing tag. +#: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 +msgid "" +"%1$s: Could not create the %2$s table in the database which is necessary for" +" the Remove Unused CSS feature to work. Please check our " +"%3$sdocumentation%4$s." +msgstr "" +"%1$s: Impossible de créer la %2$s table nécessaire au fonctionnement de " +"Supprimer les Ressources CSS inutilisées dans la base de données. Veuillez " +"consulter %3$snotre documentation%4$s." -#: inc/deprecated/deprecated.php:1453 -msgid "Optimize" -msgstr "Optimiser" +#. translators: %1$s = plugin name. +#: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:274 +msgid "%1$s: Used CSS cache cleared!" +msgstr "%1$s: Cache du CSS utilisé vidée!" -#: inc/deprecated/deprecated.php:1464 -#: inc/deprecated/deprecated.php:1666 -msgctxt "screen-reader-text" -msgid "Note:" -msgstr "Note :" +#. translators: %1$s = plugin name. +#: inc/Engine/Preload/Admin/Settings.php:76 +msgid "" +"%1$s: The preload service is now active. After the initial preload it will " +"continue to cache all your pages whenever they are purged. No further action" +" is needed." +msgstr "" +"%1$s: Le Préchargement est maintenant actif. Après le préchargement initial," +" il continuera à mettre en cache toutes vos pages chaque fois qu'elles " +"seront purgées. Aucune autre action n'est nécessaire." -#: inc/deprecated/deprecated.php:1470 -msgctxt "screen-reader-text" -msgid "Performance tip:" -msgstr "Truc de performance :" +#: inc/Engine/Preload/Cron/Subscriber.php:138 +msgid "WP Rocket Preload pending jobs" +msgstr "Tâches en attente de l'option Préchargement de WP Rocket" -#: inc/deprecated/deprecated.php:1476 -msgctxt "screen-reader-text" -msgid "Third-party feature detected:" -msgstr "Autre fonctionnalité détectée :" +#: inc/Engine/Preload/Cron/Subscriber.php:166 +msgid "WP Rocket Preload revert stuck failed jobs" +msgstr "" +"Le Prechargement de WP Rocket rétablit les tâches bloquées qui ont échoué" -#: inc/deprecated/deprecated.php:1488 -#: inc/deprecated/deprecated.php:1672 -msgctxt "screen-reader-text" -msgid "Warning:" -msgstr "Attention : " +#: inc/Engine/Saas/Admin/AdminBar.php:106 +msgid "Clear Used CSS of this URL" +msgstr "Nettoyer le CSS utilisé pour cet URL" -#: inc/deprecated/deprecated.php:1501 -msgctxt "button text" -msgid "Download settings" -msgstr "Télécharger les réglages" +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" +msgstr "CSS utilisé" -#: inc/deprecated/deprecated.php:1531 -msgid "Replace site's hostname with:" -msgstr "Remplacer le nom d’hôte du site par :" +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." +msgstr "Cette action effacera les fichiers CSS utilisés." -#: inc/deprecated/deprecated.php:1550 -#: inc/deprecated/deprecated.php:1587 -#: inc/deprecated/deprecated.php:1615 -#: views/settings/fields/cnames.php:41 -#: views/settings/fields/cnames.php:75 -#: views/settings/fields/cnames.php:105 -msgid "reserved for" -msgstr "réservé pour" +#. translators: %1$s = plugin name, %2$s = number of seconds. +#: inc/Engine/Saas/Admin/Notices.php:91 +msgid "" +"%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing " +"your pages, the plugin is optimizing LCP and the images above the fold." +msgstr "" +"%1$s : Veuillez patienter %2$s secondes. La Suppression des ressources CSS " +"inutilisées traite vos pages, le plugin optimise le LCP et les images au-" +"dessus de la ligne de flottaison." -#: inc/deprecated/deprecated.php:1552 -#: inc/deprecated/deprecated.php:1589 -#: inc/deprecated/deprecated.php:1617 -#: views/settings/fields/cnames.php:44 -#: views/settings/fields/cnames.php:78 -#: views/settings/fields/cnames.php:108 -msgid "All files" -msgstr "Tous les fichiers" +#. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of +#. seconds. +#: inc/Engine/Saas/Admin/Notices.php:134 +msgid "" +"%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" +"\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." +msgstr "" +"%1$s : L'élément LCP a été optimisé, et les images au-dessus de la ligne de flottaison ont été exclues du lazyload. Le CSS utilisé de votre page d'accueil a été traité.\n" +"\t\t\tWP Rocket continuera à générer les CSS utilisés pour un maximum de %2$s URL par %3$s seconde(s)." -#: inc/deprecated/deprecated.php:1564 -#: inc/deprecated/deprecated.php:1594 -#: inc/deprecated/deprecated.php:1622 -#: views/settings/fields/cnames.php:56 -#: views/settings/fields/cnames.php:90 -#: views/settings/fields/cnames.php:120 -msgid "Images" -msgstr "Images" +#. translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/Engine/Saas/Admin/Notices.php:157 +msgid "We suggest enabling %1$sPreload%2$s for the fastest results." +msgstr "" +"Nous vous suggérons d'activer le %1$sPréchargement%2$s pour obtenir des " +"résultats plus rapides." -#: inc/deprecated/deprecated.php:1635 -#: views/settings/fields/cnames.php:132 -msgid "Add CNAME" -msgstr "Ajouter un CNAME" +#. translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/Engine/Saas/Admin/Notices.php:167 +msgid "To learn more about the process check our %1$sdocumentation%2$s." +msgstr "" +"Pour en apprendre plus sur le processus, consultez notre " +"%1$sdocumentation%2$s." -#: inc/deprecated/deprecated.php:1706 -msgid "Watch the video" -msgstr "Voir la vidéo" +#: inc/Engine/Saas/Admin/Notices.php:229 +msgid "" +"We couldn't generate the used CSS because you're using a nulled version of " +"WP Rocket. You need an active license to use the Remove Unused CSS feature " +"and further improve your website's performance." +msgstr "" +"Nous n'avons pas pu générer le CSS utilisé car vous utilisez une version " +"piratée de WP Rocket. Vous avez besoin d'une licence active pour utiliser " +"l'option Supprimer les CSS inutilisés et améliorer davantage les " +"performances de votre site Web." -#: inc/deprecated/deprecated.php:1771 -msgid "Basic" -msgstr "Base" +#. translators: %1$s = promo percentage. +#: inc/Engine/Saas/Admin/Notices.php:232 +msgid "Click here to get a WP Rocket single license at %1$s off!" +msgstr "" +"Cliquez ici pour obtenir une licence Single de WP Rocket à moins %1$s !" -#: inc/deprecated/deprecated.php:1772 -msgid "Static Files" -msgstr "Fichiers statiques" +#. translators: %1$s = open tag, %2$s = closing tag. +#: inc/Engine/Saas/Admin/Notices.php:285 +msgid "" +"It seems a security plugin or the server's firewall prevents WP Rocket from " +"accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " +"should be added to your allowlists:" +msgstr "" +"Il semble qu'un plugin de sécurité ou le pare-feu du serveur empêche WP " +"Rocket d'accéder aux options SaaS. Les IP répertoriées %1$sdans notre " +"documentation%2$s doivent être autorisées :" -#: inc/deprecated/deprecated.php:1774 -msgid "Advanced" -msgstr "Avancé" +#: inc/Engine/Saas/Admin/Notices.php:290 +msgid "- In the security plugin, if you are using one" +msgstr "- Dans le plugin de sécurité, si vous en utilisez un" -#: inc/deprecated/deprecated.php:1944 -#, php-format -msgid "%1$s %2$s requires at least PHP %3$s to function properly. To use this version, please ask your web host how to upgrade your server to PHP %3$s or higher. If you are not able to upgrade, you can rollback to the previous version by using the button below." -msgstr "%1$s %2$s requiert au moins PHP %3$s pour fonctionner correctement. Pour utiliser cette version, demandez à votre hébergeur de mettre à jour votre serveur vers PHP %3$s ou plus. Si cette mise-à-jour n'est pas possible, vous pouvez revenir à la version précédente en utilisant le bouton ci-dessous." +#: inc/Engine/Saas/Admin/Notices.php:291 +msgid "- In the server's firewall. Your host can help you with this" +msgstr "" +"- Dans le pare-feu du serveur. Votre hébergeur peut vous aider à le faire" #: inc/functions/admin.php:21 -msgid "There seems to be an issue validating your license. Please see the error message below." -msgid_plural "There seems to be an issue validating your license. You can see the error messages below." -msgstr[0] "Il semble y avoir un problème à confirmer votre licence. Vous pouvez voir le message d'erreur ci-dessous." -msgstr[1] "Il semble y avoir un problème à confirmer votre licence. Vous pouvez voir les messages d'erreur ci-dessous." -msgstr[2] "Il semble y avoir un problème à confirmer votre licence. Vous pouvez voir les messages d'erreur ci-dessous." +msgid "" +"There seems to be an issue validating your license. Please see the error " +"message below." +msgid_plural "" +"There seems to be an issue validating your license. You can see the error " +"messages below." +msgstr[0] "" +"Il semble y avoir un problème à confirmer votre licence. Vous pouvez voir le" +" message d'erreur ci-dessous." +msgstr[1] "" +"Il semble y avoir un problème à confirmer votre licence. Vous pouvez voir " +"les messages d'erreur ci-dessous." +msgstr[2] "" +"Il semble y avoir un problème à confirmer votre licence. Vous pouvez voir " +"les messages d'erreur ci-dessous." #: inc/functions/admin.php:361 msgid "Server type:" @@ -2730,155 +3629,465 @@ msgstr "Réglages de WP Rocket anonymisés :" msgid "Which WP Rocket settings are active" msgstr "Quels sont les réglages activés de WP Rocket" +#: inc/functions/admin.php:433 +msgid "WP Rocket license type" +msgstr "Type de licence WP Rocket" + #: inc/functions/options.php:429 msgid "The provided license data are not valid." msgstr "Les données de la licence fournies ne sont pas valides." +#. Translators: %1$s = opening link tag, %2$s = closing link tag. #: inc/functions/options.php:432 -#, php-format msgid "To resolve, please %1$scontact support%2$s." msgstr "Pour résoudre, veuillez %1$scontacter le soutien%2$s." -#: inc/functions/options.php:491 -#: inc/functions/options.php:530 -msgid "License validation failed. Our server could not resolve the request from your website." -msgstr "Échec de la validation de la licence. Notre serveur ne peut compléter la requête de votre site web." +#. Translators: %1$s = opening em tag, %2$s = closing em tag, %3$s = opening +#. link tag, %4$s closing link tag. +#: inc/functions/options.php:491 inc/functions/options.php:530 +msgid "" +"License validation failed. Our server could not resolve the request from " +"your website." +msgstr "" +"Échec de la validation de la licence. Notre serveur ne peut compléter la " +"requête de votre site web." +#. Translators: %1$s = opening em tag, %2$s = closing em tag, %3$s = opening +#. link tag, %4$s closing link tag. #: inc/functions/options.php:491 -#, php-format -msgid "Try clicking %1$sValidate License%2$s below. If the error persists, follow %3$sthis guide%4$s." -msgstr "Essayez de cliquer sur %1$sValider la license%2$s ci-dessous. Si l’erreur persiste, suivez les instructions de %3$sce guide%4$s." +msgid "" +"Try clicking %1$sValidate License%2$s below. If the error persists, follow " +"%3$sthis guide%4$s." +msgstr "" +"Essayez de cliquer sur %1$sValider la license%2$s ci-dessous. Si l’erreur " +"persiste, suivez les instructions de %3$sce guide%4$s." +#. Translators: %1$s = opening link tag, %2$s = closing link tag. #: inc/functions/options.php:507 -msgid "License validation failed. You may be using a nulled version of the plugin. Please do the following:" -msgstr "La validation de votre licence a échoué. Vous utilisez peut-être une version piratée de cette extension. Veuillez suivre les points suivants :" +msgid "" +"License validation failed. You may be using a nulled version of the plugin. " +"Please do the following:" +msgstr "" +"La validation de votre licence a échoué. Vous utilisez peut-être une version" +" piratée de cette extension. Veuillez suivre les points suivants :" -#: inc/functions/options.php:507 -#: inc/functions/options.php:549 -#, php-format +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:507 inc/functions/options.php:549 msgid "Login to your WP Rocket %1$saccount%2$s" msgstr "Connectez-vous à votre %1$scompte%2$s WP Rocket" -#: inc/functions/options.php:507 -#: inc/functions/options.php:549 +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:507 inc/functions/options.php:549 msgid "Download the zip file" msgstr "Télécharger le fichier ZIP" -#: inc/functions/options.php:507 -#: inc/functions/options.php:549 +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:507 inc/functions/options.php:549 msgid "Reinstall" msgstr "Réinstaller" +#. Translators: %1$s = opening link tag, %2$s = closing link tag. #: inc/functions/options.php:507 -#, php-format -msgid "If you do not have a WP Rocket account, please %1$spurchase a license%2$s." -msgstr "Si vous n'avez pas de compte WP Rocket, svp %1$sacheter une licence%2$s." +msgid "" +"If you do not have a WP Rocket account, please %1$spurchase a license%2$s." +msgstr "" +"Si vous n'avez pas de compte WP Rocket, svp %1$sacheter une licence%2$s." +#. Translators: %1$s = opening link tag, %2$s = closing link tag. #: inc/functions/options.php:515 -msgid "License validation failed. This user account does not exist in our database." -msgstr "Échec de validation de la licence. Le compte d'usager n'existe pas dans notre base de données." +msgid "" +"License validation failed. This user account does not exist in our database." +msgstr "" +"Échec de validation de la licence. Le compte d'usager n'existe pas dans " +"notre base de données." +#. Translators: %1$s = opening link tag, %2$s = closing link tag. #: inc/functions/options.php:515 msgid "To resolve, please contact support." msgstr "Pour résoudre, svp contacter le soutien technique." +#. Translators: %1$s = opening link tag, %2$s = closing link tag. #: inc/functions/options.php:523 msgid "License validation failed. This user account is blocked." -msgstr "Échec de validation de la licence. Ce compte usager est sur notre liste noire." +msgstr "" +"Échec de validation de la licence. Ce compte usager est sur notre liste " +"noire." +#. Translators: %1$s = opening link tag, %2$s = closing link tag. #: inc/functions/options.php:523 -#, php-format msgid "Please see %1$sthis guide%2$s for more info." msgstr "Veuillez consulter %1$sce guide%2$s pour plus d'info." +#. Translators: %1$s = opening em tag, %2$s = closing em tag, %3$s = opening +#. link tag, %4$s closing link tag. #: inc/functions/options.php:530 -#, php-format -msgid "Try clicking %1$sSave Changes%2$s below. If the error persists, follow %3$sthis guide%4$s." -msgstr "Essayez de cliquer %1$sSauvegarder les changements%2$s ci-dessous. Si l'erreur persiste, suivez %3$sce guide%4$s." +msgid "" +"Try clicking %1$sSave Changes%2$s below. If the error persists, follow " +"%3$sthis guide%4$s." +msgstr "" +"Essayez de cliquer %1$sSauvegarder les changements%2$s ci-dessous. Si " +"l'erreur persiste, suivez %3$sce guide%4$s." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:543 +msgid "Your license is not valid." +msgstr "Votre licence n’est pas valide." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:543 +msgid "Make sure you have an active %1$sWP Rocket license%2$s." +msgstr "Assurez-vous d'avoir une licence %1$sactive de WP Rocket %2$s." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag, %3$s = +#. opening link tag. +#: inc/functions/options.php:545 +msgid "You have added as many sites as your current license allows." +msgstr "" +"Vous avez ajouté autant de sites que votre licence actuelle le permet." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag, %3$s = +#. opening link tag. +#: inc/functions/options.php:545 +msgid "" +"Upgrade your %1$saccount%2$s or %3$stransfer your license%2$s to this " +"domain." +msgstr "" +"Rehausser votre %1$scompte%2$s ou %3$stransférer votre licence%2$s à ce " +"domaine." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:547 +msgid "This website is not allowed." +msgstr "Ce site n'est pas autorisé." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:547 +msgid "Please %1$scontact support%2$s." +msgstr "Svp %1$scontacter le soutien technique%2$s." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:549 +msgid "This license key is not recognized." +msgstr "La clé de licence n'est pas reconnue." + +#. Translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/functions/options.php:549 +msgid "If the issue persists, please %1$scontact support%2$s." +msgstr "Si le problème persiste, svp %1$scontacter le soutien technique%2$s." + +#. Translators: %s = error message returned. +#: inc/functions/options.php:555 +msgid "License validation failed: %s" +msgstr "Échec de validation de la licence : %s" + +#: inc/Logger/Logger.php:227 inc/Logger/Logger.php:257 +msgid "The log file does not exist." +msgstr "Le fichier de log n'existe pas." + +#: inc/Logger/Logger.php:233 inc/Logger/Logger.php:263 +msgid "The log file could not be read." +msgstr "Le fichier de log n'a pu être lu." + +#: inc/Logger/Logger.php:250 +msgid "The logs are not saved into a file." +msgstr "Les logs n'ont pu être sauvés dans un fichier." + +#. Translators: %s = Hosting name. +#: inc/ThirdParty/Hostings/Cloudways.php:82 +msgid "" +"Varnish auto-purge will be automatically enabled once Varnish is enabled on " +"your %s server." +msgstr "" +"La purge automatiquement de Varnish sera automatiquement activée lorsque " +"Varnish sera activé sur votre %s serveur." + +#. translators: %1$s = opening link tag, %2$s = closing link tag. +#: inc/ThirdParty/Hostings/Kinsta.php:159 +msgid "" +"Your installation seems to be missing core Kinsta files managing Cache " +"clearing, which will prevent your Kinsta installation and WP Rocket from " +"working correctly. Please get in touch with Kinsta support through your " +"%1$sMyKinsta%2$s account to resolve this issue." +msgstr "" +"Des fichiers Kinsta de base, gérant l'effacement du cache et du CDN, " +"semblent manquer dans votre installation, ce qui empêchera Kinsta et WP " +"Rocket de fonctionner correctement. Veuillez contacter le support Kinsta via" +" votre compte %1$sMyKinsta%2$s pour résoudre ce problème." + +#. translators: %1$s = plugin name. +#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:127 +msgid "" +"%1$s: Cloudflare's HTTP/2 Server Push is incompatible with the features of " +"Remove Unused CSS and Combine CSS files. We strongly recommend disabling it." +msgstr "" +"%1$s: Le Server Push HTTP/2 de Cloudflare est incompatible avec les options " +"Supprimer les ressources CSS inutilisées et Combiner les fichier CSS. Nous " +"vous recommandons vivement de la désactiver." + +#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:170 +msgid "" +"Your site is using the official Cloudflare plugin. We have enabled " +"Cloudflare auto-purge for compatibility. If you have APO activated, it is " +"also compatible." +msgstr "" +"Votre site utilise le plugin officiel Cloudflare. Nous avons activé la purge" +" automatique de Cloudflare pour des raisons de compatibilité. Si vous avez " +"activé APO, c'est également compatible." + +#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:171 +msgid "" +"Cloudflare cache will be purged each time WP Rocket clears its cache to " +"ensure content is always up-to-date." +msgstr "" +"Le cache Varnish sera purgé à chaque fois que WP Rocket purgera son cache " +"pour que le contenu soit toujours à jour." + +#. Translators: %1$s = strong opening tag, %2$s = strong closing tag. +#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:215 +msgid "" +"%1$sWP Rocket:%2$s You are using \"Dynamic Cookies Cache\". Cloudflare APO " +"is not yet compatible with that feature." +msgstr "" +"%1$sWP Rocket :%2$s Vous utilisez \" le cache des cookies dynamiques\". " +"Cloudflare APO n'est pas encore compatible avec cette fonctionnalité." + +#. Translators:%1$s = opening tag, %2$s = closing tag. +#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:221 +msgid "" +"You should either disable Cloudflare APO or check with the theme/plugin " +"requiring the use of “Dynamic Cookies Cache” developers for an alternative " +"way to be page-cache friendly. %1$sMore info%2$s" +msgstr "" +"Vous devez soit désactiver Cloudflare APO, soit vérifier auprès des " +"développeurs du thème/plugin nécessitant l'utilisation de \"cache des " +"cookies dynamiques\" qu'il existe une autre solution pour respecter la mise " +"en cache des pages. %1$sPlus d'infos%2$s" + +#. Translators: %1$s = strong opening tag, %2$s = strong closing tag, %3$s = +#. opening tag, %4$s = closing tag, %5$s = opening tag. +#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:272 +msgid "" +"%1$sWP Rocket:%2$s You are using \"Separate cache files for mobile " +"devices\". You need to activate \"Cache by Device Type\" %3$ssetting%5$s on " +"Cloudflare APO to serve the right version of the cache. %4$sMore info%5$s" +msgstr "" +"%1$sWP Rocket :%2$s Vous utilisez l'option \"Créer un fichier de cache à " +"part pour les mobiles\". Vous devez %3$sl'option%5$s \"Cache by Device " +"Type\" sur Cloudflare APO pour servir la bonne version du cache. %4$sPlus " +"d'infos%5$s" -#: inc/functions/options.php:543 -msgid "Your license is not valid." -msgstr "Votre licence n’est pas valide." +#. Translators: %1$s = strong opening tag, %2$s = strong closing tag. +#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:293 +msgid "" +"%1$sWP Rocket:%2$s You have \"Cache by Device Type\" enabled on Cloudflare " +"APO. If you judge it necessary for the website to have a different cache on " +"mobile and desktop, we suggest you enable our “Separate Cache Files for " +"Mobiles Devices” to ensure the generated cache is accurate." +msgstr "" +"%1$sWP Rocket :%2$s Vous avez activé la fonction \"Cache by Device Type\" " +"sur Cloudflare APO. Si vous jugez nécessaire que le site web ait un cache " +"différent pour les mobiles et les ordinateurs, nous vous suggérons d'activer" +" notre option \"Créer un fichier de cache à part pour les mobiles\" afin de " +"garantir la bonne version du cache." + +#. translators: %1$s is WP Rocket plugin name, %2$s is opening tag, %3$s +#. is closing tag. +#: inc/ThirdParty/Plugins/ModPagespeed.php:102 +msgid "" +"%1$s: Mod PageSpeed is not compatible with this plugin and " +"may cause unexpected results. %2$sMore Info%3$s" +msgstr "" +"%1$s: Mod PageSpeed n'est pas compatible avec cette " +"extension et peut causer des résultats inattendus. %2$sPlus d'Info%3$s" -#: inc/functions/options.php:543 -#, php-format -msgid "Make sure you have an active %1$sWP Rocket license%2$s." -msgstr "Assurez-vous d'avoir une licence %1$sactive de WP Rocket %2$s." +#. Translators: %1$s is an opening tag; %2$s is a closing +#. tag +#: inc/ThirdParty/Plugins/Optimization/Autoptimize.php:75 +msgid "" +"%1$sWP Rocket: %2$sWe have detected that Autoptimize's JavaScript " +"Aggregation feature is enabled. WP Rocket's Delay JavaScript Execution will " +"not be applied to the file it creates. We suggest disabling %1$sJavaScript " +"Aggregation%2$s to take full advantage of Delay JavaScript Execution." +msgstr "" +"%1$sWP Rocket : %2$sNous avons détecté que l'option Concaténer les fichiers " +"JS d'Autoptimize est activée. L'option Reporter l'exécution JavaScript de WP" +" Rocket ne sera pas appliquée au fichier qu'elle crée. Nous vous suggérons " +"de désactiver %1$sConcaténer les fichiers JS%2$s pour profiter pleinement " +"de Reporter l'exécution JavaScript." + +#. Translators: %1$s is an opening tag; %2$s is a closing +#. tag +#: inc/ThirdParty/Plugins/Optimization/Autoptimize.php:130 +msgid "" +"%1$sWP Rocket: %2$sWe have detected that Autoptimize's Aggregate Inline CSS " +"feature is enabled. WP Rocket's Load CSS Asynchronously will not work " +"correctly. We suggest disabling %1$sAggregate Inline CSS%2$s to take full " +"advantage of Load CSS Asynchronously Execution." +msgstr "" +"%1$sWP Rocket : %2$sNous avons détecté que l'option Concaténer le CSS inline" +" d'Autoptimize est activée. L'option Chargement Asychrone du CSS de WP " +"Rocket ne sera pas appliquée au fichier qu'elle crée. Nous vous suggérons de" +" désactiver %1$sConcaténer le CSS inline%2$s pour profiter pleinement du " +"Chargement Asychrone du CSS." -#: inc/functions/options.php:545 -msgid "You have added as many sites as your current license allows." -msgstr "Vous avez ajouté autant de sites que votre licence actuelle le permet." +#. translators: %1$s = opening tag, %2$s = closing tag. +#: inc/ThirdParty/Plugins/Optimization/Ezoic.php:45 +msgid "" +"This plugin blocks WP Rocket's caching and optimizations. Deactivate it and " +"use %1$sEzoic's nameserver integration%2$s instead." +msgstr "" +"Cette extension empêche la mise en cache et les optimisations de WP Rocket. " +"Désactivez-la et utilisez %1$sl'intégration du serveur de noms d'Ezoic%2$s à" +" la place." -#: inc/functions/options.php:545 -#, php-format -msgid "Upgrade your %1$saccount%2$s or %3$stransfer your license%2$s to this domain." -msgstr "Rehausser votre %1$scompte%2$s ou %3$stransférer votre licence%2$s à ce domaine." +#. Translators: %s = Plugin name. +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:78 +msgctxt "Hummingbird notice" +msgid "" +"Please deactivate the following %s option which conflicts with WP Rocket " +"features:" +msgid_plural "" +"Please deactivate the following %s options which conflict with WP Rocket " +"features:" +msgstr[0] "" +"Veuillez désactiver l'option %s qui entre en conflit avec les " +"fonctionnalités de WP Rocket :" +msgstr[1] "" +"Veuillez désactiver les %s options suivantes qui entrent en conflit avec les" +" fonctionnalités de WP Rocket :" +msgstr[2] "" +"Veuillez désactiver les %s options suivantes qui entrent en conflit avec les" +" fonctionnalités de WP Rocket :" + +#. Translators: %1$s = Plugin name, %2$s = , %3$s = . +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 +msgctxt "Hummingbird notice" +msgid "" +"%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" +msgstr "" +"%1$s %2$sdésactivation des emojis%3$s entre en conflit avec la " +"%2$sdésactivation des emojis%3$s de WP Rocket" -#: inc/functions/options.php:547 -msgid "This website is not allowed." -msgstr "Ce site n'est pas autorisé." +#. Translators: %1$s = Plugin name, %2$s = , %3$s = . +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 +msgctxt "Hummingbird notice" +msgid "" +"%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP " +"compression%3$s" +msgstr "" +"%1$s %2$scompression GZIP%3$s entre en conflit avec la %2$scompression " +"GZIP%3$s avec WP Rocket" -#: inc/functions/options.php:547 -#, php-format -msgid "Please %1$scontact support%2$s." -msgstr "Svp %1$scontacter le soutien technique%2$s." +#. Translators: %1$s = Plugin name, %2$s = , %3$s = . +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 +msgctxt "Hummingbird notice" +msgid "" +"%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser " +"caching%3$s" +msgstr "" +"%1$s %2$scaching du fureteur%3$s entre en conflit avec le %2$scaching du " +"fureteur%3$s de WP Rocket" -#: inc/functions/options.php:549 -msgid "This license key is not recognized." -msgstr "La clé de licence n'est pas reconnue." +#. Translators: %1$s = Plugin name, %2$s = , %3$s = . +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 +msgctxt "Hummingbird notice" +msgid "" +"%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" +msgstr "" +"%1$s %2$scaching de page%3$s entre en conflit le %2$spage caching%3$s de WP " +"Rocket" -#: inc/functions/options.php:549 -#, php-format -msgid "If the issue persists, please %1$scontact support%2$s." -msgstr "Si le problème persiste, svp %1$scontacter le soutien technique%2$s." +#. Translators: %1$s = Plugin name, %2$s = , %3$s = . +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 +msgctxt "Hummingbird notice" +msgid "" +"%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile " +"optimization%3$s" +msgstr "" +"%1$s %2$sl'optimisation des fichiers%3$s entre en conflit avec " +"%2$sl'optimisation des fichiers%3$s de WP Rocket" -#: inc/functions/options.php:555 -#, php-format -msgid "License validation failed: %s" -msgstr "Échec de validation de la licence : %s" +#: inc/ThirdParty/Plugins/Optimization/Perfmatters.php:38 +msgid "" +"Remove Unused CSS is currently activated in Perfmatters. If you want to use " +"WP Rocket's Remove Unused CSS feature, disable this option in Perfmatters." +msgstr "" +"La Suppression du CSS inutilisé est actuellement activée dans Perfmatters. " +"Si vous souhaitez utiliser l'option Suppression du CSS inutilisé de WP " +"Rocket, désactivez cette option dans Perfmatters." -#: inc/vendors/classes/class-imagify-partner.php:531 -msgid "Plugin installed successfully." -msgstr "Extension installée avec succés." +#: inc/ThirdParty/Plugins/Optimization/RapidLoad.php:39 +msgid "" +"Automated unused CSS removal is currently activated in RapidLoad Power-Up " +"for Autoptimize. If you want to use WP Rocket's Remove Unused CSS feature, " +"disable the RapidLoad Power-Up for Autoptimize plugin." +msgstr "" +"La suppression automatique des CSS inutilisés est actuellement activée dans " +"RapidLoad Power-Up pour Autoptimize. Si vous souhaitez utiliser l'option de " +"suppression des CSS inutilisés de WP Rocket, désactivez le plugin RapidLoad " +"Power-Up pour Autoptimize." -#: inc/vendors/classes/class-imagify-partner.php:532 -msgid "Sorry, you are not allowed to install plugins on this site." -msgstr "Désolé, vous n'avez pas les droits requis pour installer des extensions sur ce site." +#. translators: %1$s = plugin name. +#: inc/ThirdParty/Plugins/Optimization/WPMeteor.php:42 +msgid "" +"Delay JS is currently activated in %1$s. If you want to use WP Rocket’s " +"delay JS, disable %1$s" +msgstr "" +"Le report de l'exécution des JS est activée dans %1$s. Si vous voulez " +"utiliser le Report de l’exécution JavaScript de WP Rocket, désactivez %1$s" -#: inc/vendors/classes/class-imagify-partner.php:533 -msgid "Sorry, you are not allowed to do that." -msgstr "Désolé, vous n'avez pas droit de faire cela." +#: inc/ThirdParty/Plugins/Smush.php:108 inc/ThirdParty/Plugins/Smush.php:126 +msgid "Smush" +msgstr "Smush" -#: inc/vendors/classes/class-imagify-partner.php:534 -msgid "Plugin install failed." -msgstr "Installation de l'extension échouée." +#: inc/ThirdParty/Themes/Avada.php:107 +msgid "Avada" +msgstr "Avada" -#: inc/vendors/classes/class-imagify-partner.php:535 -msgid "Go back" -msgstr "Retour en arrière" +#: inc/ThirdParty/Themes/Divi.php:293 +msgid "" +"Your Divi template was updated. Clear the Used CSS if the layout, design or " +"CSS styles were changed." +msgstr "" +"Votre modèle Divi a été mis à jour. Purge le CSS utilisé si la mise en page," +" le design ou les styles CSS ont été changés." #: views/cpcss/activate-cpcss-mobile.php:13 msgid "Load CSS asynchronously for mobile" msgstr "Chargement asynchrone du CSS pour mobile" #: views/cpcss/activate-cpcss-mobile.php:14 -msgid "Your website currently uses the same Critical Path CSS for both desktop and mobile." -msgstr "Votre site web utiliser le même chemin critique de CSS pour les ordinateurs et mobiles." +msgid "" +"Your website currently uses the same Critical Path CSS for both desktop and " +"mobile." +msgstr "" +"Votre site web utiliser le même chemin critique de CSS pour les ordinateurs " +"et mobiles." #: views/cpcss/activate-cpcss-mobile.php:15 msgid "Click the button to enable mobile-specific CPCSS for your site." -msgstr "Peser le bouton pour activer le CPCSS spécifique aux mobiles pour votre site." +msgstr "" +"Peser le bouton pour activer le CPCSS spécifique aux mobiles pour votre " +"site." +#. translators: %1$s = opening link tag, %2$s = closing link tag. #: views/cpcss/activate-cpcss-mobile.php:20 #: views/settings/enable-google-fonts.php:19 -#, php-format -msgid "This is a one-time action and this button will be removed afterwards. %1$sMore info%2$s" -msgstr "Ceci est une action unique et ce bouton sera retiré ensuite. %1$sPlus d'info%2$s" +#: views/settings/mobile-cache.php:20 +msgid "" +"This is a one-time action and this button will be removed afterwards. " +"%1$sMore info%2$s" +msgstr "" +"Ceci est une action unique et ce bouton sera retiré ensuite. %1$sPlus " +"d'info%2$s" +#. translators: %1$s = opening link tag, %2$s = closing link tag. #: views/cpcss/activate-cpcss-mobile.php:30 -#, php-format -msgid "Your site is now using mobile-specific critical path CSS. %1$sMore info%2$s" -msgstr "Votre site présentement un chemin critique CSS spécifique aux mobiles. %1$sPlus d'info%2$s" +msgid "" +"Your site is now using mobile-specific critical path CSS. %1$sMore info%2$s" +msgstr "" +"Votre site présentement un chemin critique CSS spécifique aux mobiles. " +"%1$sPlus d'info%2$s" #: views/cpcss/activate-cpcss-mobile.php:39 msgid "Generate Mobile Specific CPCSS" @@ -2888,13 +4097,13 @@ msgstr "Générer CPCSS spécifique aux mobiles" msgid "Critical Path CSS" msgstr "CSS du chemin critique" +#. translators: %1$s = opening link tag, %2$s = closing link tag. #: views/cpcss/metabox/generate.php:23 -#, php-format msgid "Generate specific Critical Path CSS for this post. %1$sMore info%2$s" msgstr "Générer un chemin critique CSS pour cet article. %1$sPlus d'info%2$s" +#. translators: %1$s = opening link tag, %2$s = closing link tag. #: views/cpcss/metabox/generate.php:33 -#, php-format msgid "This post uses specific Critical Path CSS. %1$sMore info%2$s" msgstr "Cet article utilise un chemin critique de CSS. %1$sPlus d'info%2$s" @@ -2907,23 +4116,46 @@ msgid "Facing an issue?" msgstr "Vous rencontrez un problème ?" #: views/deactivation-intent/form.php:24 -msgid "It is not always necessary to deactivate WP Rocket when facing any issues. Most of them can be fixed by deactivating only some options." -msgstr "Il n'est pas toujours nécessaire de désactiver WP Rocket lorsque vous rencontrez des problèmes. La plupart d'entre eux peuvent être résolus en désactivant seulement certaines options." +msgid "" +"It is not always necessary to deactivate WP Rocket when facing any issues. " +"Most of them can be fixed by deactivating only some options." +msgstr "" +"Il n'est pas toujours nécessaire de désactiver WP Rocket lorsque vous " +"rencontrez des problèmes. La plupart d'entre eux peuvent être résolus en " +"désactivant seulement certaines options." +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. #: views/deactivation-intent/form.php:29 -#, php-format -msgid "Our advice? Instead of deactivating WP Rocket, use our %1$sSafe Mode%2$s to quickly disable LazyLoad, File Optimization, and CDN options. Then check to see if your issue is resolved." -msgstr "Notre conseil ? Au lieu de désactiver WP Rocket, utilisez notre %1$sConfiguration sans conflit%2$s pour désactiver rapidement les options LazyLoad, Optimisation des Fichiers et CDN. Vérifiez ensuite si votre problème est résolu." +msgid "" +"Our advice? Instead of deactivating WP Rocket, use our %1$sSafe Mode%2$s to " +"quickly disable LazyLoad, File Optimization, and CDN options. Then check to " +"see if your issue is resolved." +msgstr "" +"Notre conseil ? Au lieu de désactiver WP Rocket, utilisez notre " +"%1$sConfiguration sans conflit%2$s pour désactiver rapidement les options " +"LazyLoad, Optimisation des Fichiers et CDN. Vérifiez ensuite si votre " +"problème est résolu." #: views/deactivation-intent/form.php:35 msgid "Do you want to use our Safe Mode to troubleshoot WP Rocket?" -msgstr "Voulez-vous utiliser notre Configuration sans conflit pour dépanner WP Rocket ?" +msgstr "" +"Voulez-vous utiliser notre Configuration sans conflit pour dépanner WP " +"Rocket ?" +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. #: views/deactivation-intent/form.php:55 -#, php-format msgid "Yes, apply \"%1$sSafe Mode%2$s\"" msgstr "Oui, appliquer la %1$sConfiguration sans conflit%2$s" +#. translators: %1$s = opening strong tag, %2$s = closing strong tag. +#: views/deactivation-intent/form.php:68 +msgid "" +"and export WP Rocket settings %1$s(Recommended as current settings will be " +"deleted)%2$s" +msgstr "" +"et exporter les réglages de WP Rocket %1$s(recommandé car les réglages " +"actuels seront supprimés)%2$s" + #: views/deactivation-intent/form.php:76 msgid "No, deactivate and snooze this message for" msgstr "Non, désactiver et mettre en veilleuse ce message pour" @@ -2952,14 +4184,32 @@ msgstr "Annuler" msgid "Confirm" msgstr "Confirmer" +#. translators: %1$s = , %2$s = plugin version, %3$s = , %4$s +#. = , %5$s = , %6$s = . +#: views/plugins/update-renewal-expired-notice.php:27 +msgid "" +" %1$sWP Rocket %2$s%3$s is available. %4$sLearn more%5$s about the updates " +"and enhancements of this major version. You need an active license to use " +"them on your website, don’t miss out! %6$sRenew Now%5$s" +msgstr "" +" %1$sWP Rocket %2$s%3$s est disponible. %4$sEn savoir plus%5$s sur les mises" +" à jour et les améliorations de cette version majeure. Vous avez besoin " +"d'une licence active pour les utiliser sur votre site, ne manquez pas cette " +"occasion ! %6$sRenouveler maintenant%5$s" + #: views/settings/dynamic-lists-update.php:14 msgid "Update Inclusion and Exclusion Lists" msgstr "Mise à jour des listes d'inclusion et d'exclusion" +#. translators: %1$s = opening link tag, %2$s = closing link tag. #: views/settings/dynamic-lists-update.php:19 -#, php-format -msgid "Compatibility lists are downloaded automatically every week. Click the button if you want to update them manually. %1$sMore info%2$s" -msgstr "Les listes de compatibilité sont téléchargées automatiquement chaque semaine. Cliquez sur le bouton si vous souhaitez les mettre à jour manuellement. %1$sPlus d'infos%2$s" +msgid "" +"Compatibility lists are downloaded automatically every week. Click the " +"button if you want to update them manually. %1$sMore info%2$s" +msgstr "" +"Les listes de compatibilité sont téléchargées automatiquement chaque " +"semaine. Cliquez sur le bouton si vous souhaitez les mettre à jour " +"manuellement. %1$sPlus d'infos%2$s" #: views/settings/dynamic-lists-update.php:29 msgid "Update lists" @@ -2970,13 +4220,20 @@ msgid "Enable Google Font Optimization" msgstr "Activer l'optimisation des Google Fonts" #: views/settings/enable-google-fonts.php:14 -msgid "Improves font performance and combines multiple font requests to reduce the number of HTTP requests." -msgstr "Améliore la performance des fontes et combine plusieurs requêtes de fontes pour réduire le nombre d'appels HTTP." +msgid "" +"Improves font performance and combines multiple font requests to reduce the " +"number of HTTP requests." +msgstr "" +"Améliore la performance des fontes et combine plusieurs requêtes de fontes " +"pour réduire le nombre d'appels HTTP." +#. translators: %1$s = opening link tag, %2$s = closing link tag. #: views/settings/enable-google-fonts.php:29 -#, php-format -msgid "Google Fonts Optimization is now enabled for your site. %1$sMore info%2$s" -msgstr "L'optimisation des Google Fonts est maintenant activée pour votre site. %1$sPlus d'info%2$s" +msgid "" +"Google Fonts Optimization is now enabled for your site. %1$sMore info%2$s" +msgstr "" +"L'optimisation des Google Fonts est maintenant activée pour votre site. " +"%1$sPlus d'info%2$s" #: views/settings/enable-google-fonts.php:38 msgid "Optimize Google Fonts" @@ -2986,20 +4243,17 @@ msgstr "Optimiser Google Fonts" msgid "Clear cache after" msgstr "Vider le cache après" -#: views/settings/fields/cnames.php:58 -#: views/settings/fields/cnames.php:92 +#: views/settings/fields/cnames.php:58 views/settings/fields/cnames.php:92 #: views/settings/fields/cnames.php:122 msgid "CSS & JavaScript" msgstr "CSS et JavaScript" -#: views/settings/fields/cnames.php:59 -#: views/settings/fields/cnames.php:93 +#: views/settings/fields/cnames.php:59 views/settings/fields/cnames.php:93 #: views/settings/fields/cnames.php:123 msgid "JavaScript" msgstr "JavaScript" -#: views/settings/fields/cnames.php:60 -#: views/settings/fields/cnames.php:94 +#: views/settings/fields/cnames.php:60 views/settings/fields/cnames.php:94 #: views/settings/fields/cnames.php:124 msgid "CSS" msgstr "CSS" @@ -3022,8 +4276,8 @@ msgstr "Modifier les options" msgid "CDN CNAME" msgstr "Nom du CDN" +#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:62 -#, php-format msgid "Purges RocketCDN cached resources for your website. %s" msgstr "Purge les ressources en cache de votre site web dans RocketCDN. %s" @@ -3037,13 +4291,29 @@ msgstr "En savoir plus" msgid "Clear all RocketCDN cache files" msgstr "Effacer tous les fichiers de cache de RocketCDN" +#: views/settings/mobile-cache.php:11 +msgid "Mobile Cache" +msgstr "Cache mobile" + +#: views/settings/mobile-cache.php:14 +msgid "Speed your site for mobile visitors." +msgstr "Accélérez votre site pour vos visiteurs mobile." + +#: views/settings/mobile-cache.php:28 +msgid "Mobile Cache is now enabled for your site." +msgstr "Le Cache Mobile est maintenant activé pour votre site." + +#: views/settings/mobile-cache.php:34 +msgid "Enable Mobile Cache" +msgstr "Activer le Cache mobile" + #: views/settings/page-sections/cloudflare.php:27 msgid "Cloudflare Cache" msgstr "Cache de Cloudflare" +#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:35 #: views/settings/page-sections/sucuri.php:36 -#, php-format msgid "Purges cached resources for your website. %s" msgstr "Purge les ressources mises en cache de votre site web. %s" @@ -3055,81 +4325,111 @@ msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" msgid "Clear all Cloudflare cache files" msgstr "Effacer tous les fichiers en cache de Cloudflare" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "Félicitations!" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "WP Rocket est maintenant activé et prêt à travailler pour vous." -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "Votre site web devrait se charger plus rapidement maintenant!" -#: views/settings/page-sections/dashboard.php:44 -#, php-format -msgid "To guarantee fast websites, WP Rocket automatically applies 80% of web performance best practices." -msgstr "Afin d'assurer des sites rapides, WP Rocket applique automatiquement 80% des meilleures pratiques en terme de performance web." - -#: views/settings/page-sections/dashboard.php:44 -msgid "We also enable options that provide immediate benefits to your website." -msgstr "Nous activons également des options qui fournissent des bénéfices immédiats à votre site." +#: views/settings/page-sections/dashboard.php:45 +msgid "" +"To guarantee fast websites, WP Rocket automatically applies 80% of web " +"performance best practices." +msgstr "" +"Afin d'assurer des sites rapides, WP Rocket applique automatiquement 80% des" +" meilleures pratiques en terme de performance web." #: views/settings/page-sections/dashboard.php:45 +msgid "" +"We also enable options that provide immediate benefits to your website." +msgstr "" +"Nous activons également des options qui fournissent des bénéfices immédiats " +"à votre site." + +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" -msgstr "Continuez avec les options si vous souhaitez optimiser votre site davantage!" +msgstr "" +"Continuez avec les options si vous souhaitez optimiser votre site davantage!" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "Mon compte" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "Actualiser l’information" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "avec" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "Date d'expiration" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "Voir mon compte" +#: views/settings/page-sections/dashboard.php:131 views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "Analytiques Rocket" + +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/dashboard.php:137 +msgid "" +"I agree to share anonymous data with the development team to help improve WP" +" Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" +"J'accepte de partager des données anonymes avec l'équipe de développement " +"pour aider à améliorer WP Rocket. %1$sQuelles informations recueillerons-" +"nous?%2$s" + +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "Actions rapides" -#: views/settings/page-sections/dashboard.php:144 -msgid "Remove all cached files" -msgstr "Supprimer tous les fichiers du cache" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "Fichiers de cache" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." +msgstr "Cette action effacera et préchargera tous les fichiers du cache." + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "Cette action effacera tous les fichiers du cache." + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "Vider et précharger" + +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "Régénérer le CSS critique" -#: views/settings/page-sections/dashboard.php:182 -msgid "Remove Used CSS Cache" -msgstr "Retirer le cache du CSS utilis" - -#: views/settings/page-sections/dashboard.php:205 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "Foire aux questions" -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "Toujours pas trouvé de solution?" -#: views/settings/page-sections/dashboard.php:220 -msgid "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." +#: views/settings/page-sections/dashboard.php:230 +msgid "" +"Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "Envoyez un ticket et obtenez l'aide de nos sympathiques Rocketeers." -#: views/settings/page-sections/dashboard.php:228 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "Demandez au soutien" @@ -3138,62 +4438,98 @@ msgid "Backup your database before you run a cleanup!" msgstr "Faites une sauvegarde de votre base de données avant tout nettoyage!" #: views/settings/page-sections/database.php:26 -msgid "Once a database optimization has been performed, there is no way to undo it." -msgstr "Une fois qu’une optimisation de base de données est amorcée, les changements sont irréversibles." +msgid "" +"Once a database optimization has been performed, there is no way to undo it." +msgstr "" +"Une fois qu’une optimisation de base de données est amorcée, les changements" +" sont irréversibles." #: views/settings/page-sections/database.php:28 msgid "Save Changes and Optimize" msgstr "Sauvegarder changements et optimiser" -#: views/settings/page-sections/imagify.php:21 -#, php-format -msgid "%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image optimization.%2$s" -msgstr "%1$sWP ROCKET%2$s a créé %3$sIMAGIFY%4$s %1$spour la meilleure optimisation des images.%2$s" - -#: views/settings/page-sections/imagify.php:24 -msgid "Compress image to make your website faster, all while maintaining image quality." -msgstr "Compresser les images afin d'accélérer votre site, tout en maintenant la qualité des images." - -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" -msgstr "Plus d'info sur Imagify :" - -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" -msgstr "Page web de l'extension Imagify" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 +msgid "" +"%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" +msgstr "" +"%1$sWP Rocket a créé IMAGIFY pour donner un coup de pouce à la vitesse de " +"votre site web !%2$s" #: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" -msgstr "Site web d'Imagify" +msgid "Images can account for 50% of your loading time!" +msgstr "Les images peuvent représenter 50 % du temps de chargement !" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" -msgstr "Revue des extensions de compression d'images" +#: views/settings/page-sections/imagify.php:31 +msgid "" +"Imagify automatically optimizes all your images, helping your website gain " +"precious seconds while saving you time. With just one click, it resizes, " +"compresses, and converts your images to WebP and AVIF formats without " +"sacrificing quality." +msgstr "" +"Imagify optimise automatiquement toutes vos images, permettant ainsi à votre" +" site web de gagner de précieuses secondes tout en vous faisant gagner du " +"temps. En un seul clic, il redimensionne, compresse et convertit vos images " +"aux formats WebP et AVIF sans sacrifier la qualité." + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" +msgstr "%1$sCompresser%2$s toutes vos images en un seul clic" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" +msgstr "%1$sConvertir%2$s images vers WebP et Avif" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "%1$sRedimensionner%2$s vos images à la volée" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" +msgstr "%1$sPlan gratuit%2$s comprend 20MB/mois (environ 200 images)" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" +msgstr "" +"%1$sInstaller Imagify, le plus simple des optimiseurs d'images pour " +"WordPress%2$s" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "Installer Imagify" #: views/settings/page-sections/license.php:22 msgid "WP Rocket was not able to automatically validate your license." -msgstr "WP Rocket n'a pas été en mesure de valider automatiquement votre licence." +msgstr "" +"WP Rocket n'a pas été en mesure de valider automatiquement votre licence." +#. translators: %1$s = tutorial URL, %2$s = support URL. #: views/settings/page-sections/license.php:29 -#, php-format msgid "Follow this %1$s, or contact %2$s to get the engine started." msgstr "Suivre ce %1$s, ou contactez %2$s pour démarrer le système." +#. translators: %1$s = , %4$s = . #: views/settings/page-sections/license.php:32 -#, php-format msgid "%1$s%2$s%3$stutorial%4$s" msgstr "%1$s%2$s%3$stutoriel%4$s" #: views/settings/page-sections/license.php:34 -msgid "https://docs.wp-rocket.me/article/100-resolving-problems-with-license-validation/?utm_source=wp_plugin&utm_medium=wp_rocket" -msgstr "https://fr.docs.wp-rocket.me/article/257-resoudre-les-problemes-de-validation-de-licence/?utm_source=wp_plugin&utm_medium=wp_rocket" +msgid "" +"https://docs.wp-rocket.me/article/100-resolving-problems-with-license-" +"validation/?utm_source=wp_plugin&utm_medium=wp_rocket" +msgstr "" +"https://fr.docs.wp-rocket.me/article/257-resoudre-les-problemes-de-" +"validation-de-licence/?utm_source=wp_plugin&utm_medium=wp_rocket" +#. translators: %1$s = , %4$s = . #: views/settings/page-sections/license.php:40 -#, php-format msgid "%1$s%2$s%3$ssupport%4$s" msgstr "%1$s%2$s%3$ssupport%4$s" @@ -3201,18 +4537,19 @@ msgstr "%1$s%2$s%3$ssupport%4$s" msgid "Clear all Sucuri cache files" msgstr "Effacer tous les fichier de cache Sucuri" +#. translators: %1$s = formatted file size, %2$s = formatted number of entries +#. (don't use %2$d). #: views/settings/page-sections/tools.php:20 -#, php-format msgid "Files size: %1$s. Number of entries: %2$s." msgstr "Taille du fichier : %1$s. Nombre d'entrées : %2$s." +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/tools.php:23 -#, php-format msgid "%1$sDownload the file%2$s." msgstr "%1$sTélécharger le fichier%2$s." +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/tools.php:26 -#, php-format msgid "%1$sDelete the file%2$s." msgstr "%1$sEffacer le fichier%2$s." @@ -3232,18 +4569,22 @@ msgstr "Télécharger les réglages" msgid "Rollback" msgstr "Restauration" +#. translators: %s = WP Rocket version number. #: views/settings/page-sections/tools.php:64 -#, php-format msgid "Has version %s caused an issue on your website?" msgstr "La version %s vous pose des problèmes?" +#. translators: %s =
. #: views/settings/page-sections/tools.php:69 -#, php-format -msgid "You can rollback to the previous major version here.%sThen send us a support request." -msgstr "Vous pouvez retourner à la précédente version majeure ici.%sPuis envoyez-nous une requête de soutien technique." +msgid "" +"You can rollback to the previous major version here.%sThen send us a support" +" request." +msgstr "" +"Vous pouvez retourner à la précédente version majeure ici.%sPuis envoyez-" +"nous une requête de soutien technique." +#. translators: %s = WP Rocket previous version. #: views/settings/page-sections/tools.php:80 -#, php-format msgid "Reinstall version %s" msgstr "Réinstaller la version %s" @@ -3305,7 +4646,8 @@ msgstr "Dépannage" #: views/settings/page-sections/tutorials.php:33 msgid "Troubleshooting Display Issues with File Optimization" -msgstr "Diagnostiquer les problèmes d'affichage avec l'optimisation des fichiers" +msgstr "" +"Diagnostiquer les problèmes d'affichage avec l'optimisation des fichiers" #: views/settings/page-sections/tutorials.php:34 msgid "How to Find the Right JavaScript to Exclude" @@ -3323,8 +4665,8 @@ msgstr "Configurer l'extension Cloudflare" msgid "WP Rocket Settings" msgstr "Réglages de WP Rocket" +#. translators: %s = Plugin version number. #: views/settings/page.php:30 -#, php-format msgid "version %s" msgstr "version %s" @@ -3332,22 +4674,33 @@ msgstr "version %s" msgid "Show Sidebar" msgstr "Afficher la colonne latérale" +#. translators: %1$s = , %2$s = . #: views/settings/page.php:82 -#, php-format -msgid "Below is a detailed view of all data WP Rocket will collect %1$sif granted permission.%2$s" -msgstr "Vous trouverez ci-dessous une vue détaillée des données que WP Rocket recueillera %1$ssi l'autorisation lui est accordée.%2$s" +msgid "" +"Below is a detailed view of all data WP Rocket will collect %1$sif granted " +"permission.%2$s" +msgstr "" +"Vous trouverez ci-dessous une vue détaillée des données que WP Rocket " +"recueillera %1$ssi l'autorisation lui est accordée.%2$s" -#: views/settings/page.php:87 -msgid "WP Rocket will never transmit any domain names or email addresses (except for license validation), IP addresses, or third-party API keys." -msgstr "WP Rocket ne transmettra jamais de noms de domaine ou d'adresses courriels (sauf pour la validation de licence), d'adresses IP ou de clés d’API tierce-partie." +#: views/settings/page.php:88 +msgid "" +"WP Rocket will never transmit any domain names or email addresses (except " +"for license validation), IP addresses, or third-party API keys." +msgstr "" +"WP Rocket ne transmettra jamais de noms de domaine ou d'adresses courriels " +"(sauf pour la validation de licence), d'adresses IP ou de clés d’API tierce-" +"partie." -#: views/settings/page.php:89 +#: views/settings/page.php:90 msgid "Activate Rocket analytics" msgstr "Activer analytiques de Rocket" #: views/settings/partials/documentation.php:15 msgid "It is a great starting point to fix some of the most common issues." -msgstr "C'est un excellent point de départ pour résoudre certains des problèmes les plus fréquents." +msgstr "" +"C'est un excellent point de départ pour résoudre certains des problèmes les " +"plus fréquents." #: views/settings/partials/documentation.php:22 msgid "Read the documentation" @@ -3363,7 +4716,9 @@ msgstr "Comment bien mesurer le temps de chargement de votre site web" #: views/settings/partials/sidebar.php:14 msgid "Check our tutorial and learn how to measure the speed of your site." -msgstr "Consultez notre tutoriel et apprenez comment mesurer la vitesse de votre site." +msgstr "" +"Consultez notre tutoriel et apprenez comment mesurer la vitesse de votre " +"site." #: views/settings/partials/sidebar.php:15 #: views/settings/partials/sidebar.php:24 @@ -3387,193 +4742,13 @@ msgid "You have not activated logged-in user cache." msgstr "Vous n'avez pas activé le cache pour utilisateurs connectés." #: views/settings/partials/sidebar.php:34 -msgid "Use a private browser to check your website's speed and visual appearance." -msgstr "Utilisez un navigateur privé pour vérifier la vitesse et l’aspect visuel de votre site web." +msgid "" +"Use a private browser to check your website's speed and visual appearance." +msgstr "" +"Utilisez un navigateur privé pour vérifier la vitesse et l’aspect visuel de " +"votre site web." #: views/settings/sections/addons-container.php:24 #: views/settings/sections/fields-container.php:28 msgid "Need Help?" msgstr "Besoin d'aide ?" - -#: inc/Addon/Cloudflare/Cloudflare.php:205 -msgid "days" -msgstr "" - -#: inc/Addon/Cloudflare/Cloudflare.php:208 -msgid "seconds" -msgstr "" - -#: inc/Addon/Cloudflare/Cloudflare.php:210 -msgid "minutes" -msgstr "" - -#: inc/Addon/Cloudflare/Cloudflare.php:212 -msgid "hours" -msgstr "" - -#: inc/Addon/Cloudflare/Subscriber.php:224 -#: inc/Addon/Cloudflare/Subscriber.php:253 -#, php-format -msgid "%1$sWP Rocket:%2$s %3$s" -msgstr "" - -#: inc/Addon/Cloudflare/Subscriber.php:242 -#, php-format -msgid "%1$sWP Rocket:%2$s Cloudflare cache successfully purged." -msgstr "" - -#: inc/Addon/Cloudflare/Subscriber.php:328 -msgctxt "Cloudflare caching level" -msgid "standard" -msgstr "" - -#: inc/Addon/Cloudflare/Subscriber.php:403 -#, php-format -msgid "Cloudflare browser cache set to %s" -msgstr "" - -#: inc/Addon/Cloudflare/Subscriber.php:512 -#, php-format -msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" -msgstr "" - -#: inc/Addon/Cloudflare/Subscriber.php:521 -#, php-format -msgid "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to previous settings:" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:642 -msgid "If you have problems after activating this option, copy and paste the default exclusions to quickly resolve issues:" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:646 -#, php-format -msgid "Also, please check our %1$sdocumentation%2$s for a list of compatibility exclusions." -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:651 -msgid "Internal scripts are excluded by default to prevent issues. Remove them to take full advantage of this option." -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:654 -#, php-format -msgid "If this causes trouble, restore the default exclusions, found %1$shere%2$s" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:942 -msgid "One-click exclusions" -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:943 -msgid "When using the Delay JavaScript Execution, you might experience delay loading elements located in the viewport that need to appear immediately - e.g. slider, header, menu." -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:944 -msgid "If you need instant visibility, click below on files that should NOT be delayed. This selection will help users interact with the elements straight away." -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:1827 -#, php-format -msgid "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just activate the official Cloudflare plugin and configure it. WP Rocket will automatically enable compatibility." -msgstr "" - -#: inc/Engine/Admin/Settings/Page.php:2129 -msgctxt "Sucuri" -msgid "Firewall API key (for plugin), must be in format {32 characters}/{32 characters}:" -msgstr "" - -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:840 -#, php-format -msgid "We highly recommend the %1$supdated Remove Unused CSS%2$s for a better CSS optimization. Load CSS Asynchronously is always available as a back-up." -msgstr "" - -#: inc/Engine/CriticalPath/CriticalCSSSubscriber.php:845 -msgid "Stay with the old option" -msgstr "" - -#: inc/Engine/License/Renewal.php:76 -#, php-format -msgid "Renew before it is too late, you will only pay %1$s%2$s%3$s!" -msgstr "" - -#: inc/Engine/License/Renewal.php:85 -#, php-format -msgid "Renew with a %1$s%2$s discount%3$s before it is too late, you will only pay %4$s%5$s%6$s!" -msgstr "" - -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 -msgid "Analytics & Ads" -msgstr "" - -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 -msgid "Plugins" -msgstr "" - -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 -msgid "Themes" -msgstr "" - -#: inc/Engine/Optimization/DynamicLists/ServiceProvider.php:52 -msgid "Default Lists" -msgstr "" - -#: inc/Engine/Optimization/DynamicLists/ServiceProvider.php:58 -msgid "Delay JavaScript Execution Exclusion Lists" -msgstr "" - -#: inc/Engine/Optimization/RUCSS/Cron/Subscriber.php:174 -msgid "WP Rocket clear Remove Unused CSS failed jobs" -msgstr "" - -#: inc/Engine/Preload/Cron/Subscriber.php:166 -msgid "WP Rocket Preload revert stuck failed jobs" -msgstr "" - -#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:157 -msgid "Your site is using the official Cloudflare plugin. We have enabled Cloudflare auto-purge for compatibility. If you have APO activated, it is also compatible." -msgstr "" - -#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:158 -msgid "Cloudflare cache will be purged each time WP Rocket clears its cache to ensure content is always up-to-date." -msgstr "" - -#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:202 -#, php-format -msgid "%1$sWP Rocket:%2$s You are using \"Dynamic Cookies Cache\". Cloudflare APO is not yet compatible with that feature." -msgstr "" - -#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:208 -#, php-format -msgid "You should either disable Cloudflare APO or check with the theme/plugin requiring the use of “Dynamic Cookies Cache” developers for an alternative way to be page-cache friendly. %1$sMore info%2$s" -msgstr "" - -#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:259 -#, php-format -msgid "%1$sWP Rocket:%2$s You are using \"Separate cache files for mobile devices\". You need to activate \"Cache by Device Type\" %3$ssetting%5$s on Cloudflare APO to serve the right version of the cache. %4$sMore info%5$s" -msgstr "" - -#: inc/ThirdParty/Plugins/CDN/Cloudflare.php:280 -#, php-format -msgid "%1$sWP Rocket:%2$s You have \"Cache by Device Type\" enabled on Cloudflare APO. If you judge it necessary for the website to have a different cache on mobile and desktop, we suggest you enable our “Separate Cache Files for Mobiles Devices” to ensure the generated cache is accurate." -msgstr "" - -#: inc/ThirdParty/Plugins/Optimization/Perfmatters.php:38 -msgid "Remove Unused CSS is currently activated in Perfmatters. If you want to use WP Rocket's Remove Unused CSS feature, disable this option in Perfmatters." -msgstr "" - -#: inc/ThirdParty/Plugins/Optimization/RapidLoad.php:39 -msgid "Automated unused CSS removal is currently activated in RapidLoad Power-Up for Autoptimize. If you want to use WP Rocket's Remove Unused CSS feature, disable the RapidLoad Power-Up for Autoptimize plugin." -msgstr "" - -#: inc/admin/ui/notices.php:757 -msgid "Turn on Remove Unused CSS" -msgstr "" - -#: inc/admin/ui/notices.php:763 -msgid "Enable “Separate Cache Files for Mobile Devices” now" -msgstr "" - -#: views/deactivation-intent/form.php:68 -#, php-format -msgid "and export WP Rocket settings %1$s(Recommended as current settings will be deleted)%2$s" -msgstr "" From dc5bdafbd06494ceaa4c2eb6c023ea983492bc42 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:37:04 +0000 Subject: [PATCH 171/192] Translate languages/rocket.pot in ro_RO 100% translated source file: 'languages/rocket.pot' on 'ro_RO'. --- languages/rocket-ro_RO.po | 1032 +++++++++++++++++++------------------ 1 file changed, 543 insertions(+), 489 deletions(-) diff --git a/languages/rocket-ro_RO.po b/languages/rocket-ro_RO.po index aa7e72daa3..6b626ff526 100644 --- a/languages/rocket-ro_RO.po +++ b/languages/rocket-ro_RO.po @@ -7,9 +7,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.16-alpha1\n" +"Project-Id-Version: WP Rocket 3.17-alpha4\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-04-29T20:40:45+00:00\n" +"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Dan Caragea , 2024\n" "Language-Team: Romanian (Romania) (https://app.transifex.com/wp-media/teams/18133/ro_RO/)\n" @@ -50,9 +50,9 @@ msgstr "https://wp-media.me" #: inc/ThirdParty/Hostings/Godaddy.php:63 #: inc/ThirdParty/Hostings/O2Switch.php:49 #: inc/ThirdParty/Hostings/OneCom.php:137 -#: inc/ThirdParty/Hostings/Pressidium.php:49 +#: inc/ThirdParty/Hostings/Pressidium.php:50 #: inc/ThirdParty/Hostings/ProIsp.php:51 inc/ThirdParty/Hostings/Savvii.php:50 -#: inc/ThirdParty/Hostings/WPEngine.php:47 +#: inc/ThirdParty/Hostings/WPEngine.php:46 #: inc/ThirdParty/Hostings/WPXCloud.php:51 msgid "" "Your site is hosted on %s, we have enabled Varnish auto-purge for " @@ -183,41 +183,31 @@ msgstr "Nivel de cache Cloudflare setat la %s" #. translators: %s is the message returned by the CloudFlare API. #: inc/Addon/Cloudflare/Subscriber.php:368 -msgid "Cloudflare minification error: %s" -msgstr "Eroare de minificare Cloudflare: %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:375 -msgid "Cloudflare minification %s" -msgstr "Minificare Cloudflare %s" - -#. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare rocket loader error: %s" msgstr "Eroare rocket loader Cloudflare: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:400 +#: inc/Addon/Cloudflare/Subscriber.php:375 msgid "Cloudflare rocket loader %s" msgstr "Rocket loader Cloudflare %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:418 +#: inc/Addon/Cloudflare/Subscriber.php:393 msgid "Cloudflare browser cache error: %s" msgstr "Eroare cache navigator Cloudflare: %s" #. translators: %s is the message returned by the CloudFlare API. -#: inc/Addon/Cloudflare/Subscriber.php:425 +#: inc/Addon/Cloudflare/Subscriber.php:400 msgid "Cloudflare browser cache set to %s" msgstr "Cache-ul navigatorului Cloudflare este setat la %s" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:536 +#: inc/Addon/Cloudflare/Subscriber.php:507 msgid "%1$sWP Rocket:%2$s Optimal settings activated for Cloudflare:" msgstr "%1$sWP Rocket:%2$s setările optime sunt activate pentru Cloudflare:" #. translators: %1$s = strong opening tag, %2$s = strong closing tag. -#: inc/Addon/Cloudflare/Subscriber.php:545 +#: inc/Addon/Cloudflare/Subscriber.php:516 msgid "" "%1$sWP Rocket:%2$s Optimal settings deactivated for Cloudflare, reverted to " "previous settings:" @@ -225,7 +215,7 @@ msgstr "" "%1$sWP Rocket:%2$s setările optime sunt dezactivate pentru Cloudflare, am " "revenit la setările anterioare:" -#: inc/Addon/Cloudflare/Subscriber.php:661 inc/admin/options.php:165 +#: inc/Addon/Cloudflare/Subscriber.php:632 inc/admin/options.php:165 #: inc/classes/subscriber/Tools/class-detect-missing-tags-subscriber.php:148 msgid "WP Rocket: " msgstr "WP Rocket: " @@ -391,7 +381,7 @@ msgid "Settings" msgstr "Setări" #: inc/admin/admin.php:96 inc/admin/admin.php:117 inc/deprecated/3.5.php:898 -#: inc/Engine/Cache/AdminSubscriber.php:134 +#: inc/Engine/Cache/AdminSubscriber.php:135 msgid "Clear this cache" msgstr "Șterge acest cache" @@ -423,17 +413,17 @@ msgstr "Importul setărilor a eșuat: conținut neașteptat pentru fișier." msgid "Settings imported and saved." msgstr "Setările au fost importate și salvate." -#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:571 +#: inc/admin/options.php:102 inc/Engine/Admin/Settings/Page.php:551 msgid "Excluded CSS Files" msgstr "Fișiere CSS excluse" -#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:725 +#: inc/admin/options.php:103 inc/Engine/Admin/Settings/Page.php:699 msgid "Excluded Inline JavaScript" msgstr "JavaScript în-linie exclus" -#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:743 -#: inc/Engine/Admin/Settings/Page.php:776 -#: inc/Engine/Admin/Settings/Page.php:823 +#: inc/admin/options.php:104 inc/Engine/Admin/Settings/Page.php:717 +#: inc/Engine/Admin/Settings/Page.php:750 +#: inc/Engine/Admin/Settings/Page.php:797 msgid "Excluded JavaScript Files" msgstr "Fișiere JavaScript excluse" @@ -445,19 +435,19 @@ msgstr "Fișiere Întârzie JavaScript" msgid "Excluded Delay JavaScript Files" msgstr "Fișiere Întârzie JavaScript excluse" -#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1229 +#: inc/admin/options.php:107 inc/Engine/Admin/Settings/Page.php:1203 msgid "Never Cache URL(s)" msgstr "Nu memora niciodată în cache URL-uri" -#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1243 +#: inc/admin/options.php:108 inc/Engine/Admin/Settings/Page.php:1217 msgid "Never Cache User Agent(s)" msgstr "Nu memora niciodată în cache agentul (agenții) utilizator" -#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1249 +#: inc/admin/options.php:109 inc/Engine/Admin/Settings/Page.php:1223 msgid "Always Purge URL(s)" msgstr "Curăță întotdeauna URL-ul (URL-urile)" -#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1530 +#: inc/admin/options.php:110 inc/Engine/Admin/Settings/Page.php:1504 msgid "Exclude files from CDN" msgstr "Exclude fișiere din CDN" @@ -478,8 +468,6 @@ msgid "More info" msgstr "Mai multe informații" #: inc/admin/ui/meta-boxes.php:37 inc/admin/ui/notices.php:671 -#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 msgid "Clear cache" msgstr "Șterge cache" @@ -663,16 +651,15 @@ msgstr "%s: cache termen șters." msgid "%s: User cache cleared." msgstr "%s: cache utilizator șters." -#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:36 -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:32 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:42 -#: inc/Engine/License/views/renewal-expired-banner.php:30 -#: views/settings/page-sections/dashboard.php:46 +#: inc/admin/ui/notices.php:662 inc/Engine/License/views/promo-banner.php:38 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:34 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:44 +#: inc/Engine/License/views/renewal-expired-banner.php:32 +#: views/settings/page-sections/dashboard.php:47 msgid "Dismiss this notice" msgstr "Respinge această notificare" -#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:80 -#: inc/Engine/Saas/Admin/AdminBar.php:198 +#: inc/admin/ui/notices.php:682 inc/Engine/Saas/Admin/AdminBar.php:51 msgid "Clear Used CSS" msgstr "Șterge CSS-ul utilizat" @@ -752,8 +739,8 @@ msgstr "Reinstalează versiunea %s" #: inc/classes/class-wp-rocket-requirements-check.php:203 #: inc/classes/class-wp-rocket-requirements-check.php:214 #: inc/deprecated/3.11.php:236 inc/deprecated/3.11.php:251 -#: inc/Engine/Plugin/UpdaterSubscriber.php:483 -#: inc/Engine/Plugin/UpdaterSubscriber.php:497 +#: inc/Engine/Plugin/UpdaterSubscriber.php:477 +#: inc/Engine/Plugin/UpdaterSubscriber.php:491 msgid "%s Update Rollback" msgstr "Actualizează restaurarea %s" @@ -778,10 +765,13 @@ msgstr "" "working/?utm_source=wp_plugin&utm_medium=wp_rocket#theme" #: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 -#: views/settings/page-sections/dashboard.php:150 -msgid "Clear and preload cache" +msgid "Clear and Preload Cache" msgstr "Șterge și pre-încarcă cache-ul" +#: inc/common/admin-bar.php:91 inc/common/admin-bar.php:154 +msgid "Clear Cache" +msgstr "Șterge cache" + #: inc/common/admin-bar.php:131 inc/functions/i18n.php:20 msgid "All languages" msgstr "Toate limbile" @@ -806,7 +796,7 @@ msgstr "Șterge cache-ul RocketCDN" msgid "Documentation" msgstr "Documentație" -#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:36 +#: inc/deprecated/3.2.php:52 views/settings/page-sections/imagify.php:107 msgid "Activate Imagify" msgstr "Activează Imagify" @@ -954,7 +944,7 @@ msgstr "" "de a le pre-încărca." #. translators: 1 and 3 are link openings, 2 is a link closing. -#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:520 +#: inc/deprecated/3.11.php:279 inc/Engine/Plugin/UpdaterSubscriber.php:514 msgid "%1$sReturn to WP Rocket%2$s or %3$sgo to Plugins page%2$s" msgstr "%1$sÎntoarce-te la WP Rocket%2$s sau %3$smergi la pagina Module%2$s" @@ -1036,7 +1026,7 @@ msgstr "" msgid "Choose a file from your computer (maximum size: %s)" msgstr "Alege un fișier din computer (dimensiune maximă: %s)" -#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:422 +#: inc/deprecated/deprecated.php:1294 inc/Engine/Admin/Settings/Render.php:469 msgid "Upload file and import settings" msgstr "Încarcă fișierul și importă setările" @@ -1119,8 +1109,8 @@ msgstr "De bază" msgid "Static Files" msgstr "Fișiere statice" -#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1500 -#: inc/Engine/Admin/Settings/Page.php:1511 +#: inc/deprecated/deprecated.php:1773 inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1485 #: inc/Engine/CDN/Admin/Subscriber.php:28 msgid "CDN" msgstr "CDN" @@ -1129,22 +1119,22 @@ msgstr "CDN" msgid "Advanced" msgstr "Avansat" -#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1345 +#: inc/deprecated/deprecated.php:1775 inc/Engine/Admin/Settings/Page.php:1319 msgid "Database" msgstr "Bază de date" -#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1051 +#: inc/deprecated/deprecated.php:1776 inc/Engine/Admin/Settings/Page.php:1025 msgid "Preload" msgstr "Pre-încărcare" #: inc/deprecated/deprecated.php:1786 -#: inc/Engine/Admin/Settings/Subscriber.php:170 +#: inc/Engine/Admin/Settings/Subscriber.php:173 #: views/settings/page-sections/tools.php:33 msgid "Tools" msgstr "Unelte" -#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:357 -#: views/settings/page-sections/dashboard.php:80 +#: inc/deprecated/deprecated.php:1789 inc/Engine/Admin/Settings/Page.php:368 +#: views/settings/page-sections/dashboard.php:81 msgid "License" msgstr "Licență" @@ -1188,27 +1178,27 @@ msgid "weekly" msgstr "săptămânal" #: inc/Engine/Admin/Database/Optimization.php:30 -#: inc/Engine/Admin/Settings/Page.php:1389 +#: inc/Engine/Admin/Settings/Page.php:1363 msgid "Revisions" msgstr "Revizii" #: inc/Engine/Admin/Database/Optimization.php:31 -#: inc/Engine/Admin/Settings/Page.php:1399 +#: inc/Engine/Admin/Settings/Page.php:1373 msgid "Auto Drafts" msgstr "Ciorne automate" #: inc/Engine/Admin/Database/Optimization.php:32 -#: inc/Engine/Admin/Settings/Page.php:1409 +#: inc/Engine/Admin/Settings/Page.php:1383 msgid "Trashed Posts" msgstr "Articole aruncate la gunoi" #: inc/Engine/Admin/Database/Optimization.php:33 -#: inc/Engine/Admin/Settings/Page.php:1419 +#: inc/Engine/Admin/Settings/Page.php:1393 msgid "Spam Comments" msgstr "Comentarii spam" #: inc/Engine/Admin/Database/Optimization.php:34 -#: inc/Engine/Admin/Settings/Page.php:1429 +#: inc/Engine/Admin/Settings/Page.php:1403 msgid "Trashed Comments" msgstr "Comentarii aruncate la gunoi" @@ -1263,63 +1253,46 @@ msgstr "" msgid "Regenerate WP Rocket configuration files now" msgstr "Regenerează acum fișierele de configurare WP Rocket" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Save Changes" msgstr "Salvează modificările" -#: inc/Engine/Admin/Settings/Page.php:223 +#: inc/Engine/Admin/Settings/Page.php:222 msgid "Validate License" msgstr "Validează licența" -#: inc/Engine/Admin/Settings/Page.php:279 -#: inc/Engine/Admin/Settings/Page.php:280 inc/functions/admin.php:550 +#: inc/Engine/Admin/Settings/Page.php:278 +#: inc/Engine/Admin/Settings/Page.php:279 inc/functions/admin.php:550 msgid "Unavailable" msgstr "Indisponibilă" -#: inc/Engine/Admin/Settings/Page.php:374 +#: inc/Engine/Admin/Settings/Page.php:385 msgid "API key" msgstr "Cheie API" -#: inc/Engine/Admin/Settings/Page.php:389 +#: inc/Engine/Admin/Settings/Page.php:400 msgid "Email address" msgstr "Adresă email" -#: inc/Engine/Admin/Settings/Page.php:415 +#: inc/Engine/Admin/Settings/Page.php:426 msgid "Dashboard" msgstr "Panou control" -#: inc/Engine/Admin/Settings/Page.php:416 +#: inc/Engine/Admin/Settings/Page.php:427 msgid "Get help, account info" msgstr "Primești ajutor, informații despre cont" -#: inc/Engine/Admin/Settings/Page.php:425 -msgid "My Status" -msgstr "Starea mea" - -#: inc/Engine/Admin/Settings/Page.php:435 views/settings/page.php:75 -msgid "Rocket Analytics" -msgstr "Analitice Rocket" - -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:437 -msgid "" -"I agree to share anonymous data with the development team to help improve WP" -" Rocket. %1$sWhat info will we collect?%2$s" -msgstr "" -"Sunt de acord să partajez date anonime cu echipa de dezvoltare pentru a " -"ajuta la îmbunătățirea WP Rocket. %1$sCe informații vom colecta?%2$s" - -#: inc/Engine/Admin/Settings/Page.php:489 +#: inc/Engine/Admin/Settings/Page.php:475 msgid "File Optimization" msgstr "Optimizare fișiere" -#: inc/Engine/Admin/Settings/Page.php:490 +#: inc/Engine/Admin/Settings/Page.php:476 msgid "Optimize CSS & JS" msgstr "Optimizează CSS și JS" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:498 +#: inc/Engine/Admin/Settings/Page.php:484 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable this option in Autoptimize." @@ -1328,17 +1301,17 @@ msgstr "" "Dacă vrei să folosești minificarea oferită de %2$s, dezactivează această " "opțiune în Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:508 +#: inc/Engine/Admin/Settings/Page.php:494 msgid "CSS Files" msgstr "Fișiere CSS" -#: inc/Engine/Admin/Settings/Page.php:517 +#: inc/Engine/Admin/Settings/Page.php:503 msgid "JavaScript Files" msgstr "Fișiere JavaScript" #. translators: %1$s = type of minification (HTML, CSS or JS), %2$s = “WP #. Rocket”. -#: inc/Engine/Admin/Settings/Page.php:524 +#: inc/Engine/Admin/Settings/Page.php:510 msgid "" "%1$s Minification is currently activated in Autoptimize. If" " you want to use %2$s’s minification, disable those options in Autoptimize." @@ -1347,7 +1320,7 @@ msgstr "" "vrei să folosești minificarea %2$s, dezactivează acele opțiuni în " "Autoptimize." -#: inc/Engine/Admin/Settings/Page.php:529 +#: inc/Engine/Admin/Settings/Page.php:515 msgid "" "If you have problems after activating this option, copy and paste the " "default exclusions to quickly resolve issues:" @@ -1356,7 +1329,7 @@ msgstr "" "excluderile implicite pentru a rezolva rapid problemele:" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:533 +#: inc/Engine/Admin/Settings/Page.php:519 msgid "" "Also, please check our %1$sdocumentation%2$s for a list of compatibility " "exclusions." @@ -1364,7 +1337,7 @@ msgstr "" "De asemenea, te rog să consulți %1$sdocumentația%2$s noastră pentru a vedea " "o listă cu excluderile la compatibilitate." -#: inc/Engine/Admin/Settings/Page.php:538 +#: inc/Engine/Admin/Settings/Page.php:524 msgid "" "Internal scripts are excluded by default to prevent issues. Remove them to " "take full advantage of this option." @@ -1373,53 +1346,31 @@ msgstr "" "probleme. Înlătură-le ca să beneficiezi din plin de această opțiune." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:541 +#: inc/Engine/Admin/Settings/Page.php:527 msgid "" "If this causes trouble, restore the default exclusions, found %1$shere%2$s" msgstr "" "Dacă apar probleme, restaurează excluderile implicite, le găsești " "%1$saici%2$s" -#: inc/Engine/Admin/Settings/Page.php:550 +#: inc/Engine/Admin/Settings/Page.php:536 msgid "Minify CSS files" msgstr "Minifică fișierele CSS" -#: inc/Engine/Admin/Settings/Page.php:551 +#: inc/Engine/Admin/Settings/Page.php:537 msgid "Minify CSS removes whitespace and comments to reduce the file size." msgstr "" "Minifică CSS înlătură spațiile goale și comentariile pentru a reduce " "dimensiunea fișierului." -#: inc/Engine/Admin/Settings/Page.php:564 -#: inc/Engine/Admin/Settings/Page.php:628 -#: inc/Engine/Admin/Settings/Page.php:694 -#: inc/Engine/Admin/Settings/Page.php:718 -msgid "This could break things!" -msgstr "Asta ar putea strica unele lucruri!" - -#: inc/Engine/Admin/Settings/Page.php:565 -#: inc/Engine/Admin/Settings/Page.php:629 -#: inc/Engine/Admin/Settings/Page.php:695 -#: inc/Engine/Admin/Settings/Page.php:719 -msgid "" -"If you notice any errors on your website after having activated this " -"setting, just deactivate it again, and your site will be back to normal." -msgstr "" -"Dacă după activarea acestei setări observi erori pe site-ul tău, trebuie " -"doar s-o dezactivezi și site-ul va reveni la normal." - -#: inc/Engine/Admin/Settings/Page.php:566 -msgid "Activate minify CSS" -msgstr "Activează minifică CSS" - -#: inc/Engine/Admin/Settings/Page.php:572 +#: inc/Engine/Admin/Settings/Page.php:552 msgid "" "Specify URLs of CSS files to be excluded from minification (one per line)." msgstr "" "Specifică URL-urile fișierelor CSS care vor fi excluse din minificare (câte " "unul pe un rând)." -#: inc/Engine/Admin/Settings/Page.php:573 +#: inc/Engine/Admin/Settings/Page.php:553 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).css wildcards to exclude all CSS files located at a " @@ -1430,7 +1381,7 @@ msgstr "" " fișierele CSS localizate pe o anumită cale." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:575 +#: inc/Engine/Admin/Settings/Page.php:555 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external CSS. %1$sMore info%2$s" @@ -1439,12 +1390,12 @@ msgstr "" "calea completă a URL-ului sau doar numele de domeniu. %1$sMai multe " "informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:588 -#: inc/Engine/Admin/Settings/Page.php:610 +#: inc/Engine/Admin/Settings/Page.php:568 +#: inc/Engine/Admin/Settings/Page.php:590 msgid "Optimize CSS delivery" msgstr "Optimizează livrarea CSS" -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1455,7 +1406,7 @@ msgstr "" " este recomandată Înlătură CSS-ul neutilizat, dar este disponibilă numai " "pentru utilizatorii care au o licență activă." -#: inc/Engine/Admin/Settings/Page.php:593 +#: inc/Engine/Admin/Settings/Page.php:573 msgid "" "Optimize CSS delivery eliminates render-blocking CSS on your website. Only " "one method can be selected. Remove Unused CSS is recommended for optimal " @@ -1466,7 +1417,7 @@ msgstr "" "CSS-ul neutilizat pentru o performanță optimă." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:603 +#: inc/Engine/Admin/Settings/Page.php:583 msgid "" "Optimize CSS Delivery features are disabled on local environments. %1$sLearn" " more%2$s" @@ -1474,13 +1425,12 @@ msgstr "" "Funcționalitățile pentru Optimizează livrarea CSS sunt dezactivate în " "mediile locale. %1$sAflă mai multe%2$s" -#: inc/Engine/Admin/Settings/Page.php:623 -#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 -msgid "Remove Unused CSS" -msgstr "Înlătură CSS-ul neutilizat" +#: inc/Engine/Admin/Settings/Page.php:603 +msgid "Remove Unused CSS (RUCSS)" +msgstr "Înlătură CSS-ul neutilizat (RUCSS)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:626 +#: inc/Engine/Admin/Settings/Page.php:606 msgid "" "Removes unused CSS per page and helps to reduce page size and HTTP requests." " Recommended for best performance. Test thoroughly! %1$sMore info%2$s" @@ -1489,15 +1439,29 @@ msgstr "" "paginilor și cererile HTTP. Este recomandat pentru o performanță mai bună. " "Testează în mod aprofundat! %1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:630 +#: inc/Engine/Admin/Settings/Page.php:608 +#: inc/Engine/Admin/Settings/Page.php:692 +msgid "This could break things!" +msgstr "Asta ar putea strica unele lucruri!" + +#: inc/Engine/Admin/Settings/Page.php:609 +#: inc/Engine/Admin/Settings/Page.php:693 +msgid "" +"If you notice any errors on your website after having activated this " +"setting, just deactivate it again, and your site will be back to normal." +msgstr "" +"Dacă după activarea acestei setări observi erori pe site-ul tău, trebuie " +"doar s-o dezactivezi și site-ul va reveni la normal." + +#: inc/Engine/Admin/Settings/Page.php:610 msgid "Activate Remove Unused CSS" msgstr "Activează Înlătură CSS-ul neutilizat" -#: inc/Engine/Admin/Settings/Page.php:636 +#: inc/Engine/Admin/Settings/Page.php:616 msgid "CSS safelist" msgstr "Listă sigură CSS" -#: inc/Engine/Admin/Settings/Page.php:637 +#: inc/Engine/Admin/Settings/Page.php:617 msgid "" "Specify CSS filenames, IDs or classes that should not be removed (one per " "line)." @@ -1505,13 +1469,13 @@ msgstr "" "Specifică numele fișierelor CSS, ID-urile sau clasele care nu ar trebui " "înlăturate (câte unul per linie)." -#: inc/Engine/Admin/Settings/Page.php:652 -#: inc/Engine/CriticalPath/Admin/Subscriber.php:200 +#: inc/Engine/Admin/Settings/Page.php:632 +#: inc/Engine/CriticalPath/Admin/Subscriber.php:201 msgid "Load CSS asynchronously" msgstr "Încarcă fișierele CSS asincron" #. translators: %1$s = plugin name. -#: inc/Engine/Admin/Settings/Page.php:655 +#: inc/Engine/Admin/Settings/Page.php:635 msgctxt "WP Critical CSS compatibility" msgid "" "Load CSS asynchronously is currently handled by the %1$s plugin. If you want" @@ -1522,19 +1486,19 @@ msgstr "" "dezactivează modulul %1$s." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:657 +#: inc/Engine/Admin/Settings/Page.php:637 msgid "" "Generates critical path CSS and loads CSS asynchronously. %1$sMore info%2$s" msgstr "" "Generează CSS pe cale critică și încarcă fișierele CSS asincron. %1$sMai " "multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:663 +#: inc/Engine/Admin/Settings/Page.php:643 msgid "Fallback critical CSS" msgstr "CSS critic de rezervă" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:665 +#: inc/Engine/Admin/Settings/Page.php:645 msgid "" "Provides a fallback if auto-generated critical path CSS is incomplete. " "%1$sMore info%2$s" @@ -1542,22 +1506,18 @@ msgstr "" "Oferă o alternativă dacă CSS-ul de cale critic generat automat este " "incomplet. %1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:680 +#: inc/Engine/Admin/Settings/Page.php:660 msgid "Minify JavaScript files" msgstr "Minifică fișierele JavaScript" -#: inc/Engine/Admin/Settings/Page.php:681 +#: inc/Engine/Admin/Settings/Page.php:661 msgid "" "Minify JavaScript removes whitespace and comments to reduce the file size." msgstr "" "Minifică JavaScript înlătură spațiile goale și comentariile pentru a reduce " "dimensiunea fișierului." -#: inc/Engine/Admin/Settings/Page.php:696 -msgid "Activate minify JavaScript" -msgstr "Activează minifică JavaScript" - -#: inc/Engine/Admin/Settings/Page.php:701 +#: inc/Engine/Admin/Settings/Page.php:675 msgid "" "Combine JavaScript files (Enable Minify JavaScript files to select)" msgstr "" @@ -1565,7 +1525,7 @@ msgstr "" "pentru a selecta)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:703 +#: inc/Engine/Admin/Settings/Page.php:677 msgid "" "Combine JavaScript files combines your site’s internal, 3rd party and inline" " JS reducing HTTP requests. Not recommended if your site uses HTTP/2. " @@ -1575,8 +1535,7 @@ msgstr "" "resursele terțe și JS-ul în-line, reducând cererile HTTP. Nu este recomandat" " dacă site-ul tău folosește HTTP/2. %1$sMai multe informații%2$s" -#. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:704 +#: inc/Engine/Admin/Settings/Page.php:678 msgid "" "For compatibility and best results, this option is disabled when delay " "javascript execution is enabled." @@ -1584,12 +1543,12 @@ msgstr "" "Pentru compatibilitate și rezultate foarte bune, această opțiune este " "dezactivată când este activată opțiunea întârzie executarea javascript." -#: inc/Engine/Admin/Settings/Page.php:720 +#: inc/Engine/Admin/Settings/Page.php:694 msgid "Activate combine JavaScript" msgstr "Activează combină JavaScript" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:727 +#: inc/Engine/Admin/Settings/Page.php:701 msgid "" "Specify patterns of inline JavaScript to be excluded from concatenation (one" " per line). %1$sMore info%2$s" @@ -1597,7 +1556,7 @@ msgstr "" "Specifică structurile JavaScript în-line care să fie excluse din concatenare" " (câte una pe un rând). %1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:744 +#: inc/Engine/Admin/Settings/Page.php:718 msgid "" "Specify URLs of JavaScript files to be excluded from minification and " "concatenation (one per line)." @@ -1605,7 +1564,7 @@ msgstr "" "Specifică URL-urile fișierelor JavaScript care să fie excluse din minificare" " și concatenare (câte unul pe un rând)." -#: inc/Engine/Admin/Settings/Page.php:745 +#: inc/Engine/Admin/Settings/Page.php:719 msgid "" "Internal: The domain part of the URL will be stripped " "automatically. Use (.*).js wildcards to exclude all JS files located at a " @@ -1616,7 +1575,7 @@ msgstr "" "fișierele JS localizate pe o anumită cale." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:747 +#: inc/Engine/Admin/Settings/Page.php:721 msgid "" "3rd Party: Use either the full URL path or only the domain " "name, to exclude external JS. %1$sMore info%2$s" @@ -1625,13 +1584,13 @@ msgstr "" "calea completă a URL-ului ori fie numai numele de domeniu. %1$sMai multe " "informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:763 +#: inc/Engine/Admin/Settings/Page.php:737 #: inc/Engine/Optimization/DeferJS/AdminSubscriber.php:76 msgid "Load JavaScript deferred" msgstr "Încarcă JavaScript întârziat" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:765 +#: inc/Engine/Admin/Settings/Page.php:739 msgid "" "Load JavaScript deferred eliminates render-blocking JS on your site and can " "improve load time. %1$sMore info%2$s" @@ -1640,7 +1599,7 @@ msgstr "" "ul tău și poate îmbunătăți timpul de încărcare. %1$sMai multe informații%2$s" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:778 +#: inc/Engine/Admin/Settings/Page.php:752 msgid "" "Specify URLs or keywords of JavaScript files to be excluded from defer (one " "per line). %1$sMore info%2$s" @@ -1649,13 +1608,13 @@ msgstr "" "fie excluse de la amânare (câte unul pe fiecare linie). %1$sMai multe " "informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:794 +#: inc/Engine/Admin/Settings/Page.php:768 #: inc/Engine/Optimization/DelayJS/Admin/Subscriber.php:210 msgid "Delay JavaScript execution" msgstr "Întârzie executarea JavaScript" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:796 +#: inc/Engine/Admin/Settings/Page.php:770 msgid "" "Improves performance by delaying the loading of JavaScript files until user " "interaction (e.g. scroll, click). %1$sMore info%2$s" @@ -1664,11 +1623,11 @@ msgstr "" "până la interacțiunea cu utilizatorul (de exemplu: derulează, dă clic). " "%1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:805 +#: inc/Engine/Admin/Settings/Page.php:779 msgid "One-click exclusions" msgstr "Excluderi cu un singur clic" -#: inc/Engine/Admin/Settings/Page.php:806 +#: inc/Engine/Admin/Settings/Page.php:780 msgid "" "When using the Delay JavaScript Execution, you might experience delay " "loading elements located in the viewport that need to appear immediately - " @@ -1678,7 +1637,7 @@ msgstr "" "întârziere la încărcarea elementelor situate în spațiul vizibil care ar " "trebui să apară imediat - de exemplu, carusel, antet, meniu." -#: inc/Engine/Admin/Settings/Page.php:807 +#: inc/Engine/Admin/Settings/Page.php:781 msgid "" "If you need instant visibility, click below on files that should NOT be " "delayed. This selection will help users interact with the elements straight " @@ -1688,7 +1647,7 @@ msgstr "" "care NU vrei să fie întârziate. Această selectare va ajuta utilizatorii să " "interacționeze imediat cu aceste elemente." -#: inc/Engine/Admin/Settings/Page.php:824 +#: inc/Engine/Admin/Settings/Page.php:798 msgid "" "Specify URLs or keywords that can identify inline or JavaScript files to be " "excluded from delaying execution (one per line)." @@ -1697,24 +1656,24 @@ msgstr "" "line sau JavaScript care să fie excluse din întârzierea executării (câte " "unul pe o linie)." -#: inc/Engine/Admin/Settings/Page.php:856 +#: inc/Engine/Admin/Settings/Page.php:830 msgid "Media" msgstr "Media" -#: inc/Engine/Admin/Settings/Page.php:857 +#: inc/Engine/Admin/Settings/Page.php:831 msgid "LazyLoad, image dimensions" msgstr "Încărcare lentă, dimensiuni imagini" -#: inc/Engine/Admin/Settings/Page.php:866 +#: inc/Engine/Admin/Settings/Page.php:840 msgid "Autoptimize" msgstr "Autoptimize" -#: inc/Engine/Admin/Settings/Page.php:920 +#: inc/Engine/Admin/Settings/Page.php:894 msgid "LazyLoad" msgstr "Încărcare lentă" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:923 +#: inc/Engine/Admin/Settings/Page.php:897 msgid "" "It can improve actual and perceived loading time as images, iframes, and " "videos will be loaded only as they enter (or about to enter) the viewport " @@ -1726,7 +1685,7 @@ msgstr "" "reduce numărul de cereri HTTP. %1$sMai multe informații%2$s" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:930 +#: inc/Engine/Admin/Settings/Page.php:904 msgid "" "LazyLoad is currently activated in %2$s. If you want to use WP Rocket’s " "LazyLoad, disable this option in %2$s." @@ -1735,12 +1694,12 @@ msgstr "" "încărcarea lentă a imaginilor de la WP Rocket, dezactivează această opțiune " "în %2$s." -#: inc/Engine/Admin/Settings/Page.php:933 +#: inc/Engine/Admin/Settings/Page.php:907 msgid "Image Dimensions" msgstr "Dimensiuni imagini" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:936 +#: inc/Engine/Admin/Settings/Page.php:910 msgid "" "Add missing width and height attributes to images. Helps prevent layout " "shifts and improve the reading experience for your visitors. %1$sMore " @@ -1750,12 +1709,12 @@ msgstr "" "Împiedică schimbările la aranjamente și îmbunătățește experiența de " "vizualizare a vizitatorilor tăi. %1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:955 +#: inc/Engine/Admin/Settings/Page.php:929 msgid "Enable for images" msgstr "Activează pentru imagini" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin names. -#: inc/Engine/Admin/Settings/Page.php:967 +#: inc/Engine/Admin/Settings/Page.php:941 msgid "" "LazyLoad for images is currently activated in %2$s. If you want to use " "%1$s’s LazyLoad, disable this option in %2$s." @@ -1764,27 +1723,27 @@ msgstr "" "folosești încărcarea lentă a imaginilor de la %1$s, dezactivează această " "opțiune în %2$s." -#: inc/Engine/Admin/Settings/Page.php:975 +#: inc/Engine/Admin/Settings/Page.php:949 msgid "Enable for CSS background images" msgstr "Activează pentru imagini de fundal CSS" -#: inc/Engine/Admin/Settings/Page.php:990 +#: inc/Engine/Admin/Settings/Page.php:964 msgid "Enable for iframes and videos" msgstr "Activează pentru iframe-uri și videouri" -#: inc/Engine/Admin/Settings/Page.php:1005 +#: inc/Engine/Admin/Settings/Page.php:979 msgid "Replace YouTube iframe with preview image" msgstr "Înlocuiește iframe-ul YouTube cu imaginea de previzualizare" #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "Replace YouTube iframe with preview image is not compatible with %2$s." msgstr "" "Înlocuiește iframe-ul YouTube cu imaginea de previzualizare nu este o " "acțiune compatibilă cu %2$s." #. translators: %1$s = “WP Rocket”, %2$s = a list of plugin or themes names. -#: inc/Engine/Admin/Settings/Page.php:1007 +#: inc/Engine/Admin/Settings/Page.php:981 msgid "" "This can significantly improve your loading time if you have a lot of " "YouTube videos on a page." @@ -1792,12 +1751,12 @@ msgstr "" "Îți poate îmbunătăți semnificativ timpul de încărcare dacă ai o mulțime de " "videouri YouTube pe o pagină." -#: inc/Engine/Admin/Settings/Page.php:1022 +#: inc/Engine/Admin/Settings/Page.php:996 msgid "Excluded images or iframes" msgstr "Imagini sau iframe-uri excluse" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1024 +#: inc/Engine/Admin/Settings/Page.php:998 msgid "" "Specify keywords (e.g. image filename, CSS filename, CSS class, domain) from" " the image or iframe code to be excluded (one per line). %1$sMore info%2$s" @@ -1806,20 +1765,20 @@ msgstr "" " clasă CSS, domeniu) din imagine sau codurile iframe care trebuie excluse " "(câte unul pe un rând). %1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:1032 +#: inc/Engine/Admin/Settings/Page.php:1006 msgid "Add missing image dimensions" msgstr "Adaugă dimensiunile care lipsesc pentru imagini" -#: inc/Engine/Admin/Settings/Page.php:1052 +#: inc/Engine/Admin/Settings/Page.php:1026 msgid "Generate cache files, preload fonts" msgstr "Generează fișiere cache, pre-încarcă fonturi" -#: inc/Engine/Admin/Settings/Page.php:1064 +#: inc/Engine/Admin/Settings/Page.php:1038 msgid "Preload Cache" msgstr "Pre-încarcă cache" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1067 +#: inc/Engine/Admin/Settings/Page.php:1041 msgid "" "When you enable preloading WP Rocket will automatically detect your sitemaps" " and save all URLs to the database. The plugin will make sure that your " @@ -1829,12 +1788,12 @@ msgstr "" " salva toate URL-urile în baza de date. Modulul asigură că cache-ul este " "mereu preîncărcat." -#: inc/Engine/Admin/Settings/Page.php:1075 +#: inc/Engine/Admin/Settings/Page.php:1049 msgid "Preload Links" msgstr "Pre-încarcă legături" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1078 +#: inc/Engine/Admin/Settings/Page.php:1052 msgid "" "Link preloading improves the perceived load time by downloading a page when " "a user hovers over the link. %1$sMore info%2$s" @@ -1843,11 +1802,11 @@ msgstr "" "descărcarea unei pagini atunci când un utilizator trece peste legătură. " "%1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:1086 +#: inc/Engine/Admin/Settings/Page.php:1060 msgid "Prefetch DNS Requests" msgstr "Pre-aduce cereri DNS" -#: inc/Engine/Admin/Settings/Page.php:1088 +#: inc/Engine/Admin/Settings/Page.php:1062 msgid "" "DNS prefetching can make external files load faster, especially on mobile " "networks" @@ -1855,12 +1814,12 @@ msgstr "" "Pre-aducerea DNS poate face ca fișierele externe să se încarce mai rapid, în" " special în rețelele pentru mobil" -#: inc/Engine/Admin/Settings/Page.php:1093 +#: inc/Engine/Admin/Settings/Page.php:1067 msgid "Preload Fonts" msgstr "Pre-încarcă fonturi" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1096 +#: inc/Engine/Admin/Settings/Page.php:1070 msgid "" "Improves performance by helping browsers discover fonts in CSS files. " "%1$sMore info%2$s" @@ -1868,16 +1827,16 @@ msgstr "" "Îmbunătățește performanța ajutând navigatoarele să descopere fonturi în " "fișierele CSS. %1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:1110 +#: inc/Engine/Admin/Settings/Page.php:1084 msgid "Activate Preloading" msgstr "Activează pre-încărcarea" -#: inc/Engine/Admin/Settings/Page.php:1121 +#: inc/Engine/Admin/Settings/Page.php:1095 msgid "Exclude URLs" msgstr "Exclude URL-urile" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1126 +#: inc/Engine/Admin/Settings/Page.php:1100 msgid "" "Specify URLs to be excluded from the preload feature (one per line). " "%1$sMore info%2$s" @@ -1885,11 +1844,11 @@ msgstr "" "Specifică URL-urile care să fie excluse din funcționalitatea preîncărcare " "(câte unul pe un rând). %1$sMai multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:1137 +#: inc/Engine/Admin/Settings/Page.php:1111 msgid "URLs to prefetch" msgstr "URL-uri de pre-adus" -#: inc/Engine/Admin/Settings/Page.php:1138 +#: inc/Engine/Admin/Settings/Page.php:1112 msgid "" "Specify external hosts to be prefetched (no http:, one per " "line)" @@ -1897,11 +1856,11 @@ msgstr "" "Specifică gazdele externe care să fie pre-aduse (fără http:, " "una pe linie)" -#: inc/Engine/Admin/Settings/Page.php:1147 +#: inc/Engine/Admin/Settings/Page.php:1121 msgid "Fonts to preload" msgstr "Fonturi pentru pre-încărcat" -#: inc/Engine/Admin/Settings/Page.php:1148 +#: inc/Engine/Admin/Settings/Page.php:1122 msgid "" "Specify urls of the font files to be preloaded (one per line). Fonts must be" " hosted on your own domain, or the domain you have specified on the CDN tab." @@ -1910,7 +1869,7 @@ msgstr "" "unul pe o linie). Fonturile trebuie să fie găzduite pe propriu domeniu sau " "pe domeniul specificat în fila CDN." -#: inc/Engine/Admin/Settings/Page.php:1149 +#: inc/Engine/Admin/Settings/Page.php:1123 msgid "" "The domain part of the URL will be stripped automatically.
Allowed font " "extensions: otf, ttf, svg, woff, woff2." @@ -1918,53 +1877,53 @@ msgstr "" "Partea din URL care conține domeniul va fi eliminată automat.
Extensii " "de font permise: otf, ttf, svg, woff, woff2." -#: inc/Engine/Admin/Settings/Page.php:1158 +#: inc/Engine/Admin/Settings/Page.php:1132 msgid "Enable link preloading" msgstr "Activează pre-încărcarea legăturilor" -#: inc/Engine/Admin/Settings/Page.php:1177 +#: inc/Engine/Admin/Settings/Page.php:1151 msgid "Advanced Rules" msgstr "Reguli avansate" -#: inc/Engine/Admin/Settings/Page.php:1178 +#: inc/Engine/Admin/Settings/Page.php:1152 msgid "Fine-tune cache rules" msgstr "Ajustează fin regulile cache" -#: inc/Engine/Admin/Settings/Page.php:1191 +#: inc/Engine/Admin/Settings/Page.php:1165 msgid "" "Sensitive pages like custom login/logout URLs should be excluded from cache." msgstr "" "Paginile sensibile, cum ar fi URL-urile personalizate de " "autentificare/dezautentificare, ar trebui să fie excluse din cache." -#: inc/Engine/Admin/Settings/Page.php:1194 +#: inc/Engine/Admin/Settings/Page.php:1168 msgctxt "plugin name" msgid "WooCommerce" msgstr "WooCommerce" -#: inc/Engine/Admin/Settings/Page.php:1196 +#: inc/Engine/Admin/Settings/Page.php:1170 msgctxt "plugin name" msgid "Easy Digital Downloads" msgstr "Easy Digital Downloads" -#: inc/Engine/Admin/Settings/Page.php:1198 +#: inc/Engine/Admin/Settings/Page.php:1172 msgctxt "plugin name" msgid "iThemes Exchange" msgstr "iThemes Exchange" -#: inc/Engine/Admin/Settings/Page.php:1200 +#: inc/Engine/Admin/Settings/Page.php:1174 msgctxt "plugin name" msgid "Jigoshop" msgstr "Jigoshop" -#: inc/Engine/Admin/Settings/Page.php:1202 +#: inc/Engine/Admin/Settings/Page.php:1176 msgctxt "plugin name" msgid "WP-Shop" msgstr "WP-Shop" #. translators: %1$s = opening tag, %2$s = plugin name, %3$s closing #. tag. -#: inc/Engine/Admin/Settings/Page.php:1208 +#: inc/Engine/Admin/Settings/Page.php:1182 msgid "" "
Cart, checkout and \"my account\" pages set in " "%1$s%2$s%3$s will be detected and never cached by default." @@ -1973,12 +1932,12 @@ msgstr "" "în %1$s%2$s%3$s vor fi detectate și implicit nu sunt " "memorate niciodată în cache." -#: inc/Engine/Admin/Settings/Page.php:1218 +#: inc/Engine/Admin/Settings/Page.php:1192 msgid "Cache Lifespan" msgstr "Durată de viață cache" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1221 +#: inc/Engine/Admin/Settings/Page.php:1195 msgid "" "Cache files older than the specified lifespan will be deleted.
Enable " "%1$spreloading%2$s for the cache to be rebuilt automatically after lifespan " @@ -1988,16 +1947,16 @@ msgstr "" "
Activează %1$spre-încărcarea%2$s pentru cache-ul care să fie reconstruit" " automat după expirarea duratei de viață." -#: inc/Engine/Admin/Settings/Page.php:1237 +#: inc/Engine/Admin/Settings/Page.php:1211 msgid "Never Cache Cookies" msgstr "Nu memora niciodată în cache cookie-uri" -#: inc/Engine/Admin/Settings/Page.php:1255 +#: inc/Engine/Admin/Settings/Page.php:1229 msgid "Cache Query String(s)" msgstr "Memorează în cache șirul (șirurile) de interogare" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1232 msgid "" "%1$sCache for query strings%2$s enables you to force caching for specific " "GET parameters." @@ -2005,14 +1964,14 @@ msgstr "" "%1$sCache pentru șiruri de interogare%2$s îți permite să forțezi cache-ul " "pentru parametrii GET specifici." -#: inc/Engine/Admin/Settings/Page.php:1269 +#: inc/Engine/Admin/Settings/Page.php:1243 msgid "" "Specify time after which the global cache is cleared
(0 = unlimited )" msgstr "" "Specifică timpul după care cache-ul global este șters
(0 = nelimitat)" #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1271 +#: inc/Engine/Admin/Settings/Page.php:1245 msgid "" "Reduce lifespan to 10 hours or less if you notice issues that seem to appear" " periodically. %1$sWhy?%2$s" @@ -2020,27 +1979,27 @@ msgstr "" "Reduci durata de viață la 10 ore sau mai puțin dacă remarci probleme care " "par să apară periodic. %1$sDe ce?%2$s" -#: inc/Engine/Admin/Settings/Page.php:1277 -#: inc/Engine/License/views/promo-banner.php:30 -#: inc/Engine/License/views/renewal-soon-banner.php:13 +#: inc/Engine/Admin/Settings/Page.php:1251 +#: inc/Engine/License/views/promo-banner.php:32 +#: inc/Engine/License/views/renewal-soon-banner.php:15 msgid "Hours" msgstr "Ore" -#: inc/Engine/Admin/Settings/Page.php:1278 -#: inc/Engine/License/views/promo-banner.php:29 -#: inc/Engine/License/views/renewal-soon-banner.php:12 +#: inc/Engine/Admin/Settings/Page.php:1252 +#: inc/Engine/License/views/promo-banner.php:31 +#: inc/Engine/License/views/renewal-soon-banner.php:14 msgid "Days" msgstr "Zile" -#: inc/Engine/Admin/Settings/Page.php:1283 +#: inc/Engine/Admin/Settings/Page.php:1257 msgid "" "Specify URLs of pages or posts that should never be cached (one per line)" msgstr "" "Specifică URL-urile paginilor sau articolelor care nu ar trebui să fie " "niciodată memorate în cache (unul pe linie)" -#: inc/Engine/Admin/Settings/Page.php:1284 -#: inc/Engine/Admin/Settings/Page.php:1312 +#: inc/Engine/Admin/Settings/Page.php:1258 +#: inc/Engine/Admin/Settings/Page.php:1286 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to address multiple URLs under a given path." @@ -2049,7 +2008,7 @@ msgstr "" "metacaracterele (.*) pentru a scrie adresa mai multor URL-uri pentru o cale " "dată." -#: inc/Engine/Admin/Settings/Page.php:1293 +#: inc/Engine/Admin/Settings/Page.php:1267 msgid "" "Specify full or partial IDs of cookies that, when set in the visitor's " "browser, should prevent a page from getting cached (one per line)" @@ -2058,18 +2017,18 @@ msgstr "" " sunt setate în navigatorul vizitatorilor, ar trebui să împiedice păstrarea " "în memoria cache a unei pagini (câte unul pe o linie)" -#: inc/Engine/Admin/Settings/Page.php:1301 +#: inc/Engine/Admin/Settings/Page.php:1275 msgid "" "Specify user agent strings that should never see cached pages (one per line)" msgstr "" "Specifică șirurile de agenți utilizator care nu ar trebui să vadă niciodată " "pagini memorate în cache (unul pe linie)" -#: inc/Engine/Admin/Settings/Page.php:1302 +#: inc/Engine/Admin/Settings/Page.php:1276 msgid "Use (.*) wildcards to detect parts of UA strings." msgstr "Folosește metacaractere (.*) pentru a detecta părți din șirurile UA." -#: inc/Engine/Admin/Settings/Page.php:1311 +#: inc/Engine/Admin/Settings/Page.php:1285 msgid "" "Specify URLs you always want purged from cache whenever you update any post " "or page (one per line)" @@ -2077,20 +2036,20 @@ msgstr "" "Specifică URL-urile care vrei să fie curățate întotdeauna din cache ori de " "câte ori actualizezi un articol sau o pagină (unul pe linie)" -#: inc/Engine/Admin/Settings/Page.php:1320 +#: inc/Engine/Admin/Settings/Page.php:1294 msgid "Specify query strings for caching (one per line)" msgstr "" "Specifică șirurile de interogare pentru memorare în cache (unul pe linie)" -#: inc/Engine/Admin/Settings/Page.php:1346 +#: inc/Engine/Admin/Settings/Page.php:1320 msgid "Optimize, reduce bloat" msgstr "Optimizează, reduce dimensiunea" -#: inc/Engine/Admin/Settings/Page.php:1353 +#: inc/Engine/Admin/Settings/Page.php:1327 msgid "Post Cleanup" msgstr "Curățare articole" -#: inc/Engine/Admin/Settings/Page.php:1355 +#: inc/Engine/Admin/Settings/Page.php:1329 msgid "" "Post revisions and drafts will be permanently deleted. Do not use this " "option if you need to retain revisions or drafts." @@ -2098,20 +2057,20 @@ msgstr "" "Reviziile și ciornele articolelor vor fi șterse definitiv. Nu folosi această" " opțiune dacă trebuie să păstrezi reviziile sau ciornele." -#: inc/Engine/Admin/Settings/Page.php:1360 +#: inc/Engine/Admin/Settings/Page.php:1334 msgid "Comments Cleanup" msgstr "Curățare comentarii" -#: inc/Engine/Admin/Settings/Page.php:1362 +#: inc/Engine/Admin/Settings/Page.php:1336 msgid "Spam and trashed comments will be permanently deleted." msgstr "" "Comentariile spam și comentariile aruncate la gunoi vor fi șterse definitiv." -#: inc/Engine/Admin/Settings/Page.php:1366 +#: inc/Engine/Admin/Settings/Page.php:1340 msgid "Transients Cleanup" msgstr "Curățare tranzienți" -#: inc/Engine/Admin/Settings/Page.php:1368 +#: inc/Engine/Admin/Settings/Page.php:1342 msgid "" "Transients are temporary options; they are safe to remove. They will be " "automatically regenerated as your plugins require them." @@ -2119,21 +2078,21 @@ msgstr "" "Tranzienții sunt opțiuni temporare; pot fi înlăturați fără probleme. Vor fi " "regenerați automat pe măsură ce modulele tale îi cer." -#: inc/Engine/Admin/Settings/Page.php:1372 +#: inc/Engine/Admin/Settings/Page.php:1346 msgid "Database Cleanup" msgstr "Curățare bază de date" -#: inc/Engine/Admin/Settings/Page.php:1374 +#: inc/Engine/Admin/Settings/Page.php:1348 msgid "Reduces overhead of database tables" msgstr "Reduce costul de funcționare a tabelelor din baza de date" -#: inc/Engine/Admin/Settings/Page.php:1378 +#: inc/Engine/Admin/Settings/Page.php:1352 msgid "Automatic Cleanup" msgstr "Ștergere automată" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1391 +#: inc/Engine/Admin/Settings/Page.php:1365 msgid "%s revision in your database." msgid_plural "%s revisions in your database." msgstr[0] "%s revizie în baza ta de date." @@ -2142,7 +2101,7 @@ msgstr[2] "%s de revizii în baza ta de date." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1401 +#: inc/Engine/Admin/Settings/Page.php:1375 msgid "%s draft in your database." msgid_plural "%s drafts in your database." msgstr[0] "%s ciornă în baza ta de date." @@ -2151,7 +2110,7 @@ msgstr[2] "%s de ciorne în baza ta de date." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1411 +#: inc/Engine/Admin/Settings/Page.php:1385 msgid "%s trashed post in your database." msgid_plural "%s trashed posts in your database." msgstr[0] "%s articol aruncat la gunoi în baza ta de date." @@ -2160,7 +2119,7 @@ msgstr[2] "%s de articole aruncate la gunoi în baza ta de date." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1421 +#: inc/Engine/Admin/Settings/Page.php:1395 msgid "%s spam comment in your database." msgid_plural "%s spam comments in your database." msgstr[0] "%s comentariu spam în baza ta de date." @@ -2169,64 +2128,64 @@ msgstr[2] "%s de comentarii spam în baza ta de date." #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1431 +#: inc/Engine/Admin/Settings/Page.php:1405 msgid "%s trashed comment in your database." msgid_plural "%s trashed comments in your database." msgstr[0] "%s comentariu aruncat la gunoi în baza ta de date." msgstr[1] "%s comentarii aruncate la gunoi în baza ta de date." msgstr[2] "%s de comentarii aruncate la gunoi în baza ta de date." -#: inc/Engine/Admin/Settings/Page.php:1439 +#: inc/Engine/Admin/Settings/Page.php:1413 msgid "All transients" msgstr "Toți tranzienții" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1441 +#: inc/Engine/Admin/Settings/Page.php:1415 msgid "%s transient in your database." msgid_plural "%s transients in your database." msgstr[0] "%s tranzient în baza ta de date." msgstr[1] "%s tranzienți în baza ta de date." msgstr[2] "%s de tranzienți în baza ta de date." -#: inc/Engine/Admin/Settings/Page.php:1449 +#: inc/Engine/Admin/Settings/Page.php:1423 msgid "Optimize Tables" msgstr "Optimizează tabelele" #. translators: %s is the number of revisions found in the database. It's a #. formatted number, don't use %d. -#: inc/Engine/Admin/Settings/Page.php:1451 +#: inc/Engine/Admin/Settings/Page.php:1425 msgid "%s table to optimize in your database." msgid_plural "%s tables to optimize in your database." msgstr[0] "%s tabel de optimizat în baza ta de date." msgstr[1] "%s tabele de optimizat în baza ta de date." msgstr[2] "%s de tabele de optimizat în baza ta de date." -#: inc/Engine/Admin/Settings/Page.php:1462 +#: inc/Engine/Admin/Settings/Page.php:1436 msgid "Schedule Automatic Cleanup" msgstr "Programează ștergerea automată" -#: inc/Engine/Admin/Settings/Page.php:1474 +#: inc/Engine/Admin/Settings/Page.php:1448 msgid "Frequency" msgstr "Frecvență" -#: inc/Engine/Admin/Settings/Page.php:1482 +#: inc/Engine/Admin/Settings/Page.php:1456 msgid "Daily" msgstr "Zilnic" -#: inc/Engine/Admin/Settings/Page.php:1483 +#: inc/Engine/Admin/Settings/Page.php:1457 msgid "Weekly" msgstr "Săptămânal" -#: inc/Engine/Admin/Settings/Page.php:1484 +#: inc/Engine/Admin/Settings/Page.php:1458 msgid "Monthly" msgstr "Lunar" -#: inc/Engine/Admin/Settings/Page.php:1501 +#: inc/Engine/Admin/Settings/Page.php:1475 msgid "Integrate your CDN" msgstr "Integrează-ți CDN-ul" -#: inc/Engine/Admin/Settings/Page.php:1513 +#: inc/Engine/Admin/Settings/Page.php:1487 msgid "" "All URLs of static files (CSS, JS, images) will be rewritten to the CNAME(s)" " you provide." @@ -2235,7 +2194,7 @@ msgstr "" "CNAME-ul furnizat (CNAME-urile furnizate)." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Admin/Settings/Page.php:1515 +#: inc/Engine/Admin/Settings/Page.php:1489 msgid "" "Not required for services like Cloudflare and Sucuri. Please see our " "available %1$sAdd-ons%2$s." @@ -2245,7 +2204,7 @@ msgstr "" #. translators: %1$s = opening em tag, %2$l = list of add-on name(s), %3$s = #. closing em tag. -#: inc/Engine/Admin/Settings/Page.php:1561 +#: inc/Engine/Admin/Settings/Page.php:1533 msgid "" "%1$s%2$l Add-on%3$s is currently enabled. Configuration of the CDN settings " "is not required for %2$l to work on your site." @@ -2262,28 +2221,28 @@ msgstr[2] "" "În prezent, sunt activate %1$s%2$l de suplimente%3$s. Configurarea setărilor" " CDN nu este necesară pentru ca %2$l să funcționeze pe site-ul tău." -#: inc/Engine/Admin/Settings/Page.php:1587 +#: inc/Engine/Admin/Settings/Page.php:1559 msgid "Enable Content Delivery Network" msgstr "Activează rețeaua de livrare a conținutului" -#: inc/Engine/Admin/Settings/Page.php:1596 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:159 +#: inc/Engine/Admin/Settings/Page.php:1568 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:162 msgid "CDN CNAME(s)" msgstr "CNAME (CNAME-uri) CDN" -#: inc/Engine/Admin/Settings/Page.php:1597 -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:160 +#: inc/Engine/Admin/Settings/Page.php:1569 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:163 msgid "Specify the CNAME(s) below" msgstr "Specifică CNAME-ul (CNAME-urile) mai jos" -#: inc/Engine/Admin/Settings/Page.php:1604 +#: inc/Engine/Admin/Settings/Page.php:1576 msgid "" "Specify URL(s) of files that should not get served via CDN (one per line)." msgstr "" "Specifică URL-urile fișierelor care nu ar trebui să fie servite prin CDN " "(unul pe linie)." -#: inc/Engine/Admin/Settings/Page.php:1605 +#: inc/Engine/Admin/Settings/Page.php:1577 msgid "" "The domain part of the URL will be stripped automatically.
Use (.*) " "wildcards to exclude all files of a given file type located at a specific " @@ -2293,16 +2252,16 @@ msgstr "" "metacaracterele (.*) pentru a exclude toate fișierele unui tip de fișier dat" " localizate pe o anumită cale." -#: inc/Engine/Admin/Settings/Page.php:1628 -#: inc/Engine/Admin/Settings/Page.php:1636 +#: inc/Engine/Admin/Settings/Page.php:1600 +#: inc/Engine/Admin/Settings/Page.php:1608 msgid "Heartbeat" msgstr "Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1629 +#: inc/Engine/Admin/Settings/Page.php:1601 msgid "Control WordPress Heartbeat API" msgstr "Controlează WordPress Heartbeat API" -#: inc/Engine/Admin/Settings/Page.php:1637 +#: inc/Engine/Admin/Settings/Page.php:1609 msgid "" "Reducing or disabling the Heartbeat API’s activity can help save some of " "your server’s resources." @@ -2310,11 +2269,11 @@ msgstr "" "Reducând sau dezactivând activitățile API-ului Heartbeat te poate ajuta să " "nu mai folosești o parte din resursele serverului tău." -#: inc/Engine/Admin/Settings/Page.php:1643 +#: inc/Engine/Admin/Settings/Page.php:1615 msgid "Reduce or disable Heartbeat activity" msgstr "Reduce sau dezactivează activitățile Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Reducing activity will change Heartbeat frequency from one hit each minute " "to one hit every 2 minutes." @@ -2322,55 +2281,55 @@ msgstr "" "Reducerea activității va modifica frecvența Heartbeat de la o vizită în " "fiecare minut la o vizită la fiecare 2 minute." -#: inc/Engine/Admin/Settings/Page.php:1644 +#: inc/Engine/Admin/Settings/Page.php:1616 msgid "" "Disabling Heartbeat entirely may break plugins and themes using this API." msgstr "" "Dezactivarea completă a Heartbeat poate întrerupe funcționarea modulelor și " "temelor când de folosește acest API." -#: inc/Engine/Admin/Settings/Page.php:1658 +#: inc/Engine/Admin/Settings/Page.php:1630 msgid "Do not limit" msgstr "Nu limita" -#: inc/Engine/Admin/Settings/Page.php:1659 +#: inc/Engine/Admin/Settings/Page.php:1631 msgid "Reduce activity" msgstr "Reduce activitatea" -#: inc/Engine/Admin/Settings/Page.php:1660 +#: inc/Engine/Admin/Settings/Page.php:1632 msgid "Disable" msgstr "Dezactivează" -#: inc/Engine/Admin/Settings/Page.php:1668 +#: inc/Engine/Admin/Settings/Page.php:1640 msgid "Control Heartbeat" msgstr "Controlează Heartbeat" -#: inc/Engine/Admin/Settings/Page.php:1677 +#: inc/Engine/Admin/Settings/Page.php:1649 msgid "Behavior in backend" msgstr "Comportament în partea administrativă a sitului" -#: inc/Engine/Admin/Settings/Page.php:1684 +#: inc/Engine/Admin/Settings/Page.php:1656 msgid "Behavior in post editor" msgstr "Comportament în editor de articole" -#: inc/Engine/Admin/Settings/Page.php:1690 +#: inc/Engine/Admin/Settings/Page.php:1662 msgid "Behavior in frontend" msgstr "Comportament în partea din față a sitului" -#: inc/Engine/Admin/Settings/Page.php:1709 +#: inc/Engine/Admin/Settings/Page.php:1681 #: views/settings/page-sections/tutorials.php:39 msgid "Add-ons" msgstr "Suplimente" -#: inc/Engine/Admin/Settings/Page.php:1710 +#: inc/Engine/Admin/Settings/Page.php:1682 msgid "Add more features" msgstr "Adaugă mai multe funcționalități" -#: inc/Engine/Admin/Settings/Page.php:1717 +#: inc/Engine/Admin/Settings/Page.php:1689 msgid "One-click Rocket Add-ons" msgstr "Suplimente Rocket cu un singur clic" -#: inc/Engine/Admin/Settings/Page.php:1718 +#: inc/Engine/Admin/Settings/Page.php:1690 msgid "" "One-Click Add-ons are features extending available options without " "configuration needed. Switch the option \"on\" to enable from this screen." @@ -2379,21 +2338,21 @@ msgstr "" "disponibile fără a fi necesară o configurare. Comută opțiunea pe „pornit” " "pentru a le activa din acest ecran." -#: inc/Engine/Admin/Settings/Page.php:1728 +#: inc/Engine/Admin/Settings/Page.php:1700 msgid "Rocket Add-ons" msgstr "Suplimente Rocket" -#: inc/Engine/Admin/Settings/Page.php:1729 +#: inc/Engine/Admin/Settings/Page.php:1701 msgid "Rocket Add-ons are complementary features extending available options." msgstr "" "Suplimentele Rocket sunt funcționalități complementare care extind opțiunile" " disponibile." -#: inc/Engine/Admin/Settings/Page.php:1740 +#: inc/Engine/Admin/Settings/Page.php:1712 msgid "User Cache" msgstr "Cache utilizatori" -#: inc/Engine/Admin/Settings/Page.php:1746 +#: inc/Engine/Admin/Settings/Page.php:1718 msgid "" "If you need to create a dedicated set of cache files for each logged-in " "WordPress user, you must activate this add-on." @@ -2402,7 +2361,7 @@ msgstr "" "utilizator WordPress autentificat, trebuie să activezi acest supliment." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1748 +#: inc/Engine/Admin/Settings/Page.php:1720 msgid "" "User cache is great when you have user-specific or restricted content on " "your website.
%1$sLearn more%2$s" @@ -2411,16 +2370,16 @@ msgstr "" "pentru utilizatori sau un conținut restricționat pe site.
%1$sÎnvață mai " "mult%2$s" -#: inc/Engine/Admin/Settings/Page.php:1761 -#: inc/Engine/Admin/Settings/Page.php:1930 +#: inc/Engine/Admin/Settings/Page.php:1733 +#: inc/Engine/Admin/Settings/Page.php:1902 msgid "Cloudflare" msgstr "Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1767 +#: inc/Engine/Admin/Settings/Page.php:1739 msgid "Integrate your Cloudflare account with this add-on." msgstr "Integrează-ți contul Cloudflare cu acest supliment." -#: inc/Engine/Admin/Settings/Page.php:1768 +#: inc/Engine/Admin/Settings/Page.php:1740 msgid "" "Provide your account email, global API key, and domain to use options such " "as clearing the Cloudflare cache and enabling optimal settings with WP " @@ -2431,7 +2390,7 @@ msgstr "" "setărilor optime cu WP Rocket." #. translators: %1$s = opening span tag, %2$s = closing span tag. -#: inc/Engine/Admin/Settings/Page.php:1771 +#: inc/Engine/Admin/Settings/Page.php:1743 msgid "" "%1$sPlanning on using Automatic Platform Optimization (APO)?%2$s Just " "activate the official Cloudflare plugin and configure it. WP Rocket will " @@ -2441,17 +2400,17 @@ msgstr "" "activează modulul oficial Cloudflare și configurează-l. WP Rocket va activa " "automat compatibilitatea." -#: inc/Engine/Admin/Settings/Page.php:1819 +#: inc/Engine/Admin/Settings/Page.php:1791 msgid "Varnish" msgstr "Varnish" -#: inc/Engine/Admin/Settings/Page.php:1825 +#: inc/Engine/Admin/Settings/Page.php:1797 msgid "If Varnish runs on your server, you must activate this add-on." msgstr "" "Dacă Varnish rulează pe serverul tău, trebuie să activezi acest supliment." #. translators: %1$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1827 +#: inc/Engine/Admin/Settings/Page.php:1799 msgid "" "Varnish cache will be purged each time WP Rocket clears its cache to ensure " "content is always up-to-date.
%1$sLearn more%2$s" @@ -2460,16 +2419,16 @@ msgstr "" "cache-ul, astfel conținutul este întotdeauna actualizat.
%1$sAflă mai " "mult%2$s" -#: inc/Engine/Admin/Settings/Page.php:1862 +#: inc/Engine/Admin/Settings/Page.php:1834 msgid "WebP Compatibility" msgstr "Compatibilitate cu WebP" -#: inc/Engine/Admin/Settings/Page.php:1868 +#: inc/Engine/Admin/Settings/Page.php:1840 msgid "Improve browser compatibility for WebP images." msgstr "Îmbunătățește compatibilitatea navigatoarelor cu imaginile WebP." #. translators: %1$s and %3$s = opening tag, %2$s = closing tag. -#: inc/Engine/Admin/Settings/Page.php:1872 +#: inc/Engine/Admin/Settings/Page.php:1844 msgid "" "Enable this option if you would like WP Rocket to serve WebP images to " "compatible browsers. Please note that WP Rocket cannot create WebP images " @@ -2481,11 +2440,11 @@ msgstr "" " pentru tine. Pentru a crea imagini WebP recomandăm %1$sImagify%2$s. %3$sMai" " multe informații%2$s" -#: inc/Engine/Admin/Settings/Page.php:1892 +#: inc/Engine/Admin/Settings/Page.php:1864 msgid "Clear the Sucuri cache when WP Rocket’s cache is cleared." msgstr "Șterge cache-ul Sucuri când cache-ul WP Rocket este șters." -#: inc/Engine/Admin/Settings/Page.php:1895 +#: inc/Engine/Admin/Settings/Page.php:1867 msgid "" "Provide your API key to clear the Sucuri cache when WP Rocket’s cache is " "cleared." @@ -2493,49 +2452,49 @@ msgstr "" "Furnizează cheia ta API pentru a șterge cache-ul Sucuri când cache-ul WP " "Rocket este șters." -#: inc/Engine/Admin/Settings/Page.php:1903 -#: inc/Engine/Admin/Settings/Page.php:2047 +#: inc/Engine/Admin/Settings/Page.php:1875 +#: inc/Engine/Admin/Settings/Page.php:2019 msgid "Sucuri" msgstr "Sucuri" -#: inc/Engine/Admin/Settings/Page.php:1909 +#: inc/Engine/Admin/Settings/Page.php:1881 msgid "Synchronize Sucuri cache with this add-on." msgstr "Sincronizează cache-ul Sucuri cu acest supliment." -#: inc/Engine/Admin/Settings/Page.php:1947 +#: inc/Engine/Admin/Settings/Page.php:1919 msgid "Cloudflare credentials" msgstr "Date de conectare Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1956 +#: inc/Engine/Admin/Settings/Page.php:1928 msgid "Cloudflare settings" msgstr "Setări Cloudflare" -#: inc/Engine/Admin/Settings/Page.php:1970 +#: inc/Engine/Admin/Settings/Page.php:1942 msgctxt "Cloudflare" msgid "Global API key:" msgstr "Cheie API globală:" -#: inc/Engine/Admin/Settings/Page.php:1971 +#: inc/Engine/Admin/Settings/Page.php:1943 msgctxt "Cloudflare" msgid "Find your API key" msgstr "Găsește-ți cheia API" -#: inc/Engine/Admin/Settings/Page.php:1983 +#: inc/Engine/Admin/Settings/Page.php:1955 msgctxt "Cloudflare" msgid "Account email" msgstr "Email cont" -#: inc/Engine/Admin/Settings/Page.php:1992 +#: inc/Engine/Admin/Settings/Page.php:1964 msgctxt "Cloudflare" msgid "Zone ID" msgstr "ID zonă" -#: inc/Engine/Admin/Settings/Page.php:2002 +#: inc/Engine/Admin/Settings/Page.php:1974 msgid "Development mode" msgstr "Mod dezvoltare" #. translators: %1$s = link opening tag, %2$s = link closing tag. -#: inc/Engine/Admin/Settings/Page.php:2004 +#: inc/Engine/Admin/Settings/Page.php:1976 msgid "" "Temporarily activate development mode on your website. This setting will " "automatically turn off after 3 hours. %1$sLearn more%2$s" @@ -2543,11 +2502,11 @@ msgstr "" "Activează temporar modul dezvoltare pe site-ul tău web. Această setare va fi" " oprită automat după 3 ore. %1$sAflă mai mult%2$s" -#: inc/Engine/Admin/Settings/Page.php:2012 +#: inc/Engine/Admin/Settings/Page.php:1984 msgid "Optimal settings" msgstr "Setări optime" -#: inc/Engine/Admin/Settings/Page.php:2013 +#: inc/Engine/Admin/Settings/Page.php:1985 msgid "" "Automatically enhances your Cloudflare configuration for speed, performance " "grade and compatibility." @@ -2555,11 +2514,11 @@ msgstr "" "Îți îmbunătățește automat configurarea Cloudflare pentru viteză, grad de " "performanță și compatibilitate." -#: inc/Engine/Admin/Settings/Page.php:2021 +#: inc/Engine/Admin/Settings/Page.php:1993 msgid "Relative protocol" msgstr "Protocol relativ" -#: inc/Engine/Admin/Settings/Page.php:2022 +#: inc/Engine/Admin/Settings/Page.php:1994 msgid "" "Should only be used with Cloudflare's flexible SSL feature. URLs of static " "files (CSS, JS, images) will be rewritten to use // instead of http:// or " @@ -2569,11 +2528,11 @@ msgstr "" "Cloudflare. URL-urile fișierelor statice (CSS, JS, imagini) vor fi rescrise " "pentru a folosi // în loc de http:// sau https://." -#: inc/Engine/Admin/Settings/Page.php:2060 +#: inc/Engine/Admin/Settings/Page.php:2032 msgid "Sucuri credentials" msgstr "Date de conectare Sucuri" -#: inc/Engine/Admin/Settings/Page.php:2073 +#: inc/Engine/Admin/Settings/Page.php:2045 msgctxt "Sucuri" msgid "" "Firewall API key (for plugin), must be in format {32 characters}/{32 " @@ -2582,11 +2541,23 @@ msgstr "" "Cheia API pentru firewall (a modulului) trebuie să aibă formatul {32 de " "caractere}/{32 de caractere}:" -#: inc/Engine/Admin/Settings/Page.php:2074 +#: inc/Engine/Admin/Settings/Page.php:2046 msgctxt "Sucuri" msgid "Find your API key" msgstr "Găsește-ți cheia API" +#. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: +#. opening a tag, %4$s: opening a tag. +#: inc/Engine/Admin/Settings/Page.php:2251 +msgid "" +"%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " +"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " +"more about it." +msgstr "" +"%1$sWP Rocket:%2$s modulul a fost actualizat la versiunea 3.17. " +"Funcționalitate nouă: %3$sConținut cu randare lentă%4$s. Consultă " +"documentația noastră pentru a învăța mai multe despre ea." + #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" "Sucuri Add-on: The API key for the Sucuri firewall must be in format " @@ -2604,25 +2575,25 @@ msgstr "" "niciodată în cache URL-urile deoarece dezactivează cache-ul și optimizările " "pentru fiecare pagină de pe site-ul tău." -#: inc/Engine/Admin/Settings/Subscriber.php:171 +#: inc/Engine/Admin/Settings/Subscriber.php:174 msgid "Import, Export, Rollback" msgstr "Import, export, restaurare" -#: inc/Engine/Admin/Settings/Subscriber.php:196 +#: inc/Engine/Admin/Settings/Subscriber.php:199 #: views/settings/page-sections/imagify.php:14 msgid "Image Optimization" msgstr "Optimizare imagini" -#: inc/Engine/Admin/Settings/Subscriber.php:197 +#: inc/Engine/Admin/Settings/Subscriber.php:200 msgid "Compress your images" msgstr "Comprimă-ți imaginile" -#: inc/Engine/Admin/Settings/Subscriber.php:214 +#: inc/Engine/Admin/Settings/Subscriber.php:217 #: views/settings/page-sections/tutorials.php:48 msgid "Tutorials" msgstr "Tutoriale" -#: inc/Engine/Admin/Settings/Subscriber.php:215 +#: inc/Engine/Admin/Settings/Subscriber.php:218 msgid "Getting started and how to videos" msgstr "Noțiuni de bază și cum să vezi videourile" @@ -2630,15 +2601,15 @@ msgstr "Noțiuni de bază și cum să vezi videourile" msgid "WP Rocket Expired Cache Interval" msgstr "Interval de cache expirat WP Rocket" -#: inc/Engine/Cache/WPCache.php:337 +#: inc/Engine/Cache/WPCache.php:338 msgid "WP_CACHE value" msgstr "Valoare WP_CACHE" -#: inc/Engine/Cache/WPCache.php:354 +#: inc/Engine/Cache/WPCache.php:355 msgid "Cache" msgstr "Cache" -#: inc/Engine/Cache/WPCache.php:358 +#: inc/Engine/Cache/WPCache.php:359 msgid "" "The WP_CACHE constant needs to be set to true for WP Rocket cache to work " "properly" @@ -2646,38 +2617,38 @@ msgstr "" "Pentru ca WP Rocket să funcționeze așa cum trebuie, constanta WP_CACHE " "trebuie să fie setată la „true”." -#: inc/Engine/Cache/WPCache.php:367 +#: inc/Engine/Cache/WPCache.php:368 msgid "WP_CACHE is set to true" msgstr "WP_CACHE este setată la „true”" -#: inc/Engine/Cache/WPCache.php:375 +#: inc/Engine/Cache/WPCache.php:376 msgid "WP_CACHE is not set" msgstr "WP_CACHE nu este setată" -#: inc/Engine/Cache/WPCache.php:383 +#: inc/Engine/Cache/WPCache.php:384 msgid "WP_CACHE is set to false" msgstr "WP_CACHE este setată la „false”" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:90 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:96 msgid "Next Billing Date" msgstr "Următoarea dată de facturare" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:99 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:103 msgid "No Subscription" msgstr "Niciun abonament" -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:135 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:138 msgid "Your RocketCDN subscription is currently active." msgstr "Abonamentul tău RocketCDN este în prezent activ." #. translators: %1$s = opening tag, %2$s = CDN URL, %3$s = closing #. tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:141 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:144 msgid "To use RocketCDN, replace your CNAME with %1$s%2$s%3$s." msgstr "Pentru a folosi RocketCDN, înlocuiește CNAME cu %1$s%2$s%3$s." #. translators: %1$is = opening link tag, %2$s = closing link tag. -#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:152 +#: inc/Engine/CDN/RocketCDN/AdminPageSubscriber.php:155 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:230 #: inc/Engine/CDN/RocketCDN/NoticesSubscriber.php:334 msgid "%1$sMore Info%2$s" @@ -2747,16 +2718,16 @@ msgstr "RocketCDN dezactivat" #. Translators: %s = date formatted using date_i18n() and get_option( #. 'date_format' ). -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:27 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:29 msgid "Valid until %s only!" msgstr "Valid numai până la %s!" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:36 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:38 msgid "Speed up your website thanks to:" msgstr "Accelerează-ți site-ul web cu ajutorul:" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:42 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:44 msgid "" "High performance Content Delivery Network (CDN) with %1$sunlimited " "bandwidth%2$s" @@ -2765,7 +2736,7 @@ msgstr "" "%1$slățime de bandă nelimitată%2$s" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:48 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:50 msgid "" "Easy configuration: the %1$sbest CDN settings%2$s are automatically applied" msgstr "" @@ -2773,7 +2744,7 @@ msgstr "" "automat" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:54 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:56 msgid "" "WP Rocket integration: the CDN option is %1$sautomatically configured%2$s in" " our plugin" @@ -2781,12 +2752,12 @@ msgstr "" "Integrare WP Rocket: opțiunea CDN este %1$sconfigurată automat%2$s în " "modulul nostru" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:58 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:60 msgid "Learn more about RocketCDN" msgstr "Află mai multe despre RocketCDN" #. translators: %1$s = discounted price, %2$s = regular price. -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:65 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:67 msgid "" "*$%1$s/month for 12 months then $%2$s/month. You can cancel your " "subscription at any time." @@ -2794,37 +2765,37 @@ msgstr "" "*%1$s $/lună în primele 12 luni, apoi %2$s $/lună. Poți anula oricând " "abonamentul." -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:86 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:88 msgid "Billed monthly" msgstr "Facturare lunară" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:87 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:89 msgid "Get Started" msgstr "Începe" -#: inc/Engine/CDN/RocketCDN/views/cta-big.php:92 +#: inc/Engine/CDN/RocketCDN/views/cta-big.php:94 msgid "Reduce this banner" msgstr "Micșorează acest banner" -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:17 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:19 msgid "" "Speed up your website with RocketCDN, WP Rocket’s Content Delivery Network." msgstr "" "Accelerează-ți site-ul web cu RocketCDN, rețeaua de livrare conținut oferită" " de WP Rocket." -#: inc/Engine/CDN/RocketCDN/views/cta-small.php:20 +#: inc/Engine/CDN/RocketCDN/views/cta-small.php:22 #: inc/Engine/CDN/RocketCDN/views/promote-notice.php:13 msgid "Learn More" msgstr "Află mai mult" -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:23 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:24 msgid "RocketCDN is unavailable on local domains and staging sites." msgstr "" "RocketCDN nu este disponibil pentru domenii locale și site-uri în pregătire " "sau în testare." -#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:32 +#: inc/Engine/CDN/RocketCDN/views/dashboard-status.php:33 msgid "Get RocketCDN" msgstr "Ia RocketCDN" @@ -2839,23 +2810,77 @@ msgstr "" "Accelerează-ți site-ul web cu RocketCDN, rețeaua de livrare conținut oferită" " de WP Rocket!" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:180 +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:68 +msgid "Too many requests." +msgstr "Prea multe cereri." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:85 +msgid "Not valid response." +msgstr "Răspunsul nu este valid." + +#: inc/Engine/Common/JobManager/APIHandler/AbstractSafeAPIClient.php:151 +msgid "Not valid request type." +msgstr "Tipul de răspuns nu este valid." + +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:185 msgid "WP Rocket process pending jobs" msgstr "WP Rocket procesează sarcini în așteptare" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:194 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:204 msgid "WP Rocket clear failed jobs" msgstr "WP Rocket șterge sarcinile eșuate" -#: inc/Engine/Common/JobManager/Cron/Subscriber.php:206 +#: inc/Engine/Common/JobManager/Cron/Subscriber.php:221 msgid "WP Rocket process on submit jobs" msgstr "WP Rocket procesează trimiterea sarcinilor" -#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:265 +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:44 +msgid "Clear Priority Elements" +msgstr "Șterge Elemente cu prioritate" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:79 +msgid "Clear Priority Elements of this URL" +msgstr "Șterge Elemente cu prioritate pentru acest URL" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:100 +msgid "Priority Elements" +msgstr "Elemente cu prioritate" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:101 +#: inc/Engine/Saas/Admin/AdminBar.php:134 +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear" +msgstr "Șterge" + +#: inc/Engine/Common/PerformanceHints/Admin/AdminBar.php:103 +msgid "" +"This action will clear the Critical Images and Lazily Rendered Content." +msgstr "" +"Această acțiune va șterge imaginile critice și conținutul randat lent." + +#. translators: %1$s = plugin name. +#: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 +msgid "%1$s: Critical images and Lazy Render data was cleared!" +msgstr "%1$s: au fost șterse imaginile critice și randarea lentă!" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 +msgid "Script error" +msgstr "Eroare la script" + +#: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:22 +msgid "Script timeout" +msgstr "Expirare script" + +#. Translators: %s is the exception message. +#: inc/Engine/Common/Queue/Cleaner.php:87 +msgid "It was not possible to determine a valid cut-off time: %s." +msgstr "Nu a fost posibil să determin o durată limită validă: %s." + +#: inc/Engine/Common/Queue/RUCSSQueueRunner.php:269 msgid "Every minute" msgstr "În fiecare minut" -#: inc/Engine/CriticalPath/Admin/Admin.php:264 +#: inc/Engine/CriticalPath/Admin/Admin.php:265 msgid "Regenerate Critical Path CSS" msgstr "Regenerează CSS-ul de cale critic" @@ -2884,7 +2909,6 @@ msgstr "%l pentru a folosi această funcționalitate." msgid "Publish the %s" msgstr "Publică %s" -#. translators: %s = post type. #: inc/Engine/CriticalPath/Admin/Post.php:223 msgid "Enable Load CSS asynchronously in WP Rocket settings" msgstr "Activează Încarcă fișierele CSS asincron în setările WP Rocket" @@ -2899,7 +2923,7 @@ msgid "Critical CSS for %1$s not generated. Error: %2$s" msgstr "CSS-ul critic pentru %1$s nu a fost generat. Eroare: %2$s" #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:170 +#: inc/Engine/CriticalPath/APIClient.php:174 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "empty response." @@ -2908,7 +2932,7 @@ msgstr "" "Eroare: API-ul a returnat un răspuns gol." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:173 +#: inc/Engine/CriticalPath/APIClient.php:177 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an empty " "response." @@ -2917,20 +2941,20 @@ msgstr "" "răspuns gol." #. translators: %s = item URL. -#: inc/Engine/CriticalPath/APIClient.php:185 +#: inc/Engine/CriticalPath/APIClient.php:189 msgid "Critical CSS for %1$s on mobile not generated." msgstr "" "CSS-ul critic pentru %1$s nu a fost generat pentru dispozitive mobile." #. translators: %s = item URL. #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/APIClient.php:187 -#: inc/Engine/CriticalPath/ProcessorService.php:194 +#: inc/Engine/CriticalPath/APIClient.php:191 +#: inc/Engine/CriticalPath/ProcessorService.php:196 msgid "Critical CSS for %1$s not generated." msgstr "CSS-ul critic pentru %1$s nu a fost generat." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:195 +#: inc/Engine/CriticalPath/APIClient.php:199 msgid "" "Critical CSS for %1$s on mobile not generated. Error: The API returned an " "invalid response code." @@ -2939,7 +2963,7 @@ msgstr "" "Eroare: API-ul a returnat un cod de răspuns invalid." #. translators: %s = URL. -#: inc/Engine/CriticalPath/APIClient.php:197 +#: inc/Engine/CriticalPath/APIClient.php:201 msgid "" "Critical CSS for %1$s not generated. Error: The API returned an invalid " "response code." @@ -2948,8 +2972,8 @@ msgstr "" "cod de răspuns invalid." #. translators: %1$s = error message. -#: inc/Engine/CriticalPath/APIClient.php:205 -#: inc/Engine/CriticalPath/ProcessorService.php:201 +#: inc/Engine/CriticalPath/APIClient.php:209 +#: inc/Engine/CriticalPath/ProcessorService.php:203 msgid "Error: %1$s" msgstr "Eroare: %1$s" @@ -3037,38 +3061,38 @@ msgid "Critical CSS file cannot be deleted" msgstr "Fișierul CSS critic nu poate fi șters" #. translators: %1$s = item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:187 +#: inc/Engine/CriticalPath/ProcessorService.php:189 msgid "Mobile Critical CSS for %1$s not generated." msgstr "CSS-ul critic mobil pentru %1$s nu a fost generat." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:228 +#: inc/Engine/CriticalPath/ProcessorService.php:230 msgid "Critical CSS for %s in progress." msgstr "CSS-ul critic pentru %s este în desfășurare." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:262 +#: inc/Engine/CriticalPath/ProcessorService.php:264 msgid "Mobile Critical CSS for %s generated." msgstr "CSS-ul critic mobil pentru %s a fost generat." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:273 +#: inc/Engine/CriticalPath/ProcessorService.php:275 msgid "Critical CSS for %s generated." msgstr "CSS-ul critic pentru %s a fost generat." -#: inc/Engine/CriticalPath/ProcessorService.php:295 +#: inc/Engine/CriticalPath/ProcessorService.php:297 msgid "Critical CSS file deleted successfully." msgstr "Fișierul CSS critic a fost șters cu succes." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:317 +#: inc/Engine/CriticalPath/ProcessorService.php:319 msgid "Mobile Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "CSS-ul critic mobil pentru %1$s a expirat. Te rog încearcă un pic mai " "târziu." #. translators: %1$s = Item URL or item type. -#: inc/Engine/CriticalPath/ProcessorService.php:330 +#: inc/Engine/CriticalPath/ProcessorService.php:332 msgid "Critical CSS for %1$s timeout. Please retry a little later." msgstr "" "CSS-ul critic pentru %1$s a expirat. Te rog încearcă un pic mai târziu." @@ -3204,39 +3228,39 @@ msgid "Unlimited" msgstr "Nelimitate" #. translators: %s = promotion discount percentage. -#: inc/Engine/License/views/promo-banner.php:16 +#: inc/Engine/License/views/promo-banner.php:18 msgid "%s off" msgstr "Reducere de %s" #. translators: %s = promotion name. -#: inc/Engine/License/views/promo-banner.php:21 +#: inc/Engine/License/views/promo-banner.php:23 msgid "%s promotion is live!" msgstr "Promoția %s este în desfășurare!" -#: inc/Engine/License/views/promo-banner.php:27 +#: inc/Engine/License/views/promo-banner.php:29 msgid "Hurry Up! Deal ends in:" msgstr "Grăbește-te! Oferta se încheie în:" -#: inc/Engine/License/views/promo-banner.php:31 -#: inc/Engine/License/views/renewal-soon-banner.php:14 +#: inc/Engine/License/views/promo-banner.php:33 +#: inc/Engine/License/views/renewal-soon-banner.php:16 msgid "Minutes" msgstr "Minute" -#: inc/Engine/License/views/promo-banner.php:32 -#: inc/Engine/License/views/renewal-soon-banner.php:15 +#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/renewal-soon-banner.php:17 msgid "Seconds" msgstr "Secunde" -#: inc/Engine/License/views/promo-banner.php:34 +#: inc/Engine/License/views/promo-banner.php:36 #: inc/Engine/License/views/upgrade-section.php:11 msgid "Upgrade now" msgstr "Actualizează acum" -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:13 msgid "The Optimize CSS Delivery feature is disabled." msgstr "Funcționalitatea Optimizează livrarea CSS este dezactivată." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:15 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:17 msgid "" "You can no longer use the Remove Unused CSS or Load CSS asynchronously " "options." @@ -3245,7 +3269,7 @@ msgstr "" "fișierele CSS asincron." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:20 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:22 msgid "" "You need an %1$sactive license%2$s to keep optimizing your CSS delivery, " "which addresses a PageSpeed Insights recommendation and improves your page " @@ -3255,26 +3279,26 @@ msgstr "" "livrarea CSS-ului, o funcționalitate recomandată de PageSpeed Insights care " "îmbunătățește performanțele paginilor." -#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:29 -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:39 -#: inc/Engine/License/views/renewal-expired-banner.php:27 -#: inc/Engine/License/views/renewal-soon-banner.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd-disabled.php:31 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:41 +#: inc/Engine/License/views/renewal-expired-banner.php:29 +#: inc/Engine/License/views/renewal-soon-banner.php:33 msgid "Renew now" msgstr "Reînnoiește acum" -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:11 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:13 msgid "You will soon lose access to some features." msgstr "În curând, nu vei mai avea acces la unele funcționalități." #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:18 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:20 msgid "" "You need an %1$sactive license to continue optimizing your CSS delivery%2$s." msgstr "" "Ai nevoie de o %1$slicență activă pentru a optimiza în continuare livrarea " "CSS-ului%2$s." -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:24 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:26 msgid "" "The Remove Unused CSS and Load CSS asynchronously features are great options" " to address the PageSpeed Insights recommendations and improve your website " @@ -3285,16 +3309,16 @@ msgstr "" "Insights și pentru a îmbunătăți performanța pe site." #. translators: %1$s = , %2$s = , %3$s = date. -#: inc/Engine/License/views/renewal-expired-banner-ocd.php:29 +#: inc/Engine/License/views/renewal-expired-banner-ocd.php:31 msgid "These features will be %1$sautomatically disabled on %3$s%2$s." msgstr "Aceste funcționalități vor fi %1$sdezactivate automat pe %3$s%2$s." -#: inc/Engine/License/views/renewal-expired-banner.php:11 +#: inc/Engine/License/views/renewal-expired-banner.php:13 msgid "Your WP Rocket license is expired!" msgstr "Licența ta WP Rocket a expirat!" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-expired-banner.php:18 +#: inc/Engine/License/views/renewal-expired-banner.php:20 msgid "" "Your website could be much faster if it could take advantage of our %1$snew " "features and enhancements%2$s. 🚀" @@ -3303,7 +3327,7 @@ msgstr "" " funcționalități și îmbunătățiri%2$s. 🚀" #. translators: %1$s = , %2$s = . -#: inc/Engine/License/views/renewal-soon-banner.php:22 +#: inc/Engine/License/views/renewal-soon-banner.php:24 msgid "" "Your %1$sWP Rocket license is about to expire%2$s: you will soon lose access" " to product updates and support." @@ -3311,12 +3335,12 @@ msgstr "" "%1$sLicența ta WP este aproape de expirare%2$s: în curând nu vei mai avea " "acces la actualizări și suport." -#: inc/Engine/License/views/upgrade-popin.php:12 +#: inc/Engine/License/views/upgrade-popin.php:14 msgid "Speed Up More Websites" msgstr "Accelerezi mai multe site-uri web" #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:19 +#: inc/Engine/License/views/upgrade-popin.php:21 msgid "" "You can use WP Rocket on more websites by upgrading your license. To " "upgrade, simply pay the %1$sprice difference%2$s between your current and " @@ -3327,24 +3351,24 @@ msgstr "" "deținută acum și licențele noi, așa cum arătăm mai jos." #. translators: %1$s = opening strong tag, %2$s = closing strong tag. -#: inc/Engine/License/views/upgrade-popin.php:25 +#: inc/Engine/License/views/upgrade-popin.php:27 msgid "" "%1$sN.B.%2$s: Upgrading your license does not change your expiration date" msgstr "" "%1$sAtenție%2$s: actualizarea licenței nu îți va modifica data de expirare" #. translators: %s = price. -#: inc/Engine/License/views/upgrade-popin.php:35 +#: inc/Engine/License/views/upgrade-popin.php:37 msgid "Save $%s" msgstr "Economisești %s $" #. translators: %s = number of websites. -#: inc/Engine/License/views/upgrade-popin.php:48 +#: inc/Engine/License/views/upgrade-popin.php:50 msgid "%s websites" msgstr "%s site-uri web" #. translators: %s = license name. -#: inc/Engine/License/views/upgrade-popin.php:54 +#: inc/Engine/License/views/upgrade-popin.php:56 msgid "Upgrade to %s" msgstr "Actualizează la %s" @@ -3356,11 +3380,6 @@ msgstr "" "Prin actualizarea licenței, poți folosi WP Rocket pe mai multe site-uri web " "(vei plăti doar diferența de preț între cea deținută acum și licențele noi)." -#. translators: %1$s = plugin name. -#: inc/Engine/Media/AboveTheFold/Admin/Controller.php:143 -msgid "%1$s: Critical images cleared!" -msgstr "%1$s: am șters imaginile critice!" - #: inc/Engine/Media/Lazyload/AdminSubscriber.php:62 msgid "LazyLoad for images" msgstr "Încărcare lentă pentru imagini" @@ -3373,15 +3392,15 @@ msgstr "Încărcare lentă pentru iframe-uri/videouri" msgid "LazyLoad CSS backgrounds" msgstr "Fundaluri pentru încărcare lentă CSS" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:195 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:194 msgid "Analytics & Ads" msgstr "Analitice și reclame" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:200 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:199 msgid "Plugins" msgstr "Module" -#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:205 +#: inc/Engine/Optimization/DelayJS/Admin/SiteList.php:204 msgid "Themes" msgstr "Teme" @@ -3429,17 +3448,21 @@ msgstr "Minifică/combină JavaScript" msgid "Minify CSS" msgstr "Minifică CSS-ul" +#: inc/Engine/Optimization/RUCSS/Admin/OptionSubscriber.php:74 +msgid "Remove Unused CSS" +msgstr "Înlătură CSS-ul neutilizat" + #. translators: %1$s = plugin name, %2$s = table name, %3$s = open tag, #. %4$s = closing tag. #: inc/Engine/Optimization/RUCSS/Admin/Settings.php:253 msgid "" "%1$s: Could not create the %2$s table in the database which is necessary for" -" the Remove Unused CSS feature to work. Please reach out to %3$sour " -"support%4$s." +" the Remove Unused CSS feature to work. Please check our " +"%3$sdocumentation%4$s." msgstr "" -"%1$s: nu am putut să creez tabelul %2$s în baza de date, el este necesar " -"pentru ca funcționalitatea Înlătură CSS-ul neutilizat să funcționeze. Te rog" -" să contactezi %3$ssuportul nostru%4$s." +"%1$s: Nu am putut să creez tabelul %2$s în baza de date, el este necesar " +"pentru ca funcționalitatea Înlătură CSS -ul nefolosit să funcționeze. Te rog" +" să consulți %3$sdocumentația%4$s." #. translators: %1$s = plugin name. #: inc/Engine/Optimization/RUCSS/Admin/Subscriber.php:274 @@ -3447,7 +3470,7 @@ msgid "%1$s: Used CSS cache cleared!" msgstr "%1$s: cache-ul pentru CSS-ul utilizat a fost șters!" #. translators: %1$s = plugin name. -#: inc/Engine/Preload/Admin/Settings.php:57 +#: inc/Engine/Preload/Admin/Settings.php:76 msgid "" "%1$s: The preload service is now active. After the initial preload it will " "continue to cache all your pages whenever they are purged. No further action" @@ -3465,29 +3488,20 @@ msgstr "Sarcini în așteptare pentru preîncărcare WP Rocket" msgid "WP Rocket Preload revert stuck failed jobs" msgstr "Preîncărcare WP Rocket revine la sarcinile blocate și eșuate" -#: inc/Engine/Saas/Admin/AdminBar.php:73 -#: inc/Engine/Saas/Admin/AdminBar.php:194 -msgid "Clear Critical Images" -msgstr "Șterge imaginile critice" - -#: inc/Engine/Saas/Admin/AdminBar.php:160 -msgid "Clear Critical Images of this URL" -msgstr "Șterge imaginile critice pentru acest URL" - -#: inc/Engine/Saas/Admin/AdminBar.php:163 +#: inc/Engine/Saas/Admin/AdminBar.php:106 msgid "Clear Used CSS of this URL" msgstr "Șterge CSS-ul folosit pentru acest URL" -#: inc/Engine/Saas/Admin/AdminBar.php:193 -msgid "Critical Images Cache" -msgstr "Cache imagini critice" +#: inc/Engine/Saas/Admin/AdminBar.php:133 +msgid "Used CSS" +msgstr "CSS utilizat" -#: inc/Engine/Saas/Admin/AdminBar.php:197 -msgid "Remove Used CSS Cache" -msgstr "Cache Înlătură CSS-ul neutilizat" +#: inc/Engine/Saas/Admin/AdminBar.php:136 +msgid "This action will clear the used CSS files." +msgstr "Această acțiune va șterge fișierele CSS utilizat." #. translators: %1$s = plugin name, %2$s = number of seconds. -#: inc/Engine/Saas/Admin/Notices.php:104 +#: inc/Engine/Saas/Admin/Notices.php:91 msgid "" "%1$s: Please wait %2$s seconds. The Remove Unused CSS service is processing " "your pages, the plugin is optimizing LCP and the images above the fold." @@ -3498,7 +3512,7 @@ msgstr "" #. translators: %1$s = plugin name, %2$s = number of URLs, %3$s = number of #. seconds. -#: inc/Engine/Saas/Admin/Notices.php:147 +#: inc/Engine/Saas/Admin/Notices.php:134 msgid "" "%1$s: The LCP element has been optimized, and the images above the fold were excluded from lazyload. The Used CSS of your homepage has been processed.\n" "\t\t\t WP Rocket will continue to generate Used CSS for up to %2$s URLs per %3$s second(s)." @@ -3507,19 +3521,19 @@ msgstr "" "\t\t\t WP Rocket va continua să genereze CSS-ul folosit pentru până la %2$s URL-uri per %3$s secundă (secunde)." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:160 +#: inc/Engine/Saas/Admin/Notices.php:157 msgid "We suggest enabling %1$sPreload%2$s for the fastest results." msgstr "" "Pentru rezultate mult mai rapide, sugerăm să activezi %1$spreîncărcarea%2$s." #. translators: %1$s = opening link tag, %2$s = closing link tag. -#: inc/Engine/Saas/Admin/Notices.php:170 +#: inc/Engine/Saas/Admin/Notices.php:167 msgid "To learn more about the process check our %1$sdocumentation%2$s." msgstr "" "Pentru a afla mai multe despre acest proces, %1$sconsultă documentația " "noastră%2$s." -#: inc/Engine/Saas/Admin/Notices.php:236 +#: inc/Engine/Saas/Admin/Notices.php:229 msgid "" "We couldn't generate the used CSS because you're using a nulled version of " "WP Rocket. You need an active license to use the Remove Unused CSS feature " @@ -3531,14 +3545,14 @@ msgstr "" "licență activă." #. translators: %1$s = promo percentage. -#: inc/Engine/Saas/Admin/Notices.php:239 +#: inc/Engine/Saas/Admin/Notices.php:232 msgid "Click here to get a WP Rocket single license at %1$s off!" msgstr "" "Dă clic aici pentru a obține o singură licență WP Rocket cu o reducere de " "%1$s!" #. translators: %1$s = open tag, %2$s = closing tag. -#: inc/Engine/Saas/Admin/Notices.php:292 +#: inc/Engine/Saas/Admin/Notices.php:285 msgid "" "It seems a security plugin or the server's firewall prevents WP Rocket from " "accessing the SaaS features. IPs listed %1$shere in our documentation%2$s " @@ -3549,11 +3563,11 @@ msgstr "" "%1$saici în documentația noastră%2$s trebuie să fie adăugate la listele tale" " cu permisiuni:" -#: inc/Engine/Saas/Admin/Notices.php:297 +#: inc/Engine/Saas/Admin/Notices.php:290 msgid "- In the security plugin, if you are using one" msgstr "- În modulul pentru securitate, dacă folosești unul" -#: inc/Engine/Saas/Admin/Notices.php:298 +#: inc/Engine/Saas/Admin/Notices.php:291 msgid "- In the server's firewall. Your host can help you with this" msgstr "" "- În firewall-ul serverului. Serviciul tău de găzduire te poate ajuta cu " @@ -3941,7 +3955,7 @@ msgstr[2] "" "funcționalitățile WP Rocket:" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:151 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:156 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sdisable emoji%3$s conflicts with WP Rockets %2$sdisable emoji%3$s" @@ -3950,7 +3964,7 @@ msgstr "" " emoticoanele%3$s WP Rockets" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:187 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:192 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sGZIP compression%3$s conflicts with WP Rocket %2$sGZIP " @@ -3960,7 +3974,7 @@ msgstr "" "Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:223 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:228 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sbrowser caching%3$s conflicts with WP Rocket %2$sbrowser " @@ -3970,7 +3984,7 @@ msgstr "" "navigatorului%3$s WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:255 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:260 msgctxt "Hummingbird notice" msgid "" "%1$s %2$spage caching%3$s conflicts with WP Rocket %2$spage caching%3$s" @@ -3979,7 +3993,7 @@ msgstr "" "paginilor%3$s WP Rocket" #. Translators: %1$s = Plugin name, %2$s = , %3$s = . -#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:289 +#: inc/ThirdParty/Plugins/Optimization/Hummingbird.php:294 msgctxt "Hummingbird notice" msgid "" "%1$s %2$sasset optimization%3$s conflicts with WP Rocket %2$sfile " @@ -4264,7 +4278,6 @@ msgid "Purges RocketCDN cached resources for your website. %s" msgstr "" "Șterge resursele memorate în cache-ul RocketCDN pentru site-ul tău web. %s" -#. translators: %s is a "Learn more" link. #: views/settings/fields/rocket-cdn.php:63 #: views/settings/page-sections/cloudflare.php:36 #: views/settings/page-sections/sucuri.php:37 @@ -4301,7 +4314,6 @@ msgstr "Cache Cloudflare" msgid "Purges cached resources for your website. %s" msgstr "Șterge resursele memorate în cache pentru site-ul tău web. %s" -#. translators: %s is a "Learn more" link. #: views/settings/page-sections/cloudflare.php:36 msgid "https://support.cloudflare.com/hc/en-us/articles/200169246" msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" @@ -4310,19 +4322,19 @@ msgstr "https://support.cloudflare.com/hc/en-us/articles/200169246" msgid "Clear all Cloudflare cache files" msgstr "Șterge toate fișierele cache Cloudflare" -#: views/settings/page-sections/dashboard.php:38 +#: views/settings/page-sections/dashboard.php:39 msgid "Congratulations!" msgstr "Felicitări!" -#: views/settings/page-sections/dashboard.php:40 +#: views/settings/page-sections/dashboard.php:41 msgid "WP Rocket is now activated and already working for you." msgstr "Acum WP Rocket este activat și deja lucrează pentru tine." -#: views/settings/page-sections/dashboard.php:42 +#: views/settings/page-sections/dashboard.php:43 msgid "Your website should be loading faster now!" msgstr "Site-ul tău web ar trebui să se încarce mai rapid acum!" -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "To guarantee fast websites, WP Rocket automatically applies 80% of web " "performance best practices." @@ -4330,66 +4342,91 @@ msgstr "" "Pentru a garanta site-uri web rapide, WP Rocket aplică automat 80% din cele " "mai bune practici de performanță pe web." -#: views/settings/page-sections/dashboard.php:44 +#: views/settings/page-sections/dashboard.php:45 msgid "" "We also enable options that provide immediate benefits to your website." msgstr "" "De asemenea, avem opțiuni care oferă avantaje imediate pentru site-ul tău " "web." -#: views/settings/page-sections/dashboard.php:45 +#: views/settings/page-sections/dashboard.php:46 msgid "Continue to the options to further optimize your site!" msgstr "Continuă cu opțiunile pentru a-ți optimiza în continuare site-ul!" -#: views/settings/page-sections/dashboard.php:62 +#: views/settings/page-sections/dashboard.php:63 msgid "My Account" msgstr "Contul meu" -#: views/settings/page-sections/dashboard.php:68 +#: views/settings/page-sections/dashboard.php:69 msgid "Refresh info" msgstr "Reîmprospătează informațiile" -#: views/settings/page-sections/dashboard.php:86 +#: views/settings/page-sections/dashboard.php:87 msgid "with" msgstr "cu" -#: views/settings/page-sections/dashboard.php:100 +#: views/settings/page-sections/dashboard.php:101 msgid "Expiration Date" msgstr "Data expirării" -#: views/settings/page-sections/dashboard.php:110 +#: views/settings/page-sections/dashboard.php:111 msgid "View my account" msgstr "Vezi contul meu" +#: views/settings/page-sections/dashboard.php:131 views/settings/page.php:75 +msgid "Rocket Analytics" +msgstr "Analitice Rocket" + +#. translators: %1$s = opening tag, %2$s = closing tag. #: views/settings/page-sections/dashboard.php:137 +msgid "" +"I agree to share anonymous data with the development team to help improve WP" +" Rocket. %1$sWhat info will we collect?%2$s" +msgstr "" +"Sunt de acord să partajez date anonime cu echipa de dezvoltare pentru a " +"ajuta la îmbunătățirea WP Rocket. %1$sCe informații vom colecta?%2$s" + +#: views/settings/page-sections/dashboard.php:155 msgid "Quick Actions" msgstr "Acțiuni rapide" -#: views/settings/page-sections/dashboard.php:144 -msgid "Remove all cached files" -msgstr "Înlătură toate fișierele cache" +#: views/settings/page-sections/dashboard.php:162 +msgid "Cache files" +msgstr "Fișiere cache" -#: views/settings/page-sections/dashboard.php:164 -#: views/settings/page-sections/dashboard.php:170 +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear and preload all the cache files." +msgstr "Această acțiune va șterge și va pre-încărca toate fișierele cache." + +#: views/settings/page-sections/dashboard.php:163 +msgid "This action will clear all the cache files." +msgstr "Această acțiune va șterge toate fișierele cache." + +#: views/settings/page-sections/dashboard.php:169 +msgid "Clear and preload" +msgstr "Șterge și pre-încarcă" + +#: views/settings/page-sections/dashboard.php:183 +#: views/settings/page-sections/dashboard.php:189 msgid "Regenerate Critical CSS" msgstr "Regenerează CSS critic" -#: views/settings/page-sections/dashboard.php:196 +#: views/settings/page-sections/dashboard.php:215 msgid "Frequently Asked Questions" msgstr "Întrebări frecvente" -#: views/settings/page-sections/dashboard.php:210 +#: views/settings/page-sections/dashboard.php:229 msgid "Still cannot find a solution?" msgstr "Încă nu poți găsi o soluție?" -#: views/settings/page-sections/dashboard.php:211 +#: views/settings/page-sections/dashboard.php:230 msgid "" "Submit a ticket and get help from our friendly and knowledgeable Rocketeers." msgstr "" "Trimite un tichet și primești ajutor de la membrii prietenoși și pricepuți " "WP Rocket." -#: views/settings/page-sections/dashboard.php:219 +#: views/settings/page-sections/dashboard.php:238 msgid "Ask support" msgstr "Contactează suportul" @@ -4408,41 +4445,58 @@ msgstr "" msgid "Save Changes and Optimize" msgstr "Salvează modificările și optimizează" -#. Translators: %1$s = , %2$s = , %3$s = , %4$s = . -#: views/settings/page-sections/imagify.php:21 +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:22 msgid "" -"%1$sWP ROCKET%2$s created %3$sIMAGIFY%4$s %1$sfor best-in-class image " -"optimization.%2$s" +"%1$sWP Rocket created IMAGIFY to give your website an extra speed boost!%2$s" msgstr "" -"%1$sWP ROCKET%2$s a creat %3$sIMAGIFY%4$s %1$spentru optimizarea de înaltă " -"clasă a imaginilor.%2$s" +"%1$sWP Rocket a creat IMAGIFY ca să-i ofere site-ului tău o îmbunătățire la " +"viteză!%2$s" + +#: views/settings/page-sections/imagify.php:28 +msgid "Images can account for 50% of your loading time!" +msgstr "Imaginile pot să însumeze 50% din timpul de încărcare!" -#: views/settings/page-sections/imagify.php:24 +#: views/settings/page-sections/imagify.php:31 msgid "" -"Compress image to make your website faster, all while maintaining image " -"quality." +"Imagify automatically optimizes all your images, helping your website gain " +"precious seconds while saving you time. With just one click, it resizes, " +"compresses, and converts your images to WebP and AVIF formats without " +"sacrificing quality." msgstr "" -"Comprimă imaginile pentru a-ți face site-ul mai rapid, menținând calitatea " -"imaginilor." +"Imagify îți optimizează automat toate imaginile, îți ajută site-ul să " +"câștige secunde prețioase și, totodată, te ajută să economisești timp. Cu un" +" singur clic, redimensionezi, comprimi și convertești imaginile în formatele" +" WebP și AVIF, fără să pierzi din calitate." -#: views/settings/page-sections/imagify.php:25 -msgid "More on Imagify:" -msgstr "Mai multe despre Imagify:" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:41 +msgid "%1$sCompress%2$s all your images in one click" +msgstr "%1$sComprimi%2$s toate imaginile cu un singur clic" -#: views/settings/page-sections/imagify.php:27 -msgid "Imagify Plugin Page" -msgstr "Pagină modul Imagify" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:49 +msgid "%1$sConvert%2$s images to WebP and Avif" +msgstr "%1$sConvertești%2$s imaginile în WebP și Avif" -#: views/settings/page-sections/imagify.php:28 -msgid "Imagify Website" -msgstr "Site web Imagify" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:57 +msgid "%1$sResize%2$s your images on the fly" +msgstr "%1$sRedimensionezi %2$s imaginile din mers" + +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:65 +msgid "%1$sFree plan%2$s includes 20MB/month (around 200 images)" +msgstr "" +"%1$sPlanul gratuit%2$s include 20 Mo/lună (aproximativ 200 de imagini)" -#: views/settings/page-sections/imagify.php:29 -msgid "Review of Image Compression Plugins" -msgstr "Examinează modulele care comprimă imagini" +#. Translators: %1$s = , %2$s = . +#: views/settings/page-sections/imagify.php:83 +msgid "%1$sInstall Imagify, the Easiest WordPress Image Optimizer%2$s" +msgstr "" +"%1$sInstalează Imagify, cel mai simplu optimizator de imagini WordPress%2$s" -#: views/settings/page-sections/imagify.php:38 +#: views/settings/page-sections/imagify.php:110 msgid "Install Imagify" msgstr "Instalează Imagify" From 21b4dd82cd7adfded9209b4f8732611407cb1639 Mon Sep 17 00:00:00 2001 From: WordPress Fan <146129302+wordpressfan@users.noreply.github.com> Date: Tue, 17 Sep 2024 14:55:20 +0300 Subject: [PATCH 172/192] Replace Lazy Render Content strings with Automatic Lazy Rendering (#6975) --- inc/Engine/Admin/Settings/Page.php | 2 +- .../inc/Engine/Admin/Settings/Page/displayUpdateNotice.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/Engine/Admin/Settings/Page.php b/inc/Engine/Admin/Settings/Page.php index a820af18a7..e9a3643f51 100644 --- a/inc/Engine/Admin/Settings/Page.php +++ b/inc/Engine/Admin/Settings/Page.php @@ -2248,7 +2248,7 @@ public function display_update_notice() { 'dismissible' => '', 'message' => sprintf( // translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: opening a tag. - __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New feature: %3$sLazy Render Content%4$s. Check out our documentation to learn more about it.', 'rocket' ), + __( '%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New feature: %3$sAutomatic Lazy Rendering%4$s. Check out our documentation to learn more about it.', 'rocket' ), '', '', '', diff --git a/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php b/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php index ba86daf275..798538737d 100644 --- a/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php +++ b/tests/Fixtures/inc/Engine/Admin/Settings/Page/displayUpdateNotice.php @@ -91,7 +91,7 @@ 'expected' => [ 'status' => 'info', 'dismissible' => '', - 'message' => 'WP Rocket: the plugin has been updated to the 3.17 version. New feature: Lazy Render Content. Check out our documentation to learn more about it.', + 'message' => 'WP Rocket: the plugin has been updated to the 3.17 version. New feature: Automatic Lazy Rendering. Check out our documentation to learn more about it.', 'dismiss_button' => 'rocket_update_notice', ], ], From 9ee75cd95c9b601272f87de50143dee5441a08b3 Mon Sep 17 00:00:00 2001 From: WordPress Fan <146129302+wordpressfan@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:15:57 +0300 Subject: [PATCH 173/192] Automate release process (#6538) Co-authored-by: wordpressfan --- .github/workflows/alpha_release.yml | 97 +++++++++++++++++++++++++++++ bin/makemo.sh | 4 +- 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/alpha_release.yml diff --git a/.github/workflows/alpha_release.yml b/.github/workflows/alpha_release.yml new file mode 100644 index 0000000000..bfbaeb70ac --- /dev/null +++ b/.github/workflows/alpha_release.yml @@ -0,0 +1,97 @@ +name: Alpha Release + +on: + pull_request: + types: [ labeled ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + if: ${{ github.event.label.name == 'release-alpha' }} + # The type of runner that the job will run on + runs-on: ubuntu-latest + + permissions: + contents: write + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Merge develop into transifex + uses: devmasx/merge-branch@master + with: + type: now + from_branch: develop + target_branch: transifex + github_token: ${{ secrets.GH_WORKFLOW_TOKEN }} + message: Merge develop into transifex + + - name: Checkout transifex branch + uses: actions/checkout@v3 + with: + token: ${{ secrets.GH_WORKFLOW_TOKEN }} + ref: 'transifex' + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + + - name: Install npm Dependencies + run: npm ci + + - name: Setup WP-CLI + uses: godaddy-wordpress/setup-wp-cli@1 + + - name: Update Pot file with new translatable strings + run: npm run makepot + + - name: Generate mo files + uses: text-adi/build-language-i18n-action@v1 + env: + DIR: languages + + - name: Commit all changes to transifex branch + run: | + git config --local user.email "bot@wp-media.com" + git config --local user.name "WP Media GitHub Actions Bot" + git add -A + git commit -m "Prepare transifex before alpha release" + + - name: Push all changes + uses: ad-m/github-push-action@v0.6.0 + with: + directory: "." + github_token: ${{ secrets.GH_WORKFLOW_TOKEN }} + branch: "transifex" + + - name: Merge transifex into develop + uses: devmasx/merge-branch@master + with: + type: now + from_branch: transifex + target_branch: develop + github_token: ${{ secrets.GH_WORKFLOW_TOKEN }} + message: Merge transifex into develop + + - name: Get Release Version + uses: actions-ecosystem/action-regex-match@v2 + id: release-version + with: + text: ${{ github.event.pull_request.body }} + regex: '^(Release Version:\s*)(.*)$' + flags: 'gm' + + - name: Echo extracted version number + run: | + echo "${{ steps.release-version.outputs.group2 }}" + + - name: Create the tag/release + if: ${{ steps.release-version.outputs.group2 != '' }} + run: gh release create v${{ steps.release-version.outputs.group2 }} --draft --prerelease --notes "${{ github.event.pull_request.body }}" --title "${{ steps.release-version.outputs.group2 }}" --target "develop" + env: + GH_TOKEN: ${{ secrets.GH_WORKFLOW_TOKEN }} diff --git a/bin/makemo.sh b/bin/makemo.sh index 455dc9216e..97a7f30704 100755 --- a/bin/makemo.sh +++ b/bin/makemo.sh @@ -1,4 +1,4 @@ -#! /bin/sh +#!/bin/bash # Create .mo files from .po files. # Twisted by WP-Translations.org, created by grappler. -for file in `find . -name "*.po"` ; do /usr/local/opt/gettext/bin/msgfmt -o ${file/.po/.mo} $file ; done \ No newline at end of file +for file in `find . -name "*.po"` ; do msgfmt -o ${file/.po/.mo} $file ; done From c16a19769697782c56e3518e783f591e6dc08811 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Tue, 17 Sep 2024 15:17:02 +0300 Subject: [PATCH 174/192] update version to 3.17.0.1-alpha1 --- wp-rocket.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp-rocket.php b/wp-rocket.php index 13da0051fe..0353fe4c50 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.17 + * Version: 3.17.0.1-alpha1 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.17' ); +define( 'WP_ROCKET_VERSION', '3.17.0.1-alpha1' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' ); From 0fbe4a01149f055f867ba0d6521c9c81f96884cd Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Tue, 17 Sep 2024 15:38:53 +0300 Subject: [PATCH 175/192] as we removed package-lock.json file from git we have to replace `npm ci` with `npm i` --- .github/workflows/alpha_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/alpha_release.yml b/.github/workflows/alpha_release.yml index bfbaeb70ac..9f7fed1810 100644 --- a/.github/workflows/alpha_release.yml +++ b/.github/workflows/alpha_release.yml @@ -42,7 +42,7 @@ jobs: cache: npm - name: Install npm Dependencies - run: npm ci + run: npm i - name: Setup WP-CLI uses: godaddy-wordpress/setup-wp-cli@1 From b898c2a8b6f52d9fd93702a59419d57f208b0b4b Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Tue, 17 Sep 2024 15:44:02 +0300 Subject: [PATCH 176/192] disable npm cache --- .github/workflows/alpha_release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/alpha_release.yml b/.github/workflows/alpha_release.yml index 9f7fed1810..4420596c93 100644 --- a/.github/workflows/alpha_release.yml +++ b/.github/workflows/alpha_release.yml @@ -39,7 +39,6 @@ jobs: uses: actions/setup-node@v4 with: node-version: '20' - cache: npm - name: Install npm Dependencies run: npm i From d27da7d21912b309988bc7af1e8645b5185d5d04 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Tue, 17 Sep 2024 17:44:29 +0300 Subject: [PATCH 177/192] try without xdebug --- .github/workflows/alpha_release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/alpha_release.yml b/.github/workflows/alpha_release.yml index 4420596c93..e652543b89 100644 --- a/.github/workflows/alpha_release.yml +++ b/.github/workflows/alpha_release.yml @@ -35,6 +35,12 @@ jobs: token: ${{ secrets.GH_WORKFLOW_TOKEN }} ref: 'transifex' + - name: Setup PHP with no coverage driver + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + coverage: none + - name: Set up Node.js uses: actions/setup-node@v4 with: From f8c772a558e6799f97aa9960b0d56e8ee09597f3 Mon Sep 17 00:00:00 2001 From: WP Media GitHub Actions Bot Date: Tue, 17 Sep 2024 14:45:57 +0000 Subject: [PATCH 178/192] Prepare transifex before alpha release --- languages/rocket-ar.mo | Bin 27580 -> 26273 bytes languages/rocket-bg_BG.mo | Bin 51323 -> 49640 bytes languages/rocket-cs_CZ.mo | Bin 73241 -> 70326 bytes languages/rocket-de_DE.mo | Bin 110898 -> 108766 bytes languages/rocket-el.mo | Bin 10554 -> 10207 bytes languages/rocket-es_ES.mo | Bin 76381 -> 73274 bytes languages/rocket-fa_IR.mo | Bin 132086 -> 130296 bytes languages/rocket-fi.mo | Bin 48457 -> 46270 bytes languages/rocket-fr_CA.mo | Bin 105516 -> 113125 bytes languages/rocket-fr_FR.mo | Bin 115476 -> 112707 bytes languages/rocket-gl_ES.mo | Bin 922 -> 951 bytes languages/rocket-he_IL.mo | Bin 8488 -> 7981 bytes languages/rocket-hr.mo | Bin 94745 -> 91110 bytes languages/rocket-hu_HU.mo | Bin 101835 -> 98128 bytes languages/rocket-it_IT.mo | Bin 76040 -> 72933 bytes languages/rocket-ja_JP.mo | Bin 92701 -> 89314 bytes languages/rocket-ms.mo | Bin 4416 -> 4269 bytes languages/rocket-nb_NO.mo | Bin 932 -> 961 bytes languages/rocket-nl_NL.mo | Bin 108414 -> 104335 bytes languages/rocket-pl_PL.mo | Bin 108100 -> 104273 bytes languages/rocket-pt_BR.mo | Bin 112335 -> 108874 bytes languages/rocket-pt_PT.mo | Bin 113832 -> 111095 bytes languages/rocket-ro_RO.mo | Bin 115648 -> 113591 bytes languages/rocket-ru.mo | Bin 1045 -> 1074 bytes languages/rocket-ru_RU.mo | Bin 100263 -> 96948 bytes languages/rocket-sr.mo | Bin 7689 -> 7278 bytes languages/rocket-sv_SE.mo | Bin 2788 -> 2657 bytes languages/rocket-tr_TR.mo | Bin 114420 -> 111675 bytes languages/rocket-uk.mo | Bin 79266 -> 76743 bytes languages/rocket-uk_UA.mo | Bin 79266 -> 76743 bytes languages/rocket-zh_CN.mo | Bin 96272 -> 92189 bytes languages/rocket-zh_TW.mo | Bin 32546 -> 30863 bytes languages/rocket.pot | 23 ++++++++++++----------- 33 files changed, 12 insertions(+), 11 deletions(-) diff --git a/languages/rocket-ar.mo b/languages/rocket-ar.mo index 2e213d1748f1f130b56b13261a7b7cb841a5cfbb..1a5d91ab4c423ff352c15d3a0ca81c26612e252a 100644 GIT binary patch delta 4106 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 Wjn1f_my+R~x4zTy-31vPM*knq#EV@3 diff --git a/languages/rocket-cs_CZ.mo b/languages/rocket-cs_CZ.mo index 7c47da1db93ab7f648627ab7050b2bae9c9bd39b..5a1780535ab02e9c997c649310becaadcd64d507 100644 GIT binary patch delta 8980 zcmXZg34D#$y2tUgk&r|rB1A$)Bta%IM2I0ZkBNDRDOFQc(IB~~ZD>!bhEmg^XsDs+ zRjOK)R%*EA)YyZb8xC5jv0B4DqKfi(yw`cvT!ZPjA1mTB z^vCiE##F;V48~YgW?#WtH~>R2*G)k;E=8qmGm=en82zvWz3~4~4ZK99v|^$$z8H+E zkHJcqh*hvTYKl6cre*}{JqJ+j97R3vzDhw4{D$htU$_hXlk5nK(1-Y%<2`(hxYUV< zHZsP8cpTCn49vj@;zDGwrU?0Gp7K9-nn__;Q*jikL&d1w^Bc~=fHpRx z%Ta4&2lmDTsI}wU)@>JCwYGNqgrY_qjiH!=N>xAXf*X-D#@xdSSUug&eTZW{)HX~) zy(bm5J-ecw?~Pj2Yf;Z{b5qbh+=>10ASz`6uhy3-l$bN4nuGz2IDH!D&Or`gyo6P;S#)n z>fq>(w!xXmA!-(*2C^S@{W>zc<_Rh@O*-+6_J0QoTBV<&PN>7E4xGdwEWtYX9O=A? z>})eI8nr#Apaw7-)zMWLhFeh?IgS3km9RI~!YowB@^Bh1z)4uHk9|JZaTaQd z=l3E1n!`<0XpVMaf82*;$@ulPA2vf!BPl}l{3`0jr5J){hm|*7}bD_Jg>(9REBn=7anxt z<5-RO9IC+*)UGPU>KNc2Xb*x|R7c`bbJPYCFa!1CSvVZ$qaM7C>gY>UrfLl$-8dF& z;$u_?eOY;$qA=9^V^GhhI=V9`sKHTK1E*pxE=2X*WZ8oz5StP7zQoI|ZnKd>Ln?M5({3)~YD{A9FgSA(H3fBs*%u|FQrQ_* zpM}jZ2i36+s0L1>8ouoK5H&TGNTZ$$z$V)NkrXtN{-{h$z%lq1>KrIRHRwIU9z>zY z$z{?}`~4Hth^u7VMOF)I6F0_S%tSSugMl~&H5KzQ$W7rx3iWXhYL#EXFnop)7{cjN z2V0_EG#oX8amZ5xC5hie`q~i$eh8t1O-AA_`X!@ER;Q&<6axe{N zq8877RL{Rdjr0;~WH(UvzrYamCml+8Lk!1s?2g%}ZMqZn{6$oTei=pn)qwJ;RqKUX z3sH_eQJI;JNw^8y;RVzSf|(~xSu6#!aY(E}=%&b+Y|bTZVOs@1xF*YTWb| z7T`+spfVNLB9EGjIMBt{_$g&;#BBD z2wUTJR7Y>4-cy^?Ck5N02j-&&I12-CKDxF4*HZAOqV|8;wGfZZiCbb*oPr#NW;=SJ z$8>wYANmkSU=NH#t@`QM2-jd&`~lT)&ywjVu>ZQ1;K{A#Ir#*aGJi*j;cC zwabncFw!Ur=cv#~9%D81de@%ip;()^De8gVSQCe%GLet!;99JOr%)rmjh^@z%U9qi zM-AZRLJlc15VFYr%FcE#=8)k+!27l%v#|#8$G89wAUn%+Tw+ta&+$B}BlqwV^jK=Y z9q+`~h#z4N4*bA=mK<^X8MQWC%j_C(ccQS3iudt0rY`5FG1ghZ;e#jeAg*1>4@n%f zicX>b-|cGu2gVWK#aOJl+Ws_4M?E(YFJasoV+ygthipOIj116i>aOJjhKgO-1#{Nf z9)E$oiGM_;G3`YGISFoP=CKkgh

_d;LoyU`T1 zkEdX5oQ(mv4t;T#bNw6CgC|i9Tt%h$1^VN-Lfg=E^dtTd)qx$@7?0vNSc)3JR~s0R zo5E!Z+9vmLJXY9fJ2VMBh-YFt&P8S7C`RHL9EcB44R!t4W?&>XATB^{yU(#a@xD#= z06U0U%*WBK3qMlO2ri*Aam(>BYB6d-#6u8jPCH;lEVspeYIwQHpw}dr$BA=M4ZVl; zaX+TvFQ}=DV5Qf^rl>_bcpLd2PN9H`Nq7^-;=t{8yA@$LaWQIS&oByW?64h5#a_f2 z$ObYSP*c+MQ@()WV$^_!{VkUDH0+0;;b8RG<@_BGV~G!70=j>p@Ct>1-S*R}AI1|G;zB%) z8bQ|Q_AAvCWLcO()D(2sV^cc>Nv4^Mp7;R0u@t?q{1-N3z8FDV2fOK!_7sLvvBbG> zAGIj`_S(f*4gHA2Q7KErs+fiqu_tC>e^i5?qYoZ(Jb@X+7qB7L;}i?TURb?s|5NBo z#Z2_aa~Od?BRw?bzp`HzGf-<_0qO-?FxX|x*La@z!akewPdLrgffuOzy${&Wl6n|H z+zK_d!!SfCn?*q*T8&k32ae~(2T%u1G<&W(cECi;a$JCV(bw1ui?JTYAF_+M59+-K zQB!alYv50)Mff|q8&mM%SQ?6Luo|vIjbJy1;UOo!j6uY=us)h^?E%#Q+Y%;WDo#eF zdIzfEOQrb6h;!SbmD#3o%l8m$7V(L(`_XVBYuYCaPW6* zI~OM-YSD%swZA2|qvrkvuEd_l>{ON@M}mnw?zSm8dE6c(*D;I>cTgGd`X8IZ>ZlRL z-~{Z0p;&}X@G1si;P>|2h(TZCbW}z%uofMhkLkplPuL^+rkjFRZNN#J`cTwdH^NHT z34<}ysn5Y##IrFMU!oRm?mw(=qdK+%HTQe4A|AsLcnUSu2|w8PxEE5WONGxVI|WI& zi8$MdJx|+|rJyJExv14Y9XsLss5Ns5mFl~w^P=S$yH@(5o_ifbFc;O{VkBd3vxkBY z6~|F8K93sFO?-x>s24mwYyVR64Ar1HXFD8-TJ;^Acs#}vuSGp~64mfIRA%pCGc3oR zEvNmTN+E}eG}Mc>Vlk4`cj{Tdhs|6M>j^|M^1eaYP(&+ z_wW&VI<B;AER3%cyRj9X$0YRsUwZ_nV-Rsq$I+-Mn}vS( zJ|^NvSOd>E^}nLF>who=M--EP^>jwD-9}4sAn|d>@XNNrd{k=Raomjh9&ilx{B6_= zU!vAV$Q3(P38;?uN3Dqh)D-VUWwiJT`PW>Tf7_!s3IhonVK3~6Rq^krRBp#i{5N*P z#H;qc8JIH5U4DJ8FDCAR-f6M;e z?*S@aaNC|x74Fzn&qHP845|Y+aS}GWOXIi|)xf_{Q<#3wPE~)$t*EIeMP=0cHw}>a zPo&VDiZ1AhE3po)Lp4x@4Kew?-S5M&KJn|=09Rr~-G{C5gcDc#-44VbwJYXhIIhOA zxF6$b-$ebv;eeU=3dTOLe|i~@F~sL_8vcoEaq>exTCvI_dtMwsJ^vrPSdP#6$94^E zeqzsuqgapY*KwkY&X&@7;=HHiUl(pr(1^YNv|kbvQ1$O(JKTwB_z*Sn#Ao)bAB0}S z+pr4mK|S{!F2Gw@6Q}%T*U}=??%0Z*@Wo%`KaWDk=Qf4kUm<`~*9q*2M1^j}?roY*8m0x2x>HxKD*{DCcsOeO(U1 zbmBKrQ}P8W15Z#5H!0^T`=YS~)zQ%MuCh6%;MGdFB#}nfsC6uCi}NZG2s2f8$+` zsoYnBEik-_t8Cv7c62YJP>TycpcdIJOu*rOHY1C12Jy$J>*4+`{dL8x#JLz+)xNk8 zm5E{u!JAkE%LTZ~zQ_clMjnN_uK_YuX{MPim`>=;g@G7=BQXl6p&nR`m2flaMLPpr zdx8=UjgHOC=o{be%~9D?#!Y-9zJ2zTQ7s~plaiC-lbXgSH;-u4xJ6P*d{UF7q-94| lG+cIZ`EtMR*>8-Qnmva5M&=H0H+b2&6+`wsUs3zr{|AusbbSB- delta 11916 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 diff --git a/languages/rocket-fa_IR.mo b/languages/rocket-fa_IR.mo index 97db89f95228751bd28ca10669afe1b43c3b82f7..1144e24feb066cf93c19d0c25cf2a4336e188834 100644 GIT binary patch delta 16119 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 ZzJlV1?-^Ih<%e80>J(r8$f(uoe*h4~Sz-VH delta 18112 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

KW;9Ez=R2}*^+I0BEM4B{%Y^r(-+ zIMQ8FX4x=og$pnV_h2WUZ@fc99$a>|wz=hClxdic%s}HEoPr(a7zS&T@gPpbYj^~Q z7weWNHbA8;WwD`6$=ldnc#MD14ZV_IL!}!f&x3KEvHs z;4PFlSiVrt?_($xK7rE2XHn+)_n3gcpj5mjs}7B8Bx50N#d=tEvA$2s#oV|Z86B;R zJd_iBSP@sDjD?Lj7I$JM{)Sy}z!LrD0hBlW5@}^4YN?)83$PaHEf|ksY=Uo~w7~ZP zB2u&1WqO*-!Oo<&V+?+X74SUD8-I<`GQXqTu;+5!mt(Oy=^ZE)4x_ZhQEZB5P}YH) zD1)#(&Ds|O9f>3nnS)huE5_nuC>I<;8Rf@OD)1(5#ZOQwHh-lqUxAWdjned+QM&d3 z%6d|Q(h{Fw8T=WkaKQMLhzyDfcj-Y=4_lHRgmObaW@7;51{YA?>^e$URKJ@ICr(Cb z(r-{I8ck+7j6-Re1~>*=qugg1o|fUdiO6;`JooB?YD@{KP&2HJo$xRYMIV+~rQdK4 zN=5F)Mz|Y0;t5Q_TPWAJx?is^eNp<}j?%JAaSqQnRuhpLRd_%*y$vgqZf@DhG6P$Y zKMJ$(PTYW}a6IO()?N5A%KhF$>4I;p{6DZ0=}K#K1^Zz@9#lv~F1XWjEtV&}7pvew z?0_XGZ}clx#i~KQWH&+?WGk=+?#D!Y9&_;vbmHK(`pplZ4BlgFY5)2}-X}u_$yJmG zS6Zj%b#1Ipx|L-QtVMb_$_<>zOBoALW=+)x_4NaB0_l-B4fkO?tQlgrg#&N^7KUhl znYR%#8shtC!)qvSP;0%uVONxv=!bIQD6EDXurcn%Zulm)#d7pZA56y~I3MM@6Da3b z-KbltZGecpVFvcVvDh8gqKw{mF%HjJ=^s!A&#zb)V>apQ8(}@tZBbe%6J=0N#aLX7 znRquQ;~A9u1pXujmN8>Q)XVHeVz>9`kdSnE;!piY)cQCi{@Hoyy3`VY+H`9_7^`g1!DrRgW57iXh1 z?KddXDt3<^l=ZL~>7E#iPHc$wMWlD^)h(I0Pp_yGF-@++055B-B_cKJ zx?j)NaVXQ}Ih2b0grhL$G2J2&oJd;!3L*1;68dlJ5gHbJa)lfa2&QdsIOm%(xUsZJEk1c zE$G6Yq?cnmd>Niq5!`x@}-|beQ zEL4q->6NlAN>`0QX^~Jum9MZ+To-Y#KHue=f@G*o-oJc40kv_1B3o zV2z6?eZRIu4~`=!O_%VJUTWLm7}A4Lnsz%j#C=!`U&k0m_opa-aJ)pVf_U{6{quYI z34Q$s_yFgpyv9J~`NlCKGFqp?M#ejOiOt3#qz|A6Z(8I&>c zB}&))f$}De-_u*KQCNYr8_QxbmcfO1E1D%6<-SWlO})|3-*HGYON$b6sZ3%j0YoRHpww4%}Tg05iYPxS)R7Tx6MU;>`T#`puu zeXD<_|6Z6BAhMK<**FMqqKt_FpX<^63Jz1O1z+&hL*JJSHavMzPtQx2bj4#Y>#toS zoWS+7Q0{XQE8~c-bk|Kr$)Ar~FmRK|Mj{)()&(8EVb4$c5bnkqS9DjzeXHkxW0X$*iQVhz$!|I#f{3#A3>V|8qbQjtzL zRr+GIRS-d`@oOkI_!4X4FIIlVU)b%CZiZ5^KT*n?{;J177nFr)1g^wftcX8g4Bo*0 zsD9J4WFQ9QjWdZ%!aS54zl3%0Ym`2Y`dx1%8eu&K-wu=qJ$pm{E$9@=H2eUi=|8jb ze?ocV>nL3ldsFY6;!rBo>L%?k4`@q<4Ts@J=s{_+A%EyU9%tb&(m_nb&#@<#y`?MC zACpK=LRlXcVQYK}o8#x$04x5fyRHSw3v~ID_U}$)m{o8ON{u(-ZMYxh!PimVFvC!0 z*9=GLs;O8T7oc>-TFc$olJv7EW8^Zn!Z`M2a{t~aEj=ngL~1-6W&ZERxp>vGAW9ia zNPmU$!2D=sZo^k#L()&8Jm@6G;SJ2fYGsu98P7pG=>~k6KEwdZea4qn=1Lgw5y>Va zkuQQY$r3D&8&LXk7fREHF%!?C4V#ry=AUc^;%UK%pFf5$_wno=@?a6nSW6! zz;UF{qdd4%6@6bjO4qKyESdi&iKLRzw5l?f;!!AldIme<_qbiktLeUb8D;*T!IgLk zrNuneb&D0FtP^*k4L70;#-lhAui#YdQ9~K+c)qcnNDQ7vnXhND0$xPvf*(;9B%`J> zx7CR#v)~z&L3bYIx~rInx3C3Hi_;ZdjUz~JN2%yfSQ&3%;C3SA`JzY{JTaVh?Fqw1#X5c#Ph3Bvz){EC;V=_ub*I+yzw$g7SDC{mOUGd} zx>072HzA;m^F&sYAvY|nugss-E3rN4ohW_x0ZNOMZJ^Ab>4_*6v||`&qkODd@n4vW z@oB7!?HeicD>xLTOUI&gnH{ACivmQXCR6DZBXvB1iRp;C=agNM4uPvLu5P|qfx%wk6|Y~h%ybYpj51S zqMo;dQ0Db4?19^?^e2{Oo9gn`IGOVC=)nles83E(=FaGD93}JrHzMf_hRkNVsaGT` zV~1RTGN>jrSLRo118yXJ0cHNqZJ~_KSc1|OQ(EdSoQ3ittFRHSLurviC}ZFRN>^UM zJ~IDr67iAIvz0O)!l!T!j!Q9DDB~o`7`Tcun3|;OF6)5Oms!{rr(qN?vH`P6Z%$Lj zF}#U=@R`-fpos0Dj6K*I+u&KOgB3dJ8z-XleQ%Vn znhOu$gDB?@?4-W|b5ObM#^P-es1I0e5#x$mIP%zvrb)Xw^Z*HCKw1xgECLHQDw(<`W-As`Wni#`vc`c3ElL!A_Zl(OhtLXMs(xDC@&P(T`yoA&`Ekk zfXE3Vhf!)6=%GjJ29)`}A0_`VPQsHY>qSaWWqgW5@H0vG(xbadZ`~3}mg)F4<->6; zcI~5A)VEP)LEvK|GU$Fo85Bu<^_vu-w8TD?kIyNT_24?nG)m~FjCI%!ZFmA@P=1Zl z6~CgKS2;sZ&!#9}*>sey%foXr|6e5{3&YO-x@Iv0^c&Yixj`z*jWe(>W?@%+5T(mb zq70@_QP%$7P|lAVsJkW+Wz2LyStoob6}$_V$o$_*MEb1BZTdzNQ6A*O1$Y>x4?7If z57>p$bkA9Sgf`N@q71gWgY|jMP#)9=A;`zptMC3C%YlyDlQIrMg zU0j0wGxZz1hBDgA4OQlEylyDdaUIIwdJg3Q=TWBTA1H&c5(YYZ6VIYyHNV_2Fioev-A?3i85Qtkpcmk!O zYsV?`kIf}0gRtIsy%Xw)(?}PiOyAF}bdL$vx)31ZpdfCdUgPKB2GX}sntc5vWvs$) zQPT5nSH^yP2Y2H9JM?b1(PX{3d;p~dKF2#SCR=}m94KR|@f7`H>rfW9K$yr1A{SBS zdx2fobgku&D1#+)s&49Rlm%%K_QOqB7B8T@`6Vny<jKGfl66y)coqEl-($tj<6wkD#peKcV#X zV=iU>l&d;jnSVc=j4fpTpCB@q6Rx6cC<@qA+n5o!9T@DV(VeQ}{*&xR6|rv4OV zG&e0$#+~RuS+YOJPS|di-n6=~59uu^Ep`EA9k_%t+kV0wSYbBvUskgHM5OOtL-{Iw ziE_ciL79Hra4}Xd*3)e*)+D_ZE8$aC{_`jc)oUnY{2)N&H!^xJQRaW~NMEWe@-0f!4qv7}#}1SSZopRf z2sXh}coMIpOs`j#EA#*TxQ?pDHJvr(qi5|sRBu{IU_92=AV?LlP}U_wa$(zy%oCVdIV zS>>y+ zBIyUQ8tz0nKa4W{j-zzNYbafI0i`RWHZ#j){#PX;8TGIXCL=Fs9#7E)rN{eZI!Y6k zVXORe(q{-`NXxzCc!v06_)6)`hxh@7JTQrWek2hj$We|Ho+VTvyiS=My|A+t zACC1YYe|qVXX(+yiu_5w95)D+thkJLIi4YWLf%*S0pUC8|2fu;+gm4-Z=5D>CtM`R znAm2OWpZv^E54WbJJz*)a||{+=2{}x?<3yRI`1LtoZYyMvPW>%FF%72&i zVA3AK%cU3NEz<8;>9D*%3z5;3AV)qIKSsPzC(VC*kjENi^d;DcmmoWB^S=@FBQ1-H zEI|J}DwAK6a}E)D6Q4m~T{Dll#NQyuaYWjmeSvv=gIg##P3l)d4btOD|H~>*L|K4j z?w7UlHWPo{imxI51woD!D=(hw**2I<`*iYiNe{zaD93ufFXn#^*==1=K!JSQWucMd zBl3?EMiXbDGe0u&VJSW0$vaP?D#~$~a3ArlR=PH}A|#T33?~v~D?W|qc+u?t{bZ&Q z<`HUBz&^w1Lt*JrmxwIEBPnCmH8xoVtgyyX@=6aEkw&DSB!2h4rHI(B3@r7pW?|;r)Wr>tcAU+f~6Xa+} zI7#Rv3649+KT7zJ{fF@?8THI;rjB(J+3ifUE|zbD94`>~*ctChg5x8N`LCaIf48n3 zOil;lCFI2tf6}^7GP_fGUJ34y_Rpi>RqNu9aiDdzsSZpGrK0 zsRRe*S%kJS|K(U>omfQrPQuGpzLXs!%pk}wT-oo-@takiz;%mB-$htSC?dQ`Sueaq zm_T@gP>b`D$e&?dx0bwA;(;Mf~^Qut@EA4#}dyV z$UtgIXlPx34u_C`55Z1;3)20Gze0GMba~QVet(#MT4k?j9tZGY9W`P&aUtP;f``2B z1RvpU(!)9LJ3<@l+;QZ|vDdnf8~2g-sFmM#HlZS6 z0~x~z(QOKN-B@}&Nc=hp7d}dv9C^ey5}Fa@SdT{tYbclBfe+zw>)Z=ipE8Bd znrG{OipcwvyblOJ$@<@u3^`uFvG_A#H1TenAjb(@ZJo1`^wU;;F7X=V|4MqCl_%#f zAWR~C-O76h-z797JVU5t-D|R(Ed8HMW+OuBand@W4taMHAC13J*oyct;(M$UU%?ki z|AHfNK0%IYxRP_@i0`rPWnd5TZ^y1UiL$FG&o?#_QPzpykiJB^0^vF0caa|;%p$!Q zn-abxF30Vb5+~dEgY-REp2XLZ$?>ywPJhell?WKc zK40$4F`IZF!h3}K3A4x_N&XXrQ*r{wRYEoLPZ6#WKZqBlfa3w;O>j1$KH)ji*88*k z679!L2bq}+B8(xgtCdc|cBCK1F`Rb-8(3v6@CtdW2nmEItb9)Y>zG3R|8=}wy8cIT z(Q)gH4V+v^dMy6S%G*QyZsLo`uZbCiI>hCeY2ADs=@EoK$-6;bMJr#jPRsrkVRU8e>^=^cU@-98Ln@19F-I3=^YS+{ky!l+_X!DNa zM%YFT?>D6XXvwxYyiU8HyC$`7>Kin)&%i+gCM0zrU!I-o@!F<3eg0IJJJpeI_xWtD z0{b+l`Sb$UT)WgEE$r*jHY%K*ky9qzdeDuSXsQ>iGdv@yz~y%37E5i7J`TTY7EiHR zd4uh<>{$-4tI!`FHT-84+&J>(pl4L~;GC=@HS9i@L)Y4RNnbc^^!TXonz1=5m@)po z%7tEMzQ>-U&k6rH{vj3oaAKuk$;8gV$KITUoP79`I9}k}EG$Vzsa^%@OMSdIi>~6Q^d7ZgEnn=$z z=_%Fl6%`hGy#DU3?LE`NKV@HujbQ`~&I(?dc6WGF-hELOWi-hB>DXY~d37864C@{L zQD7_ZOqKfNIA^&W;j9@cDtshAL6uL+k(Ma(JHu}jY>sL$%30u<<+K&Ki%Q2NgV7v_ z&YZMxQsLsLGE?o28R1>t%(B64?d-u##iN4Wd50Uxpcs)~G|lC&Mk|$$SR`BM^X2BkJbq(&cCk9`-YeT?8k1`Le zd!!pfJw87#kmK~aZT>uGfpik5c%8mNkK5;>!ghC#&6npX%FnUQ_IPL5X1n~P{5HGI z=Pa~)Wt5t8Ce3CwjX#eU^SJYiZLVDDLtCC*ZbSRzxau>+m^)UBnGduvX9~^N3$C6V z7dN!n*2m%S6uJEd(Ja5+U*rqt-aTA}Kf5PMg%j>eE0gMS`}{JLa_zKxPMTr0j+M>* zeMJt3)91@A%Fizj_FmmA=w5vzJa5f{GQp(K#H7;p?{9-P7C^-l*I zY?vRMw6Q_B+QuQOk#n}qlWVpd1K(4?wDS36P0>&Hg~x6h5*<9Yb!_naK1tzf+tQ;a zdA#1@6tfAWO=aQXDW2I>kl~o)p~3C`G$ZT3o>uyD|&M}vY_1er92~U3hj0)cN;!nZjoofV}9FGs?9IqJ+9)BR1UeYD} zRLQXDK#tSzbVx@^_cEU8U0px(l^8uUi(E9%{~9AQkF3sTCNr??MSf3#)Ru-RE}aeL z3zn|fa)pD|<|JmB%x+^`aP_Othi{&!S0Q-*bh8*^0#iA7Yens#?Y-UM)c50}f)~zw z6Ks68VX()!CgJ?EwWGq}k5X0etB<>+w5u@6DN{amsBfApC$(?UG+*jyPr5D7?=MVm z-FkLms@LO~;q<2!I9msge=byNL(CKzE89d%}+XxRM-EV7~)+McN+X~}Tbvm`LT_%h_FWr`w_IK_OXED<% z$Cv5y`O|IL+1;|8-LmJTw@qp1AX*x6OGdYBx0z1qK#@D!?eP?rW@iUVQz`8o-JCv0 zw%zadayNsjs715B?RXErNY5u^UUp4=hb z=I0yz-%sk8ZgaUEtuvg3Jl*Mbxc=>?3^<3gU!L8|E3(NLJs`Dy7oIuVIme&Fc;@S$ zrN1ocwqh;}Py6(D6|Vlp@#x^|mlG>ESvkFYE1b5_yeX<>9lP6}U(6($dF=*xb&Mj!P~F& z4z~LC>tKcN2iM887JHk%g2lYZD~||GT&wz3lNb0$fiL*y7q!~``|gQ~^DaE;|Jptk z$~QUR9&&G0bwWpbs0u1A{Mh$TMTI~7SCiQAf?Kv&*(`;Y#i-#4`F6cID&4gFwQX{G zL*K=#gvc8)sxT__P&sui^h9|zG8A1=-K;m<+y?rj&89LPMQ$YPe&mmes(f^$PF3}h z3Qef4E=ICys3R(r9;YTmYSvOIQI*VnjrF|H@OTv;YFDUgRQ<Ai9rXMGgF(BA?mwxh}REPOt0<*d#DSitL_>UKwVWg zQWCGKM2(i6mbpiwe{$Imn33=sN$mdDR$Ms`ana$DKv>P-^647XoiRBw=I z{hYsUloooquKGRnVt-Y?rgV*rA-m0QZsh3MV6V&d8l`Zd%O)d(p(r0#JFC0R?5&wa z)+p|s>v1z=JZ`r$%{JCq)8cdTM9+su`}_T>Ux> z<-u8@!lvqIBqvF^q65<7v>0z?eyDW?q)Glc=4|6wO-IPLSsw1@GgY$3r#IC4)&8G* z*bA8;PFKFq`ab=AjUJUwU!-OWm8Bx#mTIbs8%_K2WO;fL`x$ee7pa+|sz--598?YB zY)+<;3}??&ztioKe)oljv{pSsQEOD&DrRGvQ;Zf*i!^MlevYa>%1N(z<^Aklud8IY zH&V5odNMXtKV5wvis_+Fbd>#{jUBN$Zj)JU7(%iIv9@zYmh6#7up^dA8vXz35^LW^uGGw7Zb=!5q0Qq}^T<2n z)le1bFi~xd3B^rO)0)%uOewR)^^5=8!feRb#OvZmR4CgLm+--lXV8cPE?8E+32>uZK+!3o5&ErnbYGZ%;G+|I_6m<|RJ8 zUE~8LgTHhSFQ2u4dleaF4rk0@v z%xdWMR7R=1bc)UVL2iB?Q%cX#A8Tg|IX_>YCnJT%cd(nVxdwRc1x_2E(UQHgTsdWX z6IwY_C51W{smhVlezi3!^x+)3PMqN|Y%mM$8r7Uu0t%{F|sE}%*LO+C5 ze1*>!Zm_=F=Ek8CRs3sD5PG~kAEaaJ)uW+Bm8rn$4XSgb_C{5%OmOklxPUoD^vzx7 zJo(35FjseLWtRnnN%ZftPj`*}(Uv0f);^0LhktF}`39IX(OS>wCO>zvYHIeXJ(Sd1 z)rm?of{T8r{phu=N=1%uSNBv29Y3Jzg{B`+aiPEg^>*Z)CskflnaK=imc-A{kdmQ+E28;hyEooT|aa�D0leXw<$KFUK78cDAe^aT(UZ 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 diff --git a/languages/rocket-gl_ES.mo b/languages/rocket-gl_ES.mo index 22f8f39a05bccce14fe9a851a42f080367da7b71..63483b24ecdcdf402ee84972c621f22f7f098495 100644 GIT binary patch delta 103 zcmbQmzMXx7h$sUP=zs_y0MVVy3=FyxO@lQ8{6ln|i&7IyGV}9vT@p)DtrUz53@vpH yEOd>`6bucm3{7+mObiSrdoyZJ?8@NxNz6+xO-u(WOV5dS4W9ThW^*f}C=&o}G8x|h delta 72 zcmdnaK8t;Vh$1rs1A`6_gMbAPCjbR3fixpX00bs#22VVjHQAjpdg3xo-n{hE#Pn1v Ph4h?w*Wk?y7{!?Ym?;ja diff --git a/languages/rocket-he_IL.mo b/languages/rocket-he_IL.mo index e80e7f4a6d7d185f68480d6ddb345a504e65a52a..3b4b88361ae43641704d0892d4a14045450cd273 100644 GIT binary patch delta 1703 zcmXZcTS!zv9LMpYyses-%{242sj0D)3YKIg;cieNYEe)md1JH4Ley?xZ4W7mWrl?q zbTKF`5~F=EA~5QqOackZBJ4sKL`ozj)KlM|9yy%P`OlvD&wpml*jLb>-x1|C{M7{L zKCc}Q69?iMOvM(oVZYTrh(W|dR{INFMEn{<@H6`36mG{ET!?OxD$f?A$?OO;-nkBY zXo#S}gW-4#mtiwHu*dQ#CK7+e6}W&Z^j-!oM;B^f4|179-2AWsgYl#lpG6hi8pQk~ zdFZkl?x5m9RK>%nieI4;kKyY~qX z8t5geka1Mv@2G?`mWgcaO5$x8j}54;x`j^C2owt z-5AgKrj`fBGUt(s%oR*QA8ID!7>7Yrqe49E?bqYA%= zbKe$fV#AoE^Y`9*;V;$``%$hwz7wd#ji>~zsIUJLYGyvmRul72TX)v})N5$(=1G-TK6kBmAYU!#`1AB3g z7puL1&NalvsPP`hu>KAnMrlx@U#J8Tl&J&>NRcKD)nNnb*pyhmSD^~6LAsjb$Ym~Y zTZ4V5t@wz_H;u|Oi+LCv%ld0CHpkAN%U!4?+mG7wHq5|YRAHm2fhJIi{#flc)<2gx z8rNYF=3@({<8$OPKe=f_!6ffShnI(P9v)#A#&Hz%f)6#bVbnj2F;rob=)hn;dCka) z+RGeNzkR5F4XBxW(Shx#{sX89jG<0T5oWAoDd^Sl-~4@sIUml2GKwJqrTs}Gw7cV_xF6BbM`#v{X83} z-{06bIq3}{Y@Wb{)OSe;m*HzT5%=NM_yHE%z-6r?EV#d6$(SK$Fn<52W0PA5OHB!oFwgFe@SGckuY+>3T_ z2NvQke23apL!EIPtw^u1QR4%=`N zzKnMK^_YJPE6IO|)9_gQd-4l6{K6kx?8qouaT)Vtg_Y4ptR>%#Q*jr%RELmX7~;}_ zCozL{^r8iGX#Jm{9sL3w(3dzRu>PmGvBLA{6qQix3{0U7WVkrh4d{!@(3x0+u6-9e zq8{9ad(npGGS9OxgDy!cx+GnAB|eW+X+P}b#vXoz^e7z0+4wDHa1^U?9@Aq-mg7%s zj+N+?E}%EQ--I{gT4XF?do16BcKkhbhCfF77>?o$+7GAV1ApNb^8cWlZws|s@v~?J zFQL1C2RgDrbYv&cnK+9}v4G(%X)Tx<;=IhV~vuFpJ zV}2d-PUt`z-irAS#qvS)`D183Cvg*=iRDYHIQ!(A(e^&AV*bq@a^KD$_;@fD)hS7$;Lo50-mKU;v7m=^PTd)c1u?MfgBS@R!cXU8S?AYB{op7^> zn?v{pRx%AfFo=%qDB7{(XvcoUG!}7098nFrmh;i~)}!w|iH>|Lrm+`&{{T9Gt;9`46XC3R zTutt!hx2!1|2NhpWL6T7#6n>!gu4ls;UdCx8{u@C+(@qB^~AlzeT0db{@-*LfAKRt zhv*>gAxz0bTYF%4^HIb5FPDI+vuoIyW}896XYGV$#2G CBe{J5 diff --git a/languages/rocket-hr.mo b/languages/rocket-hr.mo index 87dcebaf557f2b98d9aac218f7d7b945b762ef4c..27a74c3be878151e385fbd93fd19d955c462bcc2 100644 GIT binary patch delta 11220 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 diff --git a/languages/rocket-hu_HU.mo b/languages/rocket-hu_HU.mo index 6c1b579d8f863815b0b06c3b4cc0dd87309bf9ff..dc6e16b3b029b9405dc2b9b8de9358edcd772a76 100644 GIT binary patch delta 11383 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 delta 15117 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 diff --git a/languages/rocket-it_IT.mo b/languages/rocket-it_IT.mo index e90fac25dc492f490aa9066f24f5f9b12ae2a893..34ac5ac9f0b215c3d27c0bcec280fa561cf2ea8d 100644 GIT binary patch delta 9528 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 delta 12658 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 diff --git a/languages/rocket-ja_JP.mo b/languages/rocket-ja_JP.mo index 6dd6232edbd04536c930e822114799eda56c7ca7..7a91e02f7fec5b7b7f900d1bc90510dc81ae8898 100644 GIT binary patch delta 10431 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 KR}j3{yWs!NkRGl8 delta 13843 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 TdQ}bU*R4xJV%qsF+0*_HKuv7h diff --git a/languages/rocket-ms.mo b/languages/rocket-ms.mo index c6c5b5bb5001551917433c776bc402746470e05c..44c1acb649dbf5ecf298f00ccdee4dd4f2bdaa9e 100644 GIT binary patch delta 636 zcmXZZ&nv@W9Ki7>WA>em`7M#nT=-hHENXt0<)UqNun^H`Ev-5DQGR7{aB#vXxj4zm zX%V?NXyp%(gM&LIE#>O{>Fe9K=k+|#_j$h0=ks|UTd!S*H5tVdDw5W)62pueaSlzm ziPgA+HF%7@c!gGc#}@oR9j$Dt#U8X^2pcel@_p&wbCb%bb|&&nc<~#9=qgsK2@_a~ zdngATU^AYg8*?b@UU3kAFpS+LMu5Ax$oL*5A-9QpyCeX6nNb-Xs~C4-9S);ZW(uWZN9e>$)G?1zi2_PuWf_}N^>nJS6Ls|9 zBzECG_Tep#VgcK5z;2Xw9(h%Y#)%vMo}*mJ14i%-C83UTBhf8fXB@brBUj+7P%4en zNO0;ICDIp^jbA7g7;-2zfiXwUY+5MMqGRKp;Bq3qnvH06nlIqN1RETK2oD?l4>V0n_5d@>8dLgq3ecHO2C~I#Fcc}g3^NE#zpY|P0V5L{4O_>nRCv)AJhApw{d^e%pSIK zBiuH#7=|&4Dde(S+%Do6#xaMt@fk+&9S-6S4r2{3;cs-&Z8z)380z=y|DA6)--cM& zWZ@=$zc#cYN@`BlOTtgLfjC1%G^}f90 zH!>~ol?fJJpdS2$dHjN_RFR|%RrI=}k-#>xY*p;V1H6piP#^w<>R2{v=HVS2#wVyw zY$30<_db(8COdcot2lx`QCpMfG#khJID=c5#jmK={y{FQbMr9T)o=v0B{|ID3aX$z zRH0qnX6xubV4^KJ#4?^C$=lPOMyAWCKW?BpaD)qZiY-W_8Cuk1AC% zygCTF-wfXpOx40LLoL+4sv<>-p=8t{9ZZGJYMP;Qpe<+yM0M8ul#cN#H~6101VwmvH$=8 diff --git a/languages/rocket-nb_NO.mo b/languages/rocket-nb_NO.mo index 85e3462eb1f9874ef9477df6c9a9427ca079d4c4..7da7ff5d71bfb6a6cc491de6b1aaf9139ff25378 100644 GIT binary patch delta 86 zcmZ3&evo~Fh$sUP=zs_y0MV0~85ndYng(+Q_=o5^7o{eaOpap|<21A~G|@FMF))}M i%BVfDtBBtxF)zI|F+J5vAulQ3&wt|Yn9co+qD%n!C>4hQ delta 72 zcmX@ezJz^(h$1rs1A`6_gMbAPX8{E)fixpX00bs#22VU&GC7bjdg3xo-n{hE#Pn1v Pg}kJAKmX0E7{!?Yq2dnb diff --git a/languages/rocket-nl_NL.mo b/languages/rocket-nl_NL.mo index 090d32878791b3df65689291971963ba79190a29..1bb0da0552f59889ae32804af73804d4a4203cb9 100644 GIT binary patch delta 12542 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 diff --git a/languages/rocket-pl_PL.mo b/languages/rocket-pl_PL.mo index e04fcdf3b711cfec72d24422fb9d9cc731b7d454..ba7c1f347177b84c9d8baad725a2151d29c3777d 100644 GIT binary patch delta 11786 zcmXZi34Bgh8prW_Er|#s5h8-TlGqcn+Y`jTrbviAc9p6np$OL+rIy&Ywzi>^rnYLU zsx>uKt5wuev{g$nR9mX;RLlJS@454t>GwSMz3;u}Jm)#*-Z!0Nr+m&7`4k2_7XQhK z(LasB_yX}$oQ>;nRs+jQ$FPQ$^#|r)2o8(2tjd^=6>t@f$DOza!{RKfH}1zp=pS!c zTW~E_!)6JVW7VXQmB9bdL0#}0tbz|Q5X&Z7R!0oSX*e32;4K`e<4NX5Gtl3*tP5Bj zuP0m9|M=W)Y&!e|gNQ5eBIKk>g%H`;^B)F-Z2TpwXyj{7@Yy(Enh=!-e14&-7!PQxPn6Q|)DEtnRJ zcgdh3O!U)ub^HDc0Kz)BR>ioA+9Xo=1@GNTNbK07z+2UG+f!yCZL}M5y zoN_;iYiFjU1vcP#nj23*UHBz@4i~xccc=_KM9sBtdo#D;c$Ii6s$;!7kPRGx8o={d zhWlH&?gz6_Q!&pyVYN;m-h?IbE!2hfql)w2xCt+z4^Cl;)W?}f(yZO6srm&IupE`D z@3%%}?m2WkG;(N!<6_hty@eXdXQ*nvj#`EfkixaB&ZeWyQFGlDSt!;3OvN==8ZV-z z?mFtaPf$0m+{LVpgf8S?BW}lm2<(j>oa(v(D-jkYt(-78wO(i9_Dxp+)O+G_4zZ0MjaZ-Jx$67p;9&(Be4)`;{o*G zRcwI&V1114WtLqZj3u6q^xZ1LOni!cFeAf!uL!k@zQw`lG~%owG}fZ#_6aK0jo7$7 zn2C*WGAiY7V+{U;c^JmkHNs^WgnV*ISbv}yc~{hh$Dl?s9lytwcoK65SyoF-8ElrPgBsZ@r~$m{x)b&NgBXNg zU^rgGDySvngkl&C9Z13eOm`iO#fitEZjg(GI1e@AN)(Pd8jbZZ1(li6sLz*Sb9@8! z{hP=btj9PKdkrQ3BWN5RYNjBPeOPnT2q_LL71gnhSRIF92+qMs+<1q zp{Pt$9mCSZL`=cms2klwl4?cdm=}}+TugihH5G$iFg4+fqv6AWIjB{z5S6OeU5l_X z@e$O>E+W~se8y_=Ql!XMVBN!NnD(MMFB^58Le%#+p^ET*RP~?2FT9r+XP#DH;(R^` z8gE9h9!nFSLG}15D#brxDJ(X@?CJifj@QOX*bKRpwGUN0krT~zQZSylqZ{XA6%AoN z4Szn^g1%UUnRpPpVA)*DYK(nRBVU0U>7O_iE9IGGwG37Ddr?z!0weHyR0fLCJ9R7! zYvUqpq!b>Yp<=p^8u3Hai2uPfEXM@vf<3SkK97O;4ywZ^Fbq$lit!$n!SXMeBCLk3 zi94c-aS@ioedy={M``E_Cs9>?0o8$P_&WZI>R90v^Z5o;ybUYh9t^@`7>XBBnfMh; zpf71shs$69R>ua|U@G~qM`Hj7bitQ#5UxO7;1OzMe$&iU)WlbaCtziKit1=czNv{i zs2jy$2Bx8|vkuSU+qenmOgG1)W{`jNsOb!|QFOwC#M#L7Tb21-BV2@GxCz7YFec$u zjK-ju=KHBwoj4OU_j#zyu0@h)Z9{da`Ybbbi4Kjj9BA&^$+ZvG=lBThiOX>v{)l~W z=4>;E-=Hpd2Q>vx-Q$6C%qsGrI@lX^pSh^>m%BPUXlTxlpo-#COvH;=3Cqki8H&V_ z#0eOM8&Eg=7$flXVtcrJ0HR4m?y{}_=XasYh9%}AVU7ths zbSUZqQ*aqB!{!({-@KR%Mh##sX5kjszi}jS=F4W?AHllBzhXNKTcBmk{0*U@Ih%{$LNPQQJHyw`r<#RqHD9z?BN;MjCeA};eKp|x3DwTregKIiC6;MIA-8O zEQuWoS>o8Oko?!8ah(H7p&t`m7TaPn_QZ5th@J2X_QzVw&C_iTb|k)yqcD!E=Hq(I z#E_NdsX7+B5}!e)-wI!4+_8%MkLEz!YBRD8s8pW94tN{aV(c1|!jo8uxDp4I${2he zGth${qi*zrYeUwoGBF+X%vk8gJ5W>djzhzTMzQrK^?o>kI0BX0RTzZ(P(}G4RL1V2 zFP7h6UcD-#u9JqgO}20rahF$3Ccnhe#3f%dTW@*%7qOE{Lp{5RBe2-(X1R<;b>vm- zfdLy$MuuQt;$0YpKAX%=Ss$kpZ$y%2RoiTS6CS{E#1F8K&Gx><6z6+ey#sWtOEfgH z$5;nL>DFFsjfwah4#K+IOokRE=u7n+ETa1EBk)2P&)M@_{www|78sqRFcEUSY8WVP# z{UZg{(Vpmw!>}Lbpra0aN<%&F@RoVG?1LWSz#{W^ym$;G{tUHKUd1~21eKAfx6M>E zLS=5L>j_LDeuix^WshYoz`5v;<@S=u3N)%P;gzughG2Uvhl4Nx$6|Y&fur#_4#3!b ztO#6!GqKlxGxz6F9Sb^Ow%nTNL);!~VK=OTc?TFigRlxYpt(D=L6H@iigc} zx(5#C0|&d{HQaCMcnp2%*lkn> zoS#27TWsm0=4sUrU*v-~uqTH6+uUFb_9kA9)$jpM!!n_HzSI|Fv1Mfl#E9o%*PTq z2dC0_88y=4pL1hIUL7?Btxo9~;_wGT8ve!DCciK@YJJ++4+A+d7q?*nGObqhSLQ|I zCQ>$5${9L`k1!RloHf50!_JwEbVk+ESyZjuMs?^P?8yDC%3t$`BpiZi=y%>MyRN8e zzlF8vdG`x!C^+dNs{?mmGRyRXZ%mP1#kQRPJ9ftAm(5hXjLMMz6_eRYIEOd^9SYWZ zm&OSkdzA+bCV$IC@GkxruYG5pdY^x9en4Eu7><{^X685<6N$%TE^fzC81{pik|-=m zTpt%<9Da;Pejxvv3+Fm73t0Y!`APK|E+=k#(|q9)GL6>oTV}mS|7cdnL#)p6RPsLn z2cjPy#sEByVR!*mbPq8SE8Z~!YI2ACtD4g}pcBWUifti=<5u+GCs+Y*qIRx7Q8y@Y z*PIuOs*Oa{9N$N6V8uwEF9xEDITVAj7S_dP4vmpChNCX{1=hxIQN>sCo+*|P)JWs; zV|)(P!JzwQr;A5*uq|o;S*WR)fGW1zs3|D+lgV5uEKTfW(5OjcFlJ%_Y8ifu8p&f+ zX8a$REw(mlhueWV@4(OIZ$ziikN7Lpg)h6uZ((`jyYAiEQ2>t9r*<-V5!F@165H|RSVUDwiu5yP#xHd zy3ZX9=l+)e@8$)hKK3H+jgxV=Yt$cRy}pW}9QXWbGS(C|HT|(6zJwKV2d3c>T#d#4 zXWk3e;d{h4u@b)a7xTZ0#sM0`vC|VXS9?$+J&OK#3ZwB7Ho}sBn+&x;4{HOcc4!A0b5|uGxG|Sjw6V7xdvIb z_q|{WKF{%^n2*uC0z0@9`(xc=w)clf0ahj6hsx0DVvgQR-;bk0yH?T5xFJ(G13bTlFQP=y@)wx1LJ-LIm zu(O}-t^Nt94$Q+$T#fqTPpI?$a;;I?_P*nFKuy(r?2Z4yc36$gLL1O93`Pf43oDUR z9P2$A>@n6SWo++z{@$|YMu9xyl)~z$%+y1TC<(PZySZkgsy`QXqkmy2euTQwH>mUf zK`qnr0k%~fqp+;1qz;XEcC=*FMl`y-?OjH%pf0=_TjCi^z@R|e`&aCCsPnhsG(3Sb zF)hfpX5cZ@a!jjWdw0exR7Qtlb%!Ha^()zNarm_52V$>B0j?uOss5bVxsGM*Q3~(&+nkFpBQR;|EjhWGl+{c0Ew>_629Be4x-T#QZ=!19 zH&m_ohO_>g(})N+7aoM0iND5iILTvse~R74B;qnPZ10xa8nqk;qNXMvwQ&{V&v+6C z;rkJ`wE;sTZST(b4r&VjMAbrZC(8EDSukq-CZTE}1ywwKa0-saiFgOK3i{VH%P9|) z;)SU5FQ5nSqefn~mbq>eP9=^(E%zPR10Da`w)fv`4#fH#xPh-@Kpis`MW_*8!Z5s# z%0#KUCIczBnz%n|wLHRB7+KHuzHki3vczLh*O`KuxEPrN$GS;l00*AACk&`>dORLA zM^iBsSD|ij9y?;mXp@=lm_~dOHOFOR%)U_#m65urIZs7pwg;ZX94xK%pWMKFp%rR} z>Wc9=1oeWk3bl+*U^13#Xx4LE)SFXx)LiDFGFafc57nXXZ~{KSI+z`6R?9-{#Qm+k zG*;l>=)uA`(~-UCPkbCTmuE2t@1i!4Om?lmF%OU6gak7safv3?-O+Y*1(WPX5(psn#=yU0LP&^_?LS;u(26wO{~iC zZm15AL1lI!PQnixv;Nid#3r^i4fg)7ZpGWOr4=@W8nwhy>jH;DQ zs2hHO+7B+d$8V#iuvl|*osOwg(|wSs1X*r@gdYh>MG8_o2bkU?O-yt89l^BsIB%iYMEZfmS}Y}53N?% zLF<1e4W;rVcE^BD=GAHtRwG`Fhj16F>PK|8y)U6taWC-?SQ1xsG0SirD%E|un#|5b z)zoR!eXiq3tkaE*YW)||P;ouLTpZBdjO;8fBYrO3w%)`WsE5*$=ghKuhVzLR^sud6 z7}(Rcw&I7Vb)MbJOwo6!ji*h9c@KC2_Yt2#M-P{|nP!|Z}XBl1~s=gaWq!# zV|reI+SwkUcD$#kOx4RW%d!Ld5N|=PlAWjl9>sW!?Q8afp?z8Z$sCx?0e$d3D#iD) zHCp}5h0^eFF@B)nQV#nLG#l0$)Es~1##c~N6+Fn?;4~`L4^RWi9Bf;caS2Yw(b#qGmv>jqxL6~#GkxGB=^qs?-gf;IVk zHP*w!_`S_C#Ad`N#+X%A+{rP^W+1lYgFMvoI*8F2{({*VyP$Twv#6~!daSA9&ZrD7 z#F=;$wR~H@XqMj=>`43=wMtUQnT$x@Ex%#o%^Xj`e#8r~6y8GB z$OBaIB~CE!3y0Bo2gCDBjkI*_g}xjgh1oa`kKtL=jn+)Ey?>h7iK?;e$+q|3e5}L(O>&c$%p7&Z z2Aq(K%D`3}i0@$xhD^uy1zV#AIu}*MB^H~FYT#nle{T*HTVi|vFO_{!@ov;IE3wq} z{!67Kj3eHUnxb2799(ER+72Ua)-!teeDN~d`+r0(!aQQna`X1Q8nxk-USWQ~%w0i> zwA|k3KoCZ(G{5DNa1!xeEWkRe%zMJy*pxVawW;nGP#e}%tb|KYt7IFhD2q^2bP%=N z{*5ZibEqBimM)}J-$y;C1J;q`#KtkPNwKjjZe6Iq;J;!9kPi*ea2#;kPoQ)CnjaiMm zu{d^!Gd>eeW<;DZop1^2gio;u=4xO}UW~$ctc~MvD%M0#Lu0zC9Ce`&FuTW?#~6Yy zUp3}W%8NI$Hyqs9n0&+)k!LV*jeW*6Av1}B>Ua*bU`DQ100WUmFka-G=5=h2t5GL- zggU+wKeT@wX2(OQ3!Ou?)NN;)Gj~&CI#V9uBa@lTWDLL=s2iAv z;=0X@8H`6z^{Q}JYMJf03d^-HW(8irS~!sY3&BlD>zh-k>-hp(8Iy-hK2#r;L^XX3 z7RJ`7F_D5raT2QUmZ9o@hN^!NOX1I$8*{fdCL4yLE)<2uure;h=9ri3n;*#Jq#zAd zF>@PZvSLomg#}S#A{;eFVo@hvgu3u*)bXFA>Yv5@cmucNZ>T3<(bjg&0p}Ua%k|Aw zGQFvA-|cAD&UQ&BtU!4;7r%`<@w>=FnvE|03xkMrwYPm;5<3&u##^`$bz{RAp&4;9 z>H(%<4z6$JxgE<;U9rkl*r^J{`%z=$H0nebu>gL9EAbE1n0c?GF=cTnGC|BKR9EGo z*{Wa})bU+WEjIvtUNSStgyJStADzZvyocHGCDKr=5B)*R7!-p7-xw;s`nq;bCR~(8x z@G>T0mDlZsmS73uJy;a4qptG@sw;!L(*Chz%5s)e?2pVab061XwQlxFZ{nN8zhX-q z(%ts?5!9f)hI)|O7>d7Rb$~)mI9D~|l)YsFPNHVQaO+F6QWDBq)ZpH|_ zgkF4(8kB{5*}iU!ns&pn5-vujyg7r6J5z*_%`h-SP{*A?dei)g-O<;k56w?zH`d1B zzP72`pqF?k#^3^c1F*)vw-$jr=ZTi90PD0 z#%uoXC8NRMdBaY(0;rYR{_7m!cUZ7f}*kIbfFqs%KDrkkdF~vC^GZN3nJU9>M;VRSNcu?az2J*C|jJ)E#E~rVVBzPDI^U9}K~Xs9CZCOX6N^ zh&NG9?;UQNJ_WNAk43e>G}MDFL!D;}mcVnvX@3od-zdF6d zw!{ahQ5-wcj{1feM4XJ8W)rY1ZozQ;8mr^Ks0&vgW$oy5nX#y8xD=U*=3nfNeMa-q zfhVvtmKsCpM$W3dUY#yR)^)fMB$+cDvrO(qKkD=W-_&NEnu_y+39o?vebOV#9MkYWc6m|zEQH≠)Oj|ej^B?OgjcW%-pBJgMKR9O zfP$ZKI#!rypI{FL5Xbi<1 zOs5>FJ^8n&!TSJoax8 z1hL~aRNo~!2VenWAL<0}ArEV|U>&Tx(0-VVM?Ju9?1TrLh2FO}JQSlTzkyMha}n3V z7%Z;&KY@(;Y$!arb`%-FvI&Lni z{#8`VJ;%IU-(+86Kdp+Ro-7eHnirv3W|fQgpqlg`7RGa^7Q2T<@Hwi*@-MZ6GztTV z<1qnSVFWHmo#zDlijnz}j4t>)7Q#PKgD>AQYb>hi`eP-07qu`QM;)JyMItwrM*cI^ z`JoG3L7nG2Y=^m4*oCe)GF(jm6|{e8GA}8pjo~ZpDD8pOi3edzT#rpK4ZC36D*JX@ zf$_u{R~yq0o8fregYB`(8v9nAh0TZ`;0&z2)_QC$?Vn6Rvvu~#_M)2dJ~qaT>*)qe zKsDhHSP-K(*rtrf{=`Gji?>i0`p4OHqiu=BSe)|pEUm_XZ znb~6JZwN*cPDS0wC)gUxZnZ5k0Xq|)M6Cm1+w4l&2vdnaLuR0N~dDDhW2{SW9fe~{6W<=th!@2eqoOjoRmd3M`(!mFskxejaK0qlTjsN-9Ftkr~@ z!8-T^)q<7w*e|1I7)?AId*VT?rz67l+ELmIb)vZ#gS#*@{(@?{N0<*^pe~gA6T1$~ z#hk<|Q8%^~H5-1!YM6#ru~>lCwfFCJ7)OQ?#P8|+CrEEUqS6}g1S(9 zY=*rt6nA1}`~sU`rqApRx4-N5%`bjQ8-+mFlP=p`=yx&1p{ zbIeP84@2-dMq=;*+amR_192OS!H=AGF_yUKL1SLU&NvfSq8_NsAsRA2nd*mZ-!{Qu z;$EmFcO2@*W?>`z0F&`Md>s=Gvk2jbI1vXQv3>st)m0Ua+9kI>YIgKO&7S^P1m_>+ z@fpZwGX*6v@t7SPK2+0vhlMc>+hJa=rm>KOAvhEZ;C#%?=-z<(1LT$ytZ=yRr2Tcg z*=c+HGMq>KC%75k^qsMHT=}ehPY=ZI>{x;c_ySjA{5kuZ&d<(@=k2r{j%CxOo zs%yGkuunPzD-mzQF#Hw+xUq~EZ43CaU$RSVX>3Y`Q8);XVjHY-*Ppt@uZs*e|8CR~B7$gD;6^|PUKV5aq|Q0Ny~| z(C-+}^-cD>ycn<@HozD7KGyr*j`r(VnmdpCfdvJV?=d@Y1y}V_Z|i+KNH5~6#6O|B zvf@v+E5@N(=q0LUv;E9pL$EaZSOv|8WEiNX$1n6RM*T{2;VopB`SO8%>mB&b{sM6Y z%TxY0s*j@{+NHWT4kuoWSuxk|wo8IBGjRyc#!`3)cl=KK&m%MR5mN;-KDNJ7eU9%C z*LY$NIEyEUJN{wkd+1a5I>r#nqq$qH2dyw0Zo}NT4>d+kV;KH`B{6H7eV}q_w7*7k z0}52J2WqgTVkj;|FYZAN(rcI%AqJpM7$1WRcCCzI*KjIQ0HG!8-Cz*^LGZel3cH!sPQ#Sq>gZLtZC!WGWoEFS-S zor{Gj&(8v00?VVirUh2SH&9)+1RLNET!>Gx3C_;y@&E1U8mh(SW%KxdyD}Td^r7ID zK##w#)}WqrH)^yW#Bz8RWAHhug(~r?^I`+sg}pHj3+3?myD||&iRYrG-8QU%Ut%T9 zkkjMySE!QH2>79(DVYM~=}eIEaknI)ecBndc^9g|Ugn8L^b4yxrAqw23iFMf`CkZ(|9s-~}i$Nx8(rKl4eah^wA;5urs{e)Vmp5bT=D(LYq z!E;dS#Am1__dLFVSFsSr1=|}*L=EyJ)cFoOeHX~+PHtjpj4fpQwh!tCMq_)Ni8}CG zRJ{kzpu!&iH(qU2SB=FE_zAv-d5U=a3s48tydR1h3)7Kd)|of0+re8@&BV!O;r6wI1WF>iCDda$4tPzsOeZe%&rRw zs1|LHA((`zw1S|L^_FaTD=5-cGkws213VTImj<-mceBW8p{CSoy2G&%Rs=RIn#* zjjPyk5(i^)MUVeiu^XtD$iJv1w^}7T9b2KgW)N!Ont~5;KX${-l|5z&=3s!u;YL&! z{(>3{&wOOOWCE(#`5TEE3zboWrzwuX9ykndqGmyhs&+c{Lp5w{72 zLNJa+FKW6k!Pe+|N#;#5t*YCV?kX-P&Jbg}VioEM&!V3EHmW85MlDE{YuK)8ftoG% zus#;7>G6MXbi|y*T~X&rL9HhfkuLC=Yh*MA9=i%HYuP*Qjq0NTSQlrYE^rFt@j0qx z;%eKqd_Ss>O&z;#~`W!vokS&UQ(u2DYi=&`WuH)CxNa$E#jL`_A|deOgHVAfwS6 z{Hpx`X^C3P*I{YAizP7dHM{VXL-l0~oQb_qH~7GnXKG}hv=HibTOW19T~RHYiX(A* zBj&&EJfgA3OvQVsmrP2$UD3v%ZeSH^)Sp7FV0W++mTqGEb|Px5EI?gwD{4JB>&kDS zy6`FLJaw8{+couh{Qo=6Knkj`;}L4GgeTa+Rs&}d_rrns1T{u_HnR)OC@e)h7j*-> zQ4eqty?6^%{~y#~%-7t`sz@wD+}cNG3z<|@lb3B_O-7w)1L}3U+nJ-K{Wk24T8eLB z6o$33AFBzd8(NH-t_M&pas%~yMH*(o(AM?_eWl4Xr=SsP6fZ=rTpOGLZS2~egqo&D zupfHc+Hc007(@IJH3lNu*(Z+0*2HZv0oP+Te1e*W{~#-&&jh!(3q%;|jw_*>ECDs> zdZ3B2T#ok3P@ha3(djvI2&tpA&g0Wb&quwpdzhPw5l>4y- zX6R%;ty*Jo;)(bvE=P^}PMz&X=m6Y7{1s-#X^D0k&PFwL(=N7UhoQ#Q5!7|AU=kL6 zofg&npF&21>kbabmR;?W9mn~^4ZC^Fhj@<6Xy2C6vgvRx0_Co})6Q!s)8?bwWJ;@ha#?pdKWCkjLD>NjM6-3}*f}CiB%` zkLiKMhuGgxe5kJ3iW{-QP>(r`*RT>U9_BH3@eD5DYjW#wJ4oY3+v%2q;q0G@n&;c_ zwufnmwTV9+YiHFn9~n)XR^#mG?1!3Oo3I?_8*f*}x~LWJIBF>kO|_#q7S)2OI1zWF zrf;}P zFJhAYUf71&h?`Hg$8|(4VEtS?0`)*sQNOV4L~g)mj*-y^!WC?ScTp=?g(+?U!8eH4 zqZjkNX~#$vXCn-tJP~_fFFc0FQ5Tvu)#LxO-BQ#TYdg*3|Cf*Hm|LA(Zo2KGI#_`U zNvIZBh+Xj`ERTUR?1x4TY(zXBwO$;GzOJ{R7P5Wl#VZ(!&oCbroMm55QJADb zR)fr9T#5Qlul1J4+{EShF^-+>G2OA!9Q#D`QGLD!^?h&yHTv&iX$*baW3JHs z{q49B>cMuRrsYZWrI5KzMqQ9F&n^_5QQrkqup-lLJtpGScbGPe_UQNQH{6Gd?1?># z?Mj$}|Kqrj59|%S!1~11me|=e3N?t+a1FLv%KYy@=IK(8|9`1$w#>fmR-mR?8m408 za{DQ^9@RzHT^z8&-e^rM>0v&jm;Do0di?(*@+urboPU-5dY*||@czN7IBGScUDIvz zYTGvj*4W?WB5@?;YjGMDU2DG+R%0#V@O5@{cSkK)15nd=5^9z#LJi7Qs4m)snr6l?PIt9I|{Fn zIuL70YSU_}?+)Jyoz-o1T>d@ctWv=urlRJvUKDEjm6YuxX&h){Hu|@P z7XOsHLq3%{+BR7HKezL;*AmojZ5D4&k!kV#>Z@GSaPk(tAe0|b>^ zWgU>d{Ylv)7p%wMNM}e`&@PL33P(+E`u9*SOIgFo^OA#9C;y{g3h^q_*T2qSkc1VA8i> z%Dy4UjoS8*ctsc%PybdBeP#JklJIlvOv+6@nF|fIb~nh5CQHt2B-Z?MOAK@EKkq?IxcKwec!2 z6{vd%`{EQ_hyi#E^Psk!){GU^o$X0jtyRqYQ(hVw} zq^yW5KkZI3gt&|UV4lM5JA}L>%~vkg>pOiLN!=Ij*d`QKC4Yjl0P?%k6xuRU*b(cI zYEX6*SCRTrev+i^8;p1L+hP!L4CQ^?e$_cl`r$uuEcNsX&*P5UtV(PNq}J5)eZr2l z1jAf~m*g*z@5|0FakwjQP5Btg^tSv2^`3u^eS64nCFLa6wwkh~#4*?sUy?>rK9hJ2 zsVeCiW!fUu|J?|Z2wIW`lYbKrlC+&B?epjCzXhG-;4-B2Z87--(z_gYj>5_A#68LX zNNUKwN3QHmtU{c=Z6zO_zW#gJ8BI!IZ+CWhNd-x3DBDR{Q(R9+ppQ{)f4lwHa5C{s(hQQmgw9b`7w?fek$h+Q5zGa`+3|)u@LkHvlh1@b z-NhFWk9GSgHouUc%f2<_%VAS2OUmo&_aWbr{A(mVWEoP3JN_0nqkK*VcJ*LK6a|ea zI8C}hoQ-%WsUrFLsBJs0vsn{By~(8cq(PL`Aq^wVCT>B!honlbZYRpLedx|J5Vuga z$zRT`6{nyL6{h;D*&nN+Iu#z`F!ujU%1kOix=eW-?C(t3 zUep#zI_CCmb7lUfdF%@PwfJ$KxSFfbjW|1L32{qOfA(!9UgwVajIx8|hf}8Q2=Qlb zUj(r}+qE?yjdS_YZhuC~)HSB0+wn2^W2D`r<)rhZCT<^DGlcwCF3!M7`ut~KHTG8~ zO(K0y`jC{qWpnk4I`_IA)7AfLDg2U?1!4^T<#vW*W8z|zzlMX|!P>ou{8M}bH?U7z zfAUL7ktA&&;HRW_*uRW;ElzWF?_db~JpBG)_WP^bAEPMzj-A&@Pe}EMwH?Lw_=MD+ zd~Nn=JB15eoezljx$?f`gDC%txPvQG{ZvvSahfZ;sQ3S6Qfbnsq+IS~T~(Vcg0fIj z`gX|eFGSfy@@?@?c9tjKoctzN@dO?wPQz9>o}?`aXHhqZ{72~T{|sbaVMkZ2iHYp| z!yWJeW~5x(&!qdrfusZE-=cgHX(aKRSekT?ytXb*yxgK=8{HJ-iq>Vq%Tx~?J+4I zYc?Om<(W9>h^w%evZ2K7@tG^zM1B_eDU|2OhNL3owGDCS zc%Qg6>0iqJp)9*A_xJxzf`+6_qyefxDoXl@RGV~w1Ak}Vx8$`=BCl;5Ubk8Q&oJUb zp@vX@>5AETt!2WlGN&Rg{vSb~Ufcix diff --git a/languages/rocket-pt_BR.mo b/languages/rocket-pt_BR.mo index 3f10bcd2ab947618da8bb00fcff9652c8e01b002..f40d7cd72d6acf88050dae1b71a95d1de9b8e095 100644 GIT binary patch delta 13266 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 A$N&HU diff --git a/languages/rocket-pt_PT.mo b/languages/rocket-pt_PT.mo index 7a3b736d5cf81afc518e38f8cb5269140771ec85..8d3713548805687f42a063964eb3b70ba20e03e3 100644 GIT binary patch delta 15806 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 Fe*mCs+`9k( delta 18499 zcmZYG2YgNU|HtujNFw&$>&Bk3_YARxh`rq`LYCab=GwKDAW9WQtEJisLU+v$ZPB4s zs*9@DYO7i;{;&7>p8WnEzu$TEo9FlQJ?neE>)e~@y&r;h{~hH2rbNJci!EPX%c_Kf z%2`(a0Lxm@Sf!TrN@vUZ7+=LwI5*6)9^!h;!gXCN>nUu|)v_Y-B;Lca;Up~D&9b

t$KPaV+Y>N3a5( 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 XH+r#??4Nt}MQ4J4Zq&=pz_9-TAo1mZ diff --git a/languages/rocket-ru.mo b/languages/rocket-ru.mo index 39fdb9b7a3c233aa1448dcd2d0dd64ec9a2585c1..c3b11eca519e6f24cafa48efc1d4f363d21eba5d 100644 GIT binary patch delta 100 zcmbQrv58}Xh$sUP=zs_y0MRTg3=FyxO@lQ8{6ln|i&7IyGV}9vT@p)DtrUz53@vpH vEOd>`6bucm3{7+mObiSr+cRoU?26&>Nz6+xO-u(WD=MA%G-h)d<9sFn_AD60 delta 69 zcmdnQF_mM2h$1rs1A`6_gMbAP-v$a;0%=B&00>Of44!y4Zn6bq^u%SFTzToGiRr0U N3Pq)xCo(Q%0swzT4we7_ diff --git a/languages/rocket-ru_RU.mo b/languages/rocket-ru_RU.mo index c78d33053d29c3af1b59834c6ac911dccc5d9eec..9364197e8339075757d98eda0b1c6dd43659046a 100644 GIT binary patch delta 10222 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 delta 13561 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 Ttrj(6R8s49duFXKb>aU2FBv?$ diff --git a/languages/rocket-sr.mo b/languages/rocket-sr.mo index 498d93781024cdc730c819212b7f84060fe4a71e..c0e6c38b88aba8d167c51969ffe3984314488fce 100644 GIT binary patch delta 1459 zcmXZcO-R&17{~F6)Ll*6t+dRS+*UU<+uZdfO-e8`p(Hh=Kn2}YO!I|Y6{5o?^kN62 z5`)Mvs*4q9NYtU1gO>z52u6p{QyN{ef+!)Q?+^d7{690ZGyi#>XJ);2;9J3s*pT6` zJzUQ*AIrs*(@Fyyuf9OC5ySp(3U3kc{5qHqPgdTi|3TPU4;%7|62%^?{ zx1IbIQ7Hq;e~@ROL1?YIkv zQAhF$2|Q#z($Ge~kdImAp$(&`cPgf$N>+w?aU(8M^ETAH8q!t9K_1)jGHSz7Bo^}y zRhc=|9a=!`vy92?Z~oFCX_G+xm5B$nFb`GYVywkV)LB181w4TY;3f9pEGpw89IOJV z!)@4y$MHJm<2)+BI4*=ozrP|H`l1O{q7f{`DRf~ZZ_UHqs0uV7$(t5bpuL!d{nq$1 z%eSZszDEV}1C>zZ*0pu<7z$g*Z<~hBG=o_><1A#zl%pYI{SN;uTht6 z9<^=>Rq|ETd>dt=IL3kcKjKEsFN>%CRNquGpffp*b=YM&W0^rcweSk^PV)piaS9bk zHaAKyJb`<#7WI1{KqdAVRf!4I9hk$jxR}tewy=sD#$Kid^Du~h978_l6A!)MH)^9q z%A``Jp%TbJ9YrasQdOvV%}JAcZ58(P%8F`lNq2Lgr?soodpOY3TWp^ qF2BFfpX>GI`g}w6&di~Z<7#wyptGen(89c6_fWXAZt}J>81o-Q1dz}G delta 1872 zcmXxlOKcTY7{Kw5KAJ7t?l3fI zXb2ECgs>2ZiAj~jgr;gL3kbx74J0g75(oj=m_i5<{r}tP$^GUxGt8NDzVDnVPil_N zZ5xsOEF$*gbD(7gMZAhtI27w}Jg&pZ*n)+43i-u34h48Ix!-|fx$eYbyp1WmkAtxX z9clobns87-WFwc84cr)rAE5(o$C>yw+VL_vp$fXlHAo6!li z;w1bQ$Kf@!|NX*j-;4^2`Z5`U{9<%+U5a^JPen7T!eO`|xo$!e_!xO-Y{OREizf5} zM`I3IjKFc|1Tr`r8?u~GmDqxoekVG>SIPZW9Le-2VYB?G?0Q*U=)?y{sJFo<^ZJb!r?{F7(BEP60T_-jh&0rqd;RAFHTW}&CLi?Y_Pw@hp z`EX|E#K&RZ;(4`nms z6!jc~X>`C^qzJJMt;~LO4;@0s`3A=`ew^flWr`osOnyc?{*H_tcX1;=Lf3j33+aUG z(Fv@=0iSc01|jpuPT{)SfI z1ybe6;q6XzC{D)`^nOF)hiCt4Hz1;m6W6qxbX?4pL#17Hs z#BQ|XBsKzbjitB`H=`4|fxhr>oQhA;@4b|4Ol%2SiF$Mo?8n`BxPyUTFm*@+Qqt9PPOWB1ca1$-*A84f>qtE%*hywREm!`kX<;2f$g6m(F++B_< z31?_~n=o5jeILEqv9Dr9a!tWv22oBhX1qtdOR$xqfv~F8gd04USW4LZ1Z|GrTOzf& zk!lFDx0!{RttF-rwkCo?#X90mVhT|~SV7Bfo7YG0aVE#wQ-*UNz{moC% zO*D&GKv;G+&tk%_;(cNcVOvG`#q_tvL=LfxNE2?%)x;v=EvM~&1a2-{ y9g#=4wti~vUfcZW*p_qm79^E}`8zBligx1#U_9P<6Q7lYJ6G%$?o z*oFmc!LnUfv6K1~(|CbS{6Y70dGRlT2 z?7|Gn!E)G&RSe(>O7IoR`dfSc9#!gB9L5inbsC!vVZV#}cQ7!Sxa8+7O5h7AA#9?F zes+@+uc2(5v1<$EhWogL$4HEFhjM`iO8z5CXPjYCYO`ZALA3uUh%sk(Fazp|rc1tlg+P J^%d>h^#?x|KePY< delta 738 zcmX}qJ1j#{9LMpay`>)YYU@#@O-Q6HI!S6JsR=O{NH9nz3{?}ktHB^TR@g|4?LcCy zMA#&3s)^`i5re^F@cq^0g3_5diA9bd`-$R*^NA)JU?O*F-qFXCt omABRuLawwcTej@%s%JiXX2pDKsmyX}B@s<;F3wIAt~@#G2hlM=D*ylh diff --git a/languages/rocket-tr_TR.mo b/languages/rocket-tr_TR.mo index 7ed6ea4fe3f54afaf62a001b12168afd61d24790..033a550a9aa51bce39fe5bf37182db0df605b46d 100644 GIT binary patch delta 15774 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 delta 18603 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 F{{vgE_~QTo diff --git a/languages/rocket-uk.mo b/languages/rocket-uk.mo index 569b4c41ebda7d4a111a68fb7e492bfc1ca2fe49..a74b8aa9a6f8a9b55abf1a3c449dd46d7438cd30 100644 GIT binary patch delta 7803 zcmXZh30##`8prW-Nf8A>1Qh`VL=Y4dFw_JW97(Ww?J@f)YLK; zG&QSn-?^&L++QaJlq(E&4F7pt zOaE^T#=nT4VAa~jtj53yW4d4|j={(H66Qx56M`o(6o162_!ytV$x+7i#rH551MAQx z4#$=_t&VX_dkP1rXoB9+#-w8l%*0o*6COc5;9u9c-=B?oeHE&~AFu}A_UIF1<4BxF zeKUL)KfqZyIM$d~@RwNTuMzjGXUv;;4x8inIAfT+*@+o=1}k8dc>aeW7=-ay6I-A% zmy2PThf3-K)cf8+WoSP#Mspqm@R38IB85uzZ3n>^NF0upv7x6v9es#1(I2x>sqceY ziV3K8K1X%*E$aEZsP}s{umcIiUBoe{2|8a>@TG9iqbq^*5LZUkkHv;qfaP%qYDRmo zE1vMgH4|+H5>ZRh2EWH%_zX6s5kE{r#aT!u9n+D5M*eqH2Sd>xM`1ObhU;+|dSl~8 z#{3PNqf%Uejd2Y|;ujc>zoRDLpJX!{ifP0NNXKRv2GGBmLZK2B3sEU8K{c=gmC947 zO?DNl;6r4;nu^J`!vv4nSe^QORBGoU`^~(Keeo0y#rPE4ZV^V&zu8Vfo8}Cv;cKWA zS7ur*F$$++f9!~ta1%Co)(+@P>_S|I+Juc$ZG9F-5Wj>vT~ja+cX{fMqoWtfC}`$2 z37DKoLCs(gHpN-k0{0`!X&&MPjOE3dxCX0Z?PhlAQt?INOw^LDL@n`J)F$4H%H*zQ zT7L@1sAz}&+!~xT(-X_#Ow`iM^H_vxU=6B)O{in}A?o?Vs7>a>8P@aFurh{X4~#=j zxG6wo;+^K?zZ!+To;RLBrR;l5z{kktW#ZX6+H4(A4-Uu6I2Av|-s#4)#u(D1Obo%Q zI2}W=5Nl#72H?jY&pQ-!9Ij#^{)QURt1P@aDnyR3*@znXY1HfYa0vRgvU_DLD#i2A z-63iqrKk>%V{JT(n$Yj4%sD}=?UfsbsZ{htPL6pE)!<>&8lFVmTxU?5><)4wjZX#} z5u2iR`yga{n1whHkK)T1-G&XUdi*jxRA2*`<+l`g+l0!ia-tg$v-KI1I^*|kb7L!o}9DiqwkLOm)%$d}&O8a2XfR6`>$1jk_mT;g#rYJfjs z68gVncYiC?^RrQzT94YayHM?S=GIX=eXs}pn*|hfj4oj;{)AlX#<#a!qqf+DxCiPu zEx|r`0SDo;1nqDY4#YBKgPZ5M=7wW2YJh)XC^qcNKEZa_k^apx3d+D`9Dx=3*^!P# zrQY$xYmt9PaVxcZMp|I9m7e(3VZ{f!(?u;S8ycubn$755yYu97LGko0~oz4>h_&U_gx1xgwQJXTIbz`Y6fp$GVaIrcmpe8(~U+ z238+!Kj&AXH}O7<#iOWA_zNn7ju#81T^ox!uM4pzu0!q)vllf(|1tKWs)^-U(?;lv zsceXJUe6e3Z?*!ABQ8aCcn;O!pV$SfkGGp|D6+>Kvy8%2Uf6{bF<}CqeE1g5!unJ; z#~rBD{)%<*HU?wRBzw2VVGZJR)Sl^%emDlTrwULrUWrL~0K>FMHz;U^K9g;#f^c~` zMvZ!4*EFtLW_k`E5~mmNk&LN4dmg_-_XK9xfhEke8R(3cczrVJ)Z{XoU3dy0enST=Hr9;%orUuL}M&o#7ywSVw>tKOYF_~ z1S5DpZmIo3lZBeVG<=E^UZafzD!fiQFu9O3k2mo)?k}>xTuPVOPsK{b_5zAWrFJ4J z)w8iNuE!WWhxPFhCSy#AJ$AX+h`10_@MsD7&!TXLirSdI+@6NsScNzrwTT?8f$yL{ z9>!oijZs*J30Q6gA2gVZf%p+>^PR^4yp7u2I)i#XbS3#uBXy0aP)8$I*%>TDy>TzT zk7rTGZvJX}MHiz6_yn~X1Kwc6VhSq$8r9w(*c2oG!QDYWJ@FahJ8SHP^uVE@it=l1 zgB4LT3`K8@N2NFk)o?bpq@h=^D)G*B_8Zc1OeF5~roGUnVH4sDs8su}w;9Ypweu3b zh|V+$O8w`k7jB_WL*NGcp%jjFi8E2J4@YHU2`a^_P&3?yTI(`wg~1!`bKNnXcnYTB zTX+mFTOG53ys3jhZ`*G=3s4On!VY*3t6|0_eidOZ-odlD06%$$8M^pf-)xs|))r&P zve|;#jG0^QfJb0D@kAVfdoV`lzxFn}R+%_}7e-%%di_J9JCG1K(>+DiuE!3kWKYuRD1KWA#Olr z=nK?^|`e!Mi93}`g6=s3c5Ly$DrTq~39Ip`joVDlq2KFb8|H^i}2sQ9Gu>g-@EVd?{vvDXYzK-tmU-i7*EX`0U zYm3@6qfrelL=CVMgYh6LQ(t0NGI9&65x2fzzlh|ZW;_C)#igi}A4j!!6E&fLZ`jNZ zg%>EOgF;-58&I1n?OQvbd|XVt0xQ#Do$qW1Nf&J@yI}~gkMqP!umSOQ)P%mlRMg*N z*{`MvY6ADs=}sZ&2m3vK7)~Mn88yQGm+XTp@de`3SPO$M+wTV{sN)&^ANv`Sjh%?| za1eVYR&p-3A$fl{c|Wxr6LH=qDK5PCZPXMHnnM}ly=1dI35%6 zYmCNnSM4{YI8=L&J$Cz}z@t8~ronK0~4oa%{-Q1?YCM&e!!!*8)6-g784r%?Ag|4f4YFdM7h zu;;cvCJ|3Ut??Gr(j3FS_z?SH?oIpe0RO~6#DTZ$-;yR^8{+RU0c-u2jJo*of)T_{ z|J(LYBr|Y36?d^bZus5aV4G2U;#btj2ma6g{jLC45Py&Fyhoa47C(bFdb9=>n4jlb;D)UQ@v55#U>j2?@qzs>KfSe)hOa{tELiVcZ>#{n40Wgur^H~a~!V>5r3`=aWM zF~oyW6Iz7Y)T07i?qghp&IBrUQpm@cDlW4POE4H)1==@u$122Q@l~9SIrs#JV~?sX z_wR=zSc`ZnUjo$eYOH`qa1Wk9ZNjO+F82kuCD`Q{_K&$pg*rUL)~th9urqpBw;ko6 zcKZ&TiGJiagp|I9m54VJMB#h56wl!|IIyP6FeZ~0>T;i&POO)fcrNz9k}$`P>^l*^2!{$Y&EeGG@iy4>G} zKf^TY{pzt7FblQx;~feeDcr?Im=Wi4|Ck(u6Nzu)JRBTv2XGym6X(}wX1Eo#<_FOS zzrsNL9<_OIp_c9uDnq{PM7^Gf^)b2?g=7jNP!FuZ0NjE~)!qiKJx}Z9^@{7#xqIT@ z#=bmY{P5BFiJ1e&zuY`BB`GB-F)2AQIW;o5N%N$X2E<9l{bn~P9yM!qK*s_3LnjOv X%KIja?AIfsxcuxsdsfe`_}>2k`_-=u delta 10344 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 diff --git a/languages/rocket-uk_UA.mo b/languages/rocket-uk_UA.mo index 569b4c41ebda7d4a111a68fb7e492bfc1ca2fe49..a74b8aa9a6f8a9b55abf1a3c449dd46d7438cd30 100644 GIT binary patch delta 7803 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 X%KIja?AIfsxcuxsdsfe`_}>2k`_-=u delta 10344 zcmZA62YilK|Htujlf+2ukRXvrtPm@<*n7l?y<<~*)T(exjG8UA_iAhJQB-2pNU0jt z3R*2swW@S#sXjcP?{zM(SN{L&<>!5V=UV4F=UnH$lbrv`XVW8}g@N9rOvd~hYV20Z zm_SM%e2E2cCFYMZrY-Kl(P&B=(-p>GFkZq!_&rWWQ^uGYkchqTFm}fL(Z=M(;aCT! zMH{baLE!`yRWW;6V`^c2Y=l#>HJ(A8khh$1j*my}UxT{fcNm0!x(1ZDc`;0+z83Dr zqnM0?D;P5hA64+$7Wb%V%z7$rVojVFV@we|fc5bjX2HNp#^lBj%!g&MAl66qTz4#t zqfnhXAM@dMR1c+MF-*r?_|i)u8-<*e?G1u44|zD|z!H)pCDEL!&?&`}p^e4}QsvnQ^s!2v)+=uz_BaFw3 zZXR0A_CQ6{P&C0i*b6gbY;|J-ur4Z(LweF{+EP%<`=D+x6xHI;L%23&@ISdE$0 z5bL12I2q|gvjM~L3k<=hs0YZ)c&bN>U@TTZ4dF1%#r@3`3fZYxfWf!|b%A|Y2rr{1 z*+bNc|6&B@;A-Jm!8INWkdHxi?HnwQTd@~j#z9!Nmc8y$EXw`OUJ8Zr8tTGNP+gp- zww?9GaSC~VjKh2Q0hX_08*~HPl0U#etX9|7$6*+GPh^zL6jVuMO|P6>H^zPujMh+`KM8nETEA+zaZ)@D1sd^ z8cSj_swcKL^4dvu+&%CbhOy&Yj7HO#F@mxfifvFQ4#&Ib#WYN4VoW`ZYHE982x`tG zq2|yMEQoth?|qtUx|c#`DjwoOe2kj)Q=8cvEkRaQ^C6bRtEm0YaUka6u{Br5V>XNk+E(El6 zmU|P6#mNVu=F|f0i=W^CEXg?cRz3E_C)iEze_ShLj!>}$Ct&Z^cGllST_~uHG5xSL za!<1#7vO(UT|BR?T^H7&dg24jg-2b}P?I|yHH5#T8lF2|$1(nODd>PUs0$88Ehv-m zGu(sBD>H>Dtp=UK?D!0GW9Ig@M*=Y`c@*k(j=_A`8g+bM^vB_-uAhXRxW7rFKyR3v z*dL2`uq~a7YS>mBg{M$+Acm=|*RmUGXx>9LWCg0B+b{?pqk7D@lYOwZn1{R{ssZEB ztCmio5P&N&Cw}N2aLBDsLEYd}T!*(&PxMx2J4a@s@^>*Gu0r+XZq%$lh57L|s_TD4 z9UtC>{!gG#ri(pb9;!hbQ9Y7^^Dui?+Y`%B4cUY0>XWD^N<-%csImVI3!sM?HWq_X z4V#Z)xB;u+$!_$2G=;yY&s4e!;#T5akvsU zAZ<4_nd<6^#pv`b>VAhX2j25i&;@^W_3LH3Gz4`*39O7&Pz@Y{dcq_ego{wG<#UY0 zB6O$Lg$AhCZX4p&GChb^T3P2oGYM-v7@jXjX@?TIj$=s20YfE;IszaRREV z7rGutHSkBQfO-4b+20U#{@bXYdLP%}LDcoz^NQ&@y|JU-|M?X38r{PZ_#?(*F8WVn z)Do*=SJdmY5E))`8@Z;bPJcJYHAq{`18jxO8J{#+!EDC4m@CZOK`6=OMySKnNwA{$1%X-}wx{^X5NW7!t<1naOOreX{H6?Nm- zarV3>s4nh|YCr;N65hpd`~{a|?(z0**y^RA79YcE_?fHk1pCCbu`%_DI0sLo8WuOv zUbqW3B_E7T2eTKaVWCO(bAB~yh*MB=;1ksA_XyR4Uca~OtSya!R4l-PxCuMranuv$ zoopAXQ1oR?E1^HuNVMM{8Z!~1IW8GX;U3ftZ(<>Qg>A9WR6F^GVyHT483nFo4k8b4 z^ds3U+=9tiZkqj(Y#*v?f5r&>6V>3LB)hgpV-R^g)ST&p0XPnWF&Xv5tFZ!}z``1& zUn%Gb1Gt;IDhP-9u#}=sm`7^{d3Yjxrv0;7R4_N=aRU#b9$?;F+psM2Y!8&iZ>VpN z%tI41-~QtN5OW7w}hHy4wEa zGHZ?fRQw*}sP|cGyEY!x)xEG1PR8Q62TS7()Z3!rdNc^rx{xOyG^-;Ba#DvDsx zdiyq1#oXl0u>^KQjcpR<#FePA--<;s1*7pU(m5tzgMGc$p(fv6)N6PVHMwu2&VRbW z%ezb0W#4FT)MS%=g5jtG7vn+Pg?jD!ZnjJG2vh^pF#>-={+S$14CVV!4gUhG;R{^F zeJXumzwTfD&@M>Vyc9BXz_+Li{s;AhPtgy3w%9KAM_srS*5N`eQR~Lst@azzS}aQ* zwaqSQov|wUepFXKMD<|Ec6*)5*pA%WnS#20ySpO|vy=afCGl@8hG9GGiH%S_F$nYE zSkx2FM2&R{*2P~?=at`SCu0YUC7+6?@R-$W5_j1H>+H7Qbo!w#xB^?^70izzd-%eM zG581WLf%BPaW8fBNa=lc=z8vFVo^UGH5tPW*akPoTIBIK1mD5pdjFqOD4_!x=sws4 z8{k%Kg^y5OSmTggT8H6q^2b;QyB}s^;VOKA13$7o*Y}8Bc;+HiW;5p0@ki~@4Z(ce z-%O#Pu3Ch8!o#=_D;~2AIgOeNz8~8;5`dB9p_moxV_|H8fjAK995dOiFLT`9uqg&p z-wl~AW-NL&2|`lrdpQz|lCQ@wJcYIKI~;~#sdm!L$5P~XF&eX;;1y;Fs-PAopHsX! z)CZro54IC^-K%c?2kQLbGxUEbh5Bdgb&jh_NeRi#d4U4>Y*K|2Aw=l|7#5IxfMk(*dHz%VsGlNqIxJM&7L?D z1ISmQCg&E^-1q|IR z!7s=?SL}gb;t29SS7|+7!I_wNjbWjuGF`Vl6~Re*!Z<9cLhpSF zu@r)C*oCG&YR4#47rl>t@fX0A%$__#En|8fei}|VFih-DlS@AkX;2qaj zsJRu9?%dC78c@hhMFK9tQMd_xZ}9^sZpErN_O|^H*^c+g?_(`If5#4$&)4?G15gcr z3#Z~5EP;i;v7fRHQ29A@-v7rG^j_w>Yr8B03zD}$U8p~*fwNFgwj4unC&tqwX{aYJ z{2kZ8il`@UjFoXPs>|16QM`b9pr5e0mqO8d_69?7C3zxhQWfAaHHOV`9*)Kw9)9zI zx`F@qwkykFFnMb?AB1Jd-$tE(0IT3_Jb`&0*ax_Z-VRhep)ds-{=jb~@D!?ru|L`q z$6yoktr&{G;IEkDp`COuu?TsopX{&eo1#|8W!Rkt`#fU4koW%C_E6!+b_mKp=Kb%) zj!sml>vo}9dDhub>UC35`XnAdmgaep_va8sq6$71v-dyp9PN^SAvw zz1e9Q+jWHnu=NyoSXv9oOJX)U03a=W)9JD%K(Y z9W`_nvv~Lh#rTh<(1?mzm=iA|Z=kt_{+N>0<4nplTuc5Nw#Rp~(J;F5J~knLmEGg~ z#iI#776nls8Q^h#1ry6VTZViiX7S-iyqvZnH}ZN+Dei9q`OK_=wXuCBe$#=A$S*Qb zC9r1!kMlF$4Ai8#gnjUZYftW`2A#kHm@nAlEL5ejIC)*v0}Vh;>ShH!&TBjjz2m5u zOJM|>LLRdnMq;2+9#8LkdDJX#g>PXm?1bs~23831I6ptELLJ{J)ZX|_%tF2j58x)$ zB9+$+~dsl*_cHB1M)EDjiMgs%W86j z$5~nz-~#sV!JAk+k}>AE0>wPeTN72>4smbn$o`SVy|yK1snBG3hPptx5+3JM>Nu)F zcQ6@WVIfQ|>2VgOwfHDAiwjm_Y}Yf;BiVnwyvKPB8&>c*--fqfEcHL2mgdNcbUn85 zQi!AQIhMx|zRFI&;^WaCQ$(x26x*J#& zAGrIoR`EC=O5Q>gDzc+7>VyfH3#X&rhQ&w^noo%QgtnE$6)O8Unf>h0Jm^i()6Vu8 z|9?SrB~QooxE?jpwY?x#suP?ai`aRJ3e9#FF2m=Gxj@h<<}5D9jfA$DM7RoU@49s= z*CR%_xh7e4qAvN{#8AprkR7v(evpHh)=(+uB8e8mC07|yq!YN+K_o8A<4 z>1OJ>6D)wv`mheQwV*DAU_o>?P4NBXueU@BSIJjkkR}03vROfeRxNE6h}`Z8A(S;C zwIpjxAQlrt*xyeTZ0{2b-Q$%ioS8@^ex~jY-p9*CuzO4k{FM40gtk8{&M!4SrmhxQ<^sc%PgSHk_B%|k^l;ttsn;ta8!{3yPUT7$yMWrl zu?O;bYK`cNDbx?I7lJ!c*)ap0d+{(nz*Oz0{1-eY5-Drj zi@R_n^5w|cPGNmYzY*))x~h~*QBETC)oqdHe|>jnODZZ8oyp&F>xSb^Vi@(>#=7-Y zD379C8cS&hTM6>=?tWXtPgdj~xpmX2JWlx?{11_pSn7J5BM4}OSc8z~$k|x9yRbV91g>pgs z8dESQp|4Vd32k3e&zBr$+h8$k$yaDm+}8`qD_YLwvji;kPo9=$2nTRmgD{3 zLXw#n#EyDIQOehd{*<+KusHv}LtQ?i7+Du0(mf^wClU$7L-+XdSb^LJ7h^lOUi2o< zPt@f8&iA<2`^vh7hV0bV%3_jmGw~kvt%%da03zPqFXoV+!`8%y#Ax#C_=M<6Y$6{@ zG$USbS{Ix@jmeHgIy);9qbSc)C0m-sOrriCoaIT&G2zU6FSyEaD0;g{{I0a-i`PG diff --git a/languages/rocket-zh_CN.mo b/languages/rocket-zh_CN.mo index 3be5f0a5f351f30469698a07f3e73ebf96b45e4c..f83df0771921a4a130f624e7d7bf3ff7d32ed2db 100644 GIT binary patch delta 12457 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 LuiXiEF2D2t*Y6ko delta 16575 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 diff --git a/languages/rocket-zh_TW.mo b/languages/rocket-zh_TW.mo index adc629746ec1be964773ab46d3b6bc58850e6479..e933ba903409d84ccaf1bae52992b4fc1fa674ca 100644 GIT binary patch delta 5190 zcmXZe3wY1h9mnyLB9e&wg^);ygdh>oC=!XvMbuO!B9e)X@^2GqnTQB=|GQ5t#u{^} zwRH(?S8HizI>zehsuwzJna6|9EV>6Zmrbk`-TRYs`lNZCbAIP{&i8!JIltKX*l+zE zzYSqN!+$qA=(jZt|4scdK0#$G`gJrWAGhHwynz$&`A+u+Q`=IJCBR^)5 zbE9)FE~5QU;l^j)qmUh8%yPVq6*#-IG3j^(TVuCKW7=VFq{$3M1zLbnScYA31!^rj zkRNk^UvYREJ=lbS*ov1lt|yB1hf)Zqp)Dr32dNl9JrhH4Bodn$k6L*JYM?Jr6E&dT zzlG}m2o*?h7i0Ee3`XM_Y=gI*4}BC$Xb2$uemDbL;jd5w?8LG7JG_VijM4(X#$deW z>i19?dVmV7O*cDEM^r#j$gY__=#N>*kjD1|3IiyVVhnCYMR*96nd7K|&!JLy4TJDL zDkCjpjA0F?D=HJ|sQyLR9j78crrP;y3KwTHh%^{+=Q;1ksKyNJ3iw@_Ob$l$Uww!j4R=};t5 z&;U88dJ!ts(@`t-q4u^KH9;LdiHETjeuGN!9ef4jS-!StJHCjQa2@6(*u!@Q709^+ z@~=a5l?Lh8$3`BBI+RJ6gI)~6-Kf;Xos~K!kAn8dlVnq$fcg$(q6R3((KsJ}hR0DWDWH=ApN`7FB2<8@P+PbemEzx^ zw(JPb#s*XXBiTPLhVf0L5Uc{u!y428t&;6ZqmZPS9=H|9U@>095FFOu9?G%UmiiLZ z`!%SQ??m<6iv#g6Dxlj~#+aRko6cK8QWroKeYa~4B&{~IajbT^?=-HtFh$Yv6%<0{mPuc9)s&G{)R zfd8V-PS-&;U@v;8FTpqP=cxCRxFSV30hOuuF-7t*)XD?@erv_fZQC9%{Fu29<%=_5CGi^R9bv z1=~<>!fxot=$sQ1i=%KHYT!3eD|rVs@P1Uv`)Aq-vyr5kLgbOD!D>8#>Q|J-KTfbT z%f}xU3a4mLO7gR9s>h=aWhH7$Hendv$Icis%Fq6OFk zYf)$DAV%R;RKP7q*aiDM6n3@XPGTn>9O5K4;u&0k2gtilZSr&W-+rr6^>1-H=5fN5 z(nHAkHD92{@#6$5un6ZMX92FHeI{yT;$iF&%M?*)9`Jqi+in9Q9 zipxJy8#{}eXTpaA~k z44A;jhI%w=ODa(V&v&js9jbN6$IZNsDR>^Wm7zbfTa|`-e<-T|a8!m1onD_Sl%o#K zLRa66N>v@|8XZKXvH>IT9wwmY$2OH|7)iYtbz5em7PK5S;TGp^=Le|%zCTh>Wam*6 zUUwZHp&}2OXa@+zDC*JJ7t>MC%TOyW$CWUb4&71I8TcHPfeWaC?xHf`H`!()5!F5lwPoW`EA`@RT!aeb zHU{bb|BnJ6IrGF6J3%fg^2x5gA9cMxMn06L0hOt9sENKo4fw6AfA0+T+UK27{d=Jn zn&#?xlKG97g7&Hkb%@rw4#zN)dIL_yuovuYScuxPH&H8mA2smroqtA6*oe(%1z(}= zdC@N9r>L#mfVMfsA&bHz%*71;rV^Z~!2x&|wc>c*RtmFm6jop# zJdE-9FAPS{44aWIIE;D*>eehnEuW^ARe=mryGVudoy3qQ)ykWx|Uiu?jtS#Q7zrF~9kWLI)m%&$2Hjq9z)Q%0MA% zC2LRvoWKygfOGLWHcwP(Pj?lj)4mE5@guCp8>qnM@)01}W(CgC{l7^;sVS+lE1Qlw zglmz5YU*4)XpTKxahOf}5L6(GQ6HEZ?2T_>PdtU%nkLj1MicE6OhpB<1sCf6@20RC zW4RNG{B2Y~jo1mVV*vWiv;QUx!Zy^~V>^sS?dg;5c^c}yY*Z$T-SaBv64dx>u>S4H z`A-Grk10&bsVwzY)rRDC3hbZWe_&Gbz~toGR(XlFJ#wo(qrK&2bG&7x=`jmlnp`-( O_TAix^_h8%$^Qq{>3Vhm delta 6900 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\n" -"Language-Team: LANGUAGE \n" +"Project-Id-Version: WP Rocket 3.17.0.1-alpha1\n" +"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" +"Last-Translator: WP Media (http://wp-rocket.me/)\n" +"Language-Team: WP Media (http://www.transifex.com/projects/p/wp-media/) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" +"POT-Creation-Date: 2024-09-17T14:45:52+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.11.0\n" "X-Domain: rocket\n" #. Plugin Name of the plugin +#: wp-rocket.php msgid "WP Rocket" msgstr "" #. Plugin URI of the plugin +#: wp-rocket.php msgid "https://wp-rocket.me" msgstr "" #. Description of the plugin +#: wp-rocket.php msgid "The best WordPress performance plugin." msgstr "" #. Author of the plugin +#: wp-rocket.php msgid "WP Media" msgstr "" #. Author URI of the plugin +#: wp-rocket.php msgid "https://wp-media.me" msgstr "" @@ -1960,7 +1965,7 @@ msgstr "" #. translators: %1$s: opening strong tag, %2$s: closing strong tag, %3$s: opening a tag, %4$s: opening a tag. #: inc/Engine/Admin/Settings/Page.php:2251 -msgid "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New feature: %3$sLazy Render Content%4$s. Check out our documentation to learn more about it." +msgid "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New feature: %3$sAutomatic Lazy Rendering%4$s. Check out our documentation to learn more about it." msgstr "" #: inc/Engine/Admin/Settings/Settings.php:361 @@ -2083,14 +2088,10 @@ msgid "RocketCDN cache purge successful." msgstr "" #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:137 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/enable.php:72 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerEnableRoute.php:302 msgid "RocketCDN enabled" msgstr "" #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:160 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/disable.php:31 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerDisableRoute.php:147 msgid "RocketCDN disabled" msgstr "" From 787c8eef2bcf101fea049bce2db43f51b72f6068 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Tue, 17 Sep 2024 17:48:21 +0300 Subject: [PATCH 179/192] don't make it draft --- .github/workflows/alpha_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/alpha_release.yml b/.github/workflows/alpha_release.yml index e652543b89..316e236da5 100644 --- a/.github/workflows/alpha_release.yml +++ b/.github/workflows/alpha_release.yml @@ -97,6 +97,6 @@ jobs: - name: Create the tag/release if: ${{ steps.release-version.outputs.group2 != '' }} - run: gh release create v${{ steps.release-version.outputs.group2 }} --draft --prerelease --notes "${{ github.event.pull_request.body }}" --title "${{ steps.release-version.outputs.group2 }}" --target "develop" + run: gh release create v${{ steps.release-version.outputs.group2 }} --prerelease --notes "${{ github.event.pull_request.body }}" --title "${{ steps.release-version.outputs.group2 }}" --target "develop" env: GH_TOKEN: ${{ secrets.GH_WORKFLOW_TOKEN }} From f273a75c083c19c9378c069f5d44f0f670964ebc Mon Sep 17 00:00:00 2001 From: WP Media GitHub Actions Bot Date: Tue, 17 Sep 2024 14:49:53 +0000 Subject: [PATCH 180/192] Prepare transifex before alpha release --- languages/rocket.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket.pot b/languages/rocket.pot index 1ea5c87956..be7d30aeb1 100644 --- a/languages/rocket.pot +++ b/languages/rocket.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-17T14:45:52+00:00\n" +"POT-Creation-Date: 2024-09-17T14:49:48+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: rocket\n" From bf154d28caada7313dcf812ddee45a67f9905dfc Mon Sep 17 00:00:00 2001 From: WP Media GitHub Actions Bot Date: Tue, 17 Sep 2024 14:51:03 +0000 Subject: [PATCH 181/192] Prepare transifex before alpha release --- languages/rocket.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket.pot b/languages/rocket.pot index be7d30aeb1..549bccd4b0 100644 --- a/languages/rocket.pot +++ b/languages/rocket.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-17T14:49:48+00:00\n" +"POT-Creation-Date: 2024-09-17T14:50:58+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: rocket\n" From ac3ec3d0739e161f1259f423144d1809772b1918 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 18:27:21 +0000 Subject: [PATCH 182/192] Translate languages/rocket.pot in tr_TR 100% translated source file: 'languages/rocket.pot' on 'tr_TR'. --- languages/rocket-tr_TR.po | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/languages/rocket-tr_TR.po b/languages/rocket-tr_TR.po index eac7b902f9..21e581f1b7 100644 --- a/languages/rocket-tr_TR.po +++ b/languages/rocket-tr_TR.po @@ -8,9 +8,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.17-alpha4\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" +"Project-Id-Version: WP Rocket 3.17.0.1-alpha1\n" +"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" +"POT-Creation-Date: 2024-09-17T14:50:58+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: BouRock, 2024\n" "Language-Team: Turkish (Turkey) (https://app.transifex.com/wp-media/teams/18133/tr_TR/)\n" @@ -20,25 +20,30 @@ msgstr "" "Language: tr_TR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.11.0\n" #. Plugin Name of the plugin +#: wp-rocket.php msgid "WP Rocket" msgstr "WP Rocket" #. Plugin URI of the plugin +#: wp-rocket.php msgid "https://wp-rocket.me" msgstr "https://wp-rocket.me" #. Description of the plugin +#: wp-rocket.php msgid "The best WordPress performance plugin." msgstr "En iyi WordPress performans eklentisi." #. Author of the plugin +#: wp-rocket.php msgid "WP Media" msgstr "WP Media" #. Author URI of the plugin +#: wp-rocket.php msgid "https://wp-media.me" msgstr "https://wp-media.me" @@ -2519,12 +2524,12 @@ msgstr "API anahtarınızı bulun" #: inc/Engine/Admin/Settings/Page.php:2251 msgid "" "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " -"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " -"more about it." +"feature: %3$sAutomatic Lazy Rendering%4$s. Check out our documentation to " +"learn more about it." msgstr "" -"%1$sWP Rocket:%2$s eklenti 3.17 sürümüne güncellendi. Yeni özellik: %3$sLazy" -" Render İçeriği%4$s. Bu konuda daha fazla bilgi edinmek için belgelerimizi " -"gözden geçirin." +"%1$sWP Rocket:%2$s eklenti 3.17 sürümüne güncellendi. Yeni özellik: " +"%3$sOtomatik Geç İşleme%4$s. Bu konuda daha fazla bilgi edinmek için " +"belgelerimizi gözden geçirin." #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" @@ -2673,14 +2678,10 @@ msgid "RocketCDN cache purge successful." msgstr "RocketCDN önbellek temizleme başarılı." #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:137 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/enable.php:72 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerEnableRoute.php:302 msgid "RocketCDN enabled" msgstr "RocketCDN etkinleştirildi" #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:160 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/disable.php:31 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerDisableRoute.php:147 msgid "RocketCDN disabled" msgstr "RocketCDN etkisizleştirildi" From 7fe286adc0f7f1e564c7a8a16646d34f8e542a43 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 18:30:07 +0000 Subject: [PATCH 183/192] Translate languages/rocket.pot in tr_TR 100% translated source file: 'languages/rocket.pot' on 'tr_TR'. --- languages/rocket-tr_TR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-tr_TR.po b/languages/rocket-tr_TR.po index 21e581f1b7..c948a70d73 100644 --- a/languages/rocket-tr_TR.po +++ b/languages/rocket-tr_TR.po @@ -2825,7 +2825,7 @@ msgstr "Bu eylem Önemli Resimleri ve Geç İşlenmiş İçeriği temizleyecek." #. translators: %1$s = plugin name. #: inc/Engine/Common/PerformanceHints/Admin/Controller.php:135 msgid "%1$s: Critical images and Lazy Render data was cleared!" -msgstr "%1$s: Önemli resimler ve Lazy Render verileri temizlendi!" +msgstr "%1$s: Önemli resimler ve Geç İşleme verileri temizlendi!" #: inc/Engine/Common/PerformanceHints/AJAX/AJAXControllerTrait.php:19 msgid "Script error" From e34732d3712e3b13491e9197b58515300db4a67b Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:39:40 +0000 Subject: [PATCH 184/192] Translate languages/rocket.pot in fr_CA 100% translated source file: 'languages/rocket.pot' on 'fr_CA'. --- languages/rocket-fr_CA.po | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/languages/rocket-fr_CA.po b/languages/rocket-fr_CA.po index a94a3f9cfb..e054846f4c 100644 --- a/languages/rocket-fr_CA.po +++ b/languages/rocket-fr_CA.po @@ -1,16 +1,16 @@ # Copyright (C) 2024 WP Media # This file is distributed under the same license as the WP Rocket plugin. # Translators: -# Romain • WP Rocket , 2019 # Jean-Francois Arseneault , 2024 +# Romain • WP Rocket , 2024 # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.17-alpha4\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" +"Project-Id-Version: WP Rocket 3.17.0.1-alpha1\n" +"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" +"POT-Creation-Date: 2024-09-17T14:50:58+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" -"Last-Translator: Jean-Francois Arseneault , 2024\n" +"Last-Translator: Romain • WP Rocket , 2024\n" "Language-Team: French (Canada) (https://app.transifex.com/wp-media/teams/18133/fr_CA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,25 +18,30 @@ msgstr "" "Language: fr_CA\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.11.0\n" #. Plugin Name of the plugin +#: wp-rocket.php msgid "WP Rocket" msgstr "WP Rocket" #. Plugin URI of the plugin +#: wp-rocket.php msgid "https://wp-rocket.me" msgstr "https://wp-rocket.me" #. Description of the plugin +#: wp-rocket.php msgid "The best WordPress performance plugin." msgstr "La meilleure extension de performance pour WordPress." #. Author of the plugin +#: wp-rocket.php msgid "WP Media" msgstr "WP Media" #. Author URI of the plugin +#: wp-rocket.php msgid "https://wp-media.me" msgstr "https://wp-media.me" @@ -2549,12 +2554,12 @@ msgstr "Trouver votre clé d’API" #: inc/Engine/Admin/Settings/Page.php:2251 msgid "" "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " -"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " -"more about it." +"feature: %3$sAutomatic Lazy Rendering%4$s. Check out our documentation to " +"learn more about it." msgstr "" -"%1$sWP Rocket :%2$s le plugin a été mis à jour vers la version 3.17. " -"Nouvelle fonctionnalité : %3$s Rendu différé automatique %4$s. Consultez " -"notre documentation pour en savoir plus." +"%1$sWP Rocket:%2$sle plugin a été mis à jour vers la version 3.17. Nouvelle " +"fonctionnalité :%3$sRendu automatique différé%4$s. Consultez notre " +"documentation pour en savoir plus." #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" @@ -2703,14 +2708,10 @@ msgid "RocketCDN cache purge successful." msgstr "La purge du cache de RocketCDN a été effectuée avec succès." #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:137 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/enable.php:72 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerEnableRoute.php:302 msgid "RocketCDN enabled" msgstr "RocketCDN activé" #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:160 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/disable.php:31 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerDisableRoute.php:147 msgid "RocketCDN disabled" msgstr "RocketCDN désactivé" From 6253ff1491bca4ca85596e62ca2929423e8725df Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:40:51 +0000 Subject: [PATCH 185/192] Translate languages/rocket.pot in fr_CA 100% translated source file: 'languages/rocket.pot' on 'fr_CA'. --- languages/rocket-fr_CA.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/rocket-fr_CA.po b/languages/rocket-fr_CA.po index e054846f4c..38ca625fa6 100644 --- a/languages/rocket-fr_CA.po +++ b/languages/rocket-fr_CA.po @@ -2558,7 +2558,7 @@ msgid "" "learn more about it." msgstr "" "%1$sWP Rocket:%2$sle plugin a été mis à jour vers la version 3.17. Nouvelle " -"fonctionnalité :%3$sRendu automatique différé%4$s. Consultez notre " +"fonctionnalité :%3$sRendu différé automatique%4$s. Consultez notre " "documentation pour en savoir plus." #: inc/Engine/Admin/Settings/Settings.php:361 From acccee07ba14933b6fba61128c6643a126290416 Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 06:45:16 +0000 Subject: [PATCH 186/192] Translate languages/rocket.pot in fr_FR 100% translated source file: 'languages/rocket.pot' on 'fr_FR'. --- languages/rocket-fr_FR.po | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/languages/rocket-fr_FR.po b/languages/rocket-fr_FR.po index 445940680f..266905763c 100644 --- a/languages/rocket-fr_FR.po +++ b/languages/rocket-fr_FR.po @@ -6,9 +6,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.17-alpha4\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" +"Project-Id-Version: WP Rocket 3.17.0.1-alpha1\n" +"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" +"POT-Creation-Date: 2024-09-17T14:50:58+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Romain • WP Rocket , 2024\n" "Language-Team: French (France) (https://app.transifex.com/wp-media/teams/18133/fr_FR/)\n" @@ -18,25 +18,30 @@ msgstr "" "Language: fr_FR\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.11.0\n" #. Plugin Name of the plugin +#: wp-rocket.php msgid "WP Rocket" msgstr "WP Rocket" #. Plugin URI of the plugin +#: wp-rocket.php msgid "https://wp-rocket.me" msgstr "https://wp-rocket.me" #. Description of the plugin +#: wp-rocket.php msgid "The best WordPress performance plugin." msgstr "La meilleure extension de performance pour WordPress." #. Author of the plugin +#: wp-rocket.php msgid "WP Media" msgstr "WP Media" #. Author URI of the plugin +#: wp-rocket.php msgid "https://wp-media.me" msgstr "https://wp-media.me" @@ -2548,12 +2553,12 @@ msgstr "Trouver votre clé API" #: inc/Engine/Admin/Settings/Page.php:2251 msgid "" "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " -"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " -"more about it." +"feature: %3$sAutomatic Lazy Rendering%4$s. Check out our documentation to " +"learn more about it." msgstr "" -"%1$sWP Rocket :%2$s le plugin a été mis à jour vers la version 3.17. " -"Nouvelle fonctionnalité : %3$s Rendu différé automatique %4$s. Consultez " -"notre documentation pour en savoir plus." +"%1$sWP Rocket :%2$sl'extension a été mise à jour vers la version 3.17. " +"Nouvelle fonctionnalité :%3$sRendu différé automatique%4$s. Consultez notre " +"documentation pour en savoir plus." #: inc/Engine/Admin/Settings/Settings.php:361 msgid "" @@ -2702,14 +2707,10 @@ msgid "RocketCDN cache purge successful." msgstr "Purge du cache de RocketCDN réussie." #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:137 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/enable.php:72 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerEnableRoute.php:302 msgid "RocketCDN enabled" msgstr "RocketCDN activé" #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:160 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/disable.php:31 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerDisableRoute.php:147 msgid "RocketCDN disabled" msgstr "RocketCDN désactivé" From cd773798e5988d8b5eb30cbba92c9bda7f74a1fb Mon Sep 17 00:00:00 2001 From: "transifex-integration[bot]" <43880903+transifex-integration[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 08:34:18 +0000 Subject: [PATCH 187/192] Translate languages/rocket.pot in pt_PT 100% translated source file: 'languages/rocket.pot' on 'pt_PT'. --- languages/rocket-pt_PT.po | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/languages/rocket-pt_PT.po b/languages/rocket-pt_PT.po index 9e1930db42..04d4359e14 100644 --- a/languages/rocket-pt_PT.po +++ b/languages/rocket-pt_PT.po @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.17-alpha4\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-rocket\n" -"POT-Creation-Date: 2024-09-13T17:57:31+00:00\n" +"Project-Id-Version: WP Rocket 3.17.0.1-alpha1\n" +"Report-Msgid-Bugs-To: http://wp-rocket.me/\n" +"POT-Creation-Date: 2024-09-17T14:50:58+00:00\n" "PO-Revision-Date: 2019-08-26 15:14+0000\n" "Last-Translator: Pedro Mendonça , 2024\n" "Language-Team: Portuguese (Portugal) (https://app.transifex.com/wp-media/teams/18133/pt_PT/)\n" @@ -17,25 +17,30 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "X-Domain: rocket\n" -"X-Generator: WP-CLI 2.4.0\n" +"X-Generator: WP-CLI 2.11.0\n" #. Plugin Name of the plugin +#: wp-rocket.php msgid "WP Rocket" msgstr "WP Rocket" #. Plugin URI of the plugin +#: wp-rocket.php msgid "https://wp-rocket.me" msgstr "https://wp-rocket.me" #. Description of the plugin +#: wp-rocket.php msgid "The best WordPress performance plugin." msgstr "O melhor plugin de desempenho para WordPress." #. Author of the plugin +#: wp-rocket.php msgid "WP Media" msgstr "WP Media" #. Author URI of the plugin +#: wp-rocket.php msgid "https://wp-media.me" msgstr "https://wp-media.me" @@ -2535,11 +2540,11 @@ msgstr "Consulte a sua chave de API" #: inc/Engine/Admin/Settings/Page.php:2251 msgid "" "%1$sWP Rocket:%2$s the plugin has been updated to the 3.17 version. New " -"feature: %3$sLazy Render Content%4$s. Check out our documentation to learn " -"more about it." +"feature: %3$sAutomatic Lazy Rendering%4$s. Check out our documentation to " +"learn more about it." msgstr "" -"%1$sWP Rocket:%2$s o plugin foi actualizado para a versão 3.17. Noca " -"funcionalidade: %3$sApresentação diferida de conteúdo%4$s. Consulte a nossa " +"%1$sWP Rocket:%2$s o plugin foi actualizado para a versão 3.17. Nova " +"funcionalidade: %3$sApresentação diferida automática%4$s. Consulte a nossa " "documentação saber mais." #: inc/Engine/Admin/Settings/Settings.php:361 @@ -2687,14 +2692,10 @@ msgid "RocketCDN cache purge successful." msgstr "A cache da RocketCDN foi limpa com sucesso." #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:137 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/enable.php:72 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerEnableRoute.php:302 msgid "RocketCDN enabled" msgstr "RocketCDN activada" #: inc/Engine/CDN/RocketCDN/RESTSubscriber.php:160 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/disable.php:31 -#: tests/Integration/inc/Engine/CDN/RocketCDN/RESTSubscriber/registerDisableRoute.php:147 msgid "RocketCDN disabled" msgstr "RocketCDN desactivada" From 5547941ad6984eff5687e57c09263259a1b44d7b Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Wed, 18 Sep 2024 12:48:14 +0300 Subject: [PATCH 188/192] update the plugin version to 3.17.0.1 --- wp-rocket.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp-rocket.php b/wp-rocket.php index 0353fe4c50..3f18e01191 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.17.0.1-alpha1 + * Version: 3.17.0.1 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.17.0.1-alpha1' ); +define( 'WP_ROCKET_VERSION', '3.17.0.1' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' ); From 1f43168fe7f1fb71a46bafdab9205da198354c80 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Wed, 18 Sep 2024 13:00:41 +0300 Subject: [PATCH 189/192] fix tests --- .../inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php | 2 +- .../inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php index 11346541d1..fb9373a414 100644 --- a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php +++ b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanSaasMenuItem.php @@ -45,7 +45,7 @@ ], 'expected' => [ 'id' => 'clean-saas', - 'title' => 'Clear RUCSS optimizations', + 'title' => 'Clear Used CSS', ], ], ]; diff --git a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php index 873b6ac0ee..1b4e753e68 100644 --- a/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php +++ b/tests/Fixtures/inc/Engine/Saas/Admin/AdminBar/addCleanUrlMenuItem.php @@ -71,7 +71,7 @@ ], 'expected' => [ 'id' => 'clear-saas-url', - 'title' => 'Clear RUCSS optimizations of this URL', + 'title' => 'Clear Used CSS of this URL', ], ], ]; From 6f47d9dce276ce2a136cd0754b030153d6a18d5e Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Wed, 18 Sep 2024 13:08:23 +0300 Subject: [PATCH 190/192] make the version alpha2 to make sure that translations come from transifex into develop --- wp-rocket.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp-rocket.php b/wp-rocket.php index 3f18e01191..080df9c281 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.17.0.1 + * Version: 3.17.0.1-alpha2 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.17.0.1' ); +define( 'WP_ROCKET_VERSION', '3.17.0.1-alpha2' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' ); From 81c2a44a03dcac681947edcd9340dee5903f193d Mon Sep 17 00:00:00 2001 From: WP Media GitHub Actions Bot Date: Wed, 18 Sep 2024 10:10:36 +0000 Subject: [PATCH 191/192] Prepare transifex before alpha release --- languages/rocket-fr_CA.mo | Bin 113125 -> 113091 bytes languages/rocket-fr_FR.mo | Bin 112707 -> 112689 bytes languages/rocket-pt_PT.mo | Bin 111095 -> 111078 bytes languages/rocket-tr_TR.mo | Bin 111675 -> 111661 bytes languages/rocket.pot | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/languages/rocket-fr_CA.mo b/languages/rocket-fr_CA.mo index a8d86b6fb6090c0228409bd9dbf12e850c32ee4f..2201f23df8c2c61dba4f54b45724068b59afdbef 100644 GIT binary patch delta 12513 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 CA%%Yc delta 12508 zcmX}y30PIt`p5CT9l%*|LYx2xP!MqdM-=A)oE7H*6cn65KuS%I1DR8%QC?DUPtz)LRa9%`(f<(*EDydC&8Ip8MR-de_-!ujyTD?}Ht?<9GFr->Z49 zXPe_VhkH2AJ)F?fae{DEFUP5d+1Le_Vj{keZLxB1$MM6SSQC>l9#fH9IGb@Geuw&g z>pu4V*{IJCV?}iPIv#IBmHS%5p+4LD9E@YQFaulQF;qjpVp)vo=Q#cthkn=@AH$xw z7mwn6%%=BC@Fr$sR+3$JImu%ejPLI_nu!az1?LZNoQ_zRVKl%I*bV2P8hir-@LjBq z=dccbkHPp4*2UmKj#D4wurUt9s`x0D$K@Uhy5ZAU4>#a?d;-87mP7q3RoB05ke~b;H}J8~lMmSbCJ>G{U;5h7wRYFc3pA6GLz%YH4?&zV`uY1}|Yn+IMdI zDjr}b;;Jm9MwWzHl5yApXJ7*EzzTQ`YvXNH0~MG?bsz$(VRzJhlCdF9@woy+iFcz% zg)IG&Bx>f)Vtu@fn)-*>50h9g&6MX^3S}r9K_%5OpP!%(jti)UuVV^6 z#7LZ&Vac`({0M*P%|(Bb>BSHfR^DU?f*>_+EcNBE$|T@ z#ICq#rtSBmSc&+I&#%xsBdBfm5Y?f;SvDiBFqpW%FP?(h#*2Nf!_vgtFo5=*?G)DH zLDY!*WLZzgV zIvk7}bD4i-?@cO{?Z2Y-e^8!nujUv8o=MpTjZp z_zwPtPvZ3Xwlw#!8gYfk>;Fc%kH4X=uf|2XPdBWMLr@J*!#218NiXL$JcFT&>|y7*Md1l5T64;@#kcV-yp0|4 zl_kE14F;$lYhbCRcF+W&8Vtp{*a53!GHOOLkvw!RqdGpM!0tB#TWf5O_$qdxE;xV{ z@f<39FX9ON9(96sdfc|_a!eyWikgY=WsWlsdtwN_i#72Q2I2465GylUb+{#FYi|2d zh@j$aY={5FvRG%i^)wVU@+jwpZl#^^El@Y?jQV0PERRF60*>=J6*c8Ks5M`P>da^_y=l9s;}mWhbgG3y@|?^vTOy- zTpcWjQK$~YVlwuAlKIySi>de=_v2Pvw#FKYc*=U(8Ea8L01sjs=3?Eo*0HBh9eM%1 zYmafnm#{h3TxV z9juBKp0#H{9aOR{K{faiHo~`Y3Vw^}*lWGbfaetoTH`md9-c!@*-xk>s`D@FKrGfE z?t&WmFrVqD>mEVA;;cg^(P>&_&w{tH9q}Kify6LPqp^eOaSAC+rQ#=SjmaB$Nx$8Sx=@!XL2}h8NpUxlx#;{l9^NzIYAw zh3HK-b%RhNorIk+594t^Dw}^s&B&j=xbkM3(pnfyeIwNOJ7XOjgf(#*DoGb%CE9nk zQqTzYptAEY_Q&J800Xz!(lkId+zD%APgF9F_qhT!a|f^`UP2vM0bA|+!%?|18@aW! z7(Hqrber8M8k31fqfWqmNTNCiP|4ZvdCS_7IGA`1CgLTZkuTU&at`*R{sLxTqZjSx z_G%nKTzIF*cY!O`Q)_RX*2Z^)*`O; zGSiFE7>Y%x`@iMWf0yl!WYoat?ef@EK0!r&Dz^GQID%S&Q|O1aU$N^#a1?QS%)xb7 z56kSfoC(85#IYETqtG8c7>Q4y?zbOZmyYR!#Z(;HV^iCCuN}d8*g{`KX3g1)>fo?_ zwvT6{cFTEGM=HK*zXukg8vYbDQ-9(Z?Dm?CyclzdkKzLK#O=2!FToB}B$n9ox&TMf z!{0H4`hf>*q_a>XT!l?>A8JJBk$XCqunVp`XgPHbwg3OdJ{bFk&BS9kk@lUJC@7o# z-?Zm?D2^l^jcVvMWR;vRP}?v0E$hhBsD}2TX5to3!mzjP^}PV2h)_oI;@jA58ImFdNli0R~{1!!*r41ioJg)tKc~H;Kd|+q)WmGno`p~vfd8|X+64~lb z60#GWKd=$*_{fs(W7L#Ke{5^t9g~U2p_XPpYM}36O}vO@U6#s2p(2GpPqCg@=8XNp zq39F4!3|u?7rLC~?=^T9)$_;B*<<=GOd-C8{jtxd9Afwk_Qbf)%y~GJ_+4a-PPNZ% zcX+;{prrBpx9#U#3@0weG(3havFR7~3N;%2>F8sqnJM^>JqxyA67es%3FE(H`td6q zhKc7bS2p8F;*YSt@-Xazy`3gtSw85A^YsPH$CJ1WJAY+=!#$22iTiwQIk5z55U)pn ze8p!8Rw6!x4e>+Nb^k-LOtTu>#&e z<;)!{gZFWKDgL^p&zY(5mn>N`E^{B^MYxaaUb}*{@1*|MrYi6|l8Xx#qq4i@RqIG! zRF6|}9nQfM=zoob!ZX+oS6#Qa<6~Ht`^>w+yFT^nf3Sh1|7gDfS70plf1)RnLiGP^ zWTP;QI1l6XMI3^kqdL&!ro|nwfOr+2#DJgdVf7{UBlf#RXK^qNq$B%r9J;^Qz$V`^kW#L56fgPQR@(LchMZi+^*$?hp!WYstb`RgZK`5ztbKy0YgMP3hPAEdf8jpjTER9GC$T*7Mbw&KL(S}6?2q+Glu*pXHn9(6n({6j+;wp(Y6g~~w%J}(hrULg^$$=p6Iag~O2e+iD{&Z}!toeV-v+P%TM=Kv zi5S?x_5M=w%%+e{#YG&61469f?Whr)L#^dq)QuBDUGG0w6k-AKQPei<9p-x9hR5Sp z;zHDt#5S~?>5a>YlTkDEEizLc=LQ8GEPrAsmTzQ97>PrO#~=rVvm0Au)y9_H-BJ6v zFKW9DM>RMR8{%wSkI!IxjA~-LBn_2o%dw&k`(g?iRP4lN7#MCn?u3Jh6Hz_hhDq-zy#WN3MlBrI*#FZ5p@KYZf5ln zs5k*jx%|XNCDoKj*WrQal;8y18D$;xZ*JB^C1WF0PPIX`GYDgGDtiC^Ura&!@paUG zKZ}~mpHOT259(yA6>Ynv4t`7A0d>RLEnM#}o|dTWPQ(~oh?FF<XD{8w& z#@cosi5mGLUwp*pb)NyAI9t08n8k%fsBACS*7g3qemV{%{t7#?_R;NZYBSoq&Nf|- z3D~iNJ;dgr9$xR^2CT=Iw0+;ejp%f8z5mEnjL#5yro_8WF@?WSYg5$O)^smwq$g1$ zID;H|PQ@;k6O9vWZ98E%J|Bg-xB*|pDqUUgUsg*{$=ke}9bkh|xsik9n8$gZg4XnP z)LMUzt?)W7#^COj^&3&!YI6_Q`_}sq)$rk-_5$({dlA3a%W}uBx7{xgl><$Dc0}(k zz$oqisT4xEpb*z$2|kWJ`&j+QsO0$(yW%}x+_A6CKtI$rn}T{g=i?Myh$(m#2Vw7i zuJ_01dQ@&TOLU!=Y2O(_p(Xx>wXu1U-MAMvC7y&zs#W+ZzKOa%v%ft=HlUX30%{js z_IV#uh-(b6`_4giYz>Ct@90sFg9h42Lr@ihpjZRabfnYxML`1c_8zmCR6gKf?GqT+d24!5B8>rT`SPhuQ?iRw`0 zA$H?lIE#2N>cDvy)uD^1rM-UH6Lk5^HEes&w426jpimQNotR> z5oVwcmd&WCJB~Vv&*HOq4MXv<(UzQ>P$S-ry6z}yJDz zIJ3rD&pt(s_!8iWy5CHonbGtPMHPy(u> z$+%See;Ng?VyYXs@j?P%SOsl?Y% z9qK#7vUVnFi5^FFIB}+pJOg#2?ZmQJb(ZU#!kVbHzk)sRZ=8x;3nJ67PA$_5Snw7}SyYU(`WU{!ud>TM-{c<;We>68X)wDGotx*KVkh zjzvG*f|`LHsF5GVx!7!;<=6|TB=nr4ptb!Ly+`VNJHvZnH1z{eH=K{3x@<>WOFVpm zE!kDn=iv+OT!_ZY#8a^m_GN~1a0Yh3OLz!_7kQW3<9tCOj*51R?Z@Iw%p^XH%`kk4 z{dOCS#l)w4W-PTEmMw6d*QrmyZKe3Ni%PcjPuTW*3tJLj!1h>Sxec%f_96eABnsX5 zpm2pv^%tnvf2Ac^KhzSeKuzHx48^!rwnQUPYrY?~gk@H{&JK*i?)VvM7u9^ymZ&u< z`}1+3_WuD2%Es6=_EK4ZZHNz{I`T7W?OQ!%Q{5AFkR+jUVFYf&EL1~*Yi;dYU^;O> z)b;yN=fT@J8_TR?|1Y7CPoX2;L+#htr|s3L3+mt)imIQ8tuYgobj7Fx?#?Fb@XPEzWRP?4o+u=NFq<7ID%RlQnc^HVBa2cwh#_L`0 zf20zNI)HAWI`{`hqWdp_%jZ~$Rc|d%q=1tmE~)xn1n}AYZmsLjW7*$ zKrO^3`Wz$hdrZPg8*J@Ip_X75YJ~ka+7gULJ$Ca@51-Yj0lt7$@Sumn1PUim+p2M~ zW&Z)ZM;x-rPQKvH*1>PFI`!SQ*se)NHMk1(9#Mo1@i?Br>v#?iY_)B^Y@6%-51kI6 zo*AC#=dEWwFolXSsGc3dSo|1u;XioDC5vBhos0PCi>`CJ6u<3u*oij(W%Fm;#r2bS z*&nT{yuvmk{t=b+t#{jjHycS#k8_X0X+D^^$Nm7(e6Mw+0JS7nu@nvV-De$2de!y* zH{Od-OY#79&@_6@elPSv?emXNpO@Ot0Qr7X3?oh`ah;i%isSVBKTF|#Dw@CUIxF#K z9EI}^*wgBB%peXtXfKiTuq^R<)X7(jOYsHF$A~xVoY;&@h-<%T$+r=;bpJu^njg_$ z`~M#m(Elx)`l_g8X@JV^IMnA|up;)x033>1s>!I170&YGN+nH$R diff --git a/languages/rocket-fr_FR.mo b/languages/rocket-fr_FR.mo index 69f2b6c15cf2c2f2e85dda4dd4e715dc20e8977f..d933a6dc2dbffbef94ca27ff0ebfcbbf1f70401a 100644 GIT binary patch delta 12471 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 SH!Pd}IMns+UiCQh$o~OgF?Nvv diff --git a/languages/rocket-pt_PT.mo b/languages/rocket-pt_PT.mo index 8d3713548805687f42a063964eb3b70ba20e03e3..5f9aa7d13c565a79fdce0f4f0a2f3344334919e7 100644 GIT binary patch delta 12444 zcmXZi2Y60rAII@?j39!D6*IBbh)5G52x4zFBUTcLO^n#%vA3WUrS`09QEkn(RE^eX zYgFI9#j8fE)kV!#`+k4V|6G^r`rQBfInTM*|Gv+8(muHraQ9Zg-b~lG-Eo|wO&sSL z_G{`m#jtlX#|gnP7?1O?HJ--W7}DHv0PA-hY08GHi*b3jlQ#c97(EAzq z2adqZHg?^eHa@!`wXNf9;)CnB0jIU&rWnpJ%3x1yj1y4}9>rk%6bs=MEP?m1IOgc! zI3=+Rmc}@&fQeWDr(hmj?4zI?uEJ8d0axNtEQp;uI!-=JM_o4>bK@k;kFziomtzmy zjkbhT0OY#gO@Lw;EpfzsoL}MYGgN1Pol50L^4+X99Y5We$b+w-Ui`j|uce4?NU=VRB zRQ*dBj5WN^7s)@&=jjGv%x z_!xDAzp)tRPIR2|7>;VFDJlm#V>k}SFkFIK+C8Z6okPvwZOlvi&SS448w*&ExG-vD z9Z^e?f^~5uHpI6u5P!x{e2i+K0Mn=rRL2l(fx1r;mct>QSr|^d4}B_Jq%ag8Vp&Y? z={QAk1}ghs$BK9m8{l>9gQa@WIh=$8@EVrHX1%S!6x5o}LfvOIvca4KxD9jkVgA*_ zUEFOJ9zi8XqrR5yT~VL+#xNX?wJ{4dg(toGt6u#RtU`T6vQ2e&)C^^ymTDeW#@!f> zmy>;#t&gZs4pd+`+NT{c62~Ar(bHvET!+!bAELJF160G6hS-$Hp=O{b>b?_D16qhTwEs6#s6)jJw!mk21RLS(VYc5- zVG!{}&l~8U5!5!zKHNG~6g4BYu{gfs#Y0frc#h{v%uc)=gK6K{MPVr(L5;X=hV?WR zs}g6TW@ZEG^V3)#uc4;C#0cAd)sSU&mZN6iIciDrkF?w&A$KJ$Nco$v@`0&>PV zSMeZ5jbr{b13!;*9R4}k$J-mrBveC(u{HjI{jmN7i#H;Db$-UzvF}8li1-W_M9f>I76iC@BBG08_kQ`u^Yom4$Af_N0B;U-j$1Wa|D?l=dvhS#w)K0{q! zjEi)i<`|0IPz`6`%Qyo`FXsb1j}@oc!_N1R!dxn1Ib}5BkMR&b#yH$N!+Y3Zum@c7os|}9yJ38F$Z42f_Mp)D|gVR)ruGk1js&t5G;?8?8zWI2sEb{( z&0^+XH{3+UB|Lx|abcD&I z)O{~w2>#^NzrfnWLB18%!zP%IiV>(UO!ZuWTJv3)AK$}hJb{{#r&s_Byk^gUFjTV5 zMK!n^%j3t`A8%ngwq9v7;M+?%UF32Nkto`X@>O-8=r ztVAZ!sj=Fg1s`K9@!zO{L^Dl2Fy8bzt0@ei;sHis(i)COT#U`}0BV2#gJrPPT6?b7 zL*1|!YG(SQt{;QJcofUxd8~)OVJ)oohW(W5jcv65H&Dq{7e^M z(G9jV$#z?%4I_$=8mADV; z1bh!kROc`%IoofxtnGyziI-z*yzN%)_GFEr~YZAmZ9PY$O{|Q}`9O#QR7-IWaqJrY>Mn;*xK&w=oLCaUJUZA9)7t zvfYt{8n|zl&!%z_6{V@z=6!GiwFF;c0G58suB(8F#0_v1uEbK9XSd}{B`i-|7b{_J z%!RYCDlS6Z?*O_k9rIC`PQ|geZE6$Vu_Jf_M(B&ktU3Ep9ZcL~`*jCfJ_ci+qn7<8unut*)HX`N7#xX7xC8rOwhwLpr(ho9NvQkG#=N-FtKW8gt_<)Bx_|P<(_3@2`lt8fSw#O$BgQCtMImeCl3eX%5tLM>qyYRd1Twr80W z7RO*X@vsy0qYQ;CD&p~NY=-x7K1O|NQ+5;!5ud?O{0@uZBg~KaPTG=`LM2&s9E6$J z8?Ph(ocgC2J!U&?x%Ap;=0QEbNJUw^gUaSyXKWkg#}dRb$X0hcB0JIf8_VNcpIOp< zftvED&u#5nU{~T448#MdfqsHT@FwPTSt=ieycAxXn_+0e!-=Dp~)BI z30}tfIQ>g|On-#Q#6M$OZ2OhHLA{PmiQ_JsKI}yNDKbW<*d^N?z8e&jGd;*>I>~rN!Am!#+j%YSdAs|GgL!&Fc5!1<;+vef&XHIY?QBY zXb~seu@8tO2)^Iy6;euSZEW20TwvOyU_4o|#!td}9&b`B1 z4mQ3^r|}BT?eJmR?fyc^&NjKZnE*!T8fBJnfq#DF^e%6)L#Z#J+$f465%&>zfyLoRIo z2ZsyJLHgi4z!`Y$0YAqunPF7o1}*=z?U(V0JxpBYv2EM3Ps}FRmh0282fm8~FzBhB z6PcbfQT4ArW&Smi=Tywbna?+7d5EuMIXRzqM_N#UcE+Q`Cxc<*K<2%F= zyhZHBYuF4IFfBT0zQmUJ8wO#W?5_XlZidB)yQ7xgH)6)WQ-493zq zT>n!q0`n2aqi)a^m5gIi-;3l}D~RneHzs2q9OTuH#!|$yvA_2JW(pxx++NUDGL<)^B4|;)kdyt&`vN|I+D-O0H$7 zj;u!I#5UA`K1H?j8~XG?jsmX#ge#8`#9gpD&P3gKFKSB9qi%Q`b%Q^!4h96%v~Pqefb~i0gkJh{iF*-B8=} z92Uc@qOP+Ax1)AX>tdGW{ZIoLhMKwY*brYs4eSakhwfn$EZ_@u{m=8xsGcvy8h8k6 z;}58_x=eA`|5$F19f`+aBRqxLrnySE{v)_1>ho0WgZnWVLrS_%V;qfx@qHYRzVK46 z|IcQx<4`IJm$u}aj+(;FSPw5_a||xy`d_QN;{@WFs2O>Ikys?mb#`KN)J*<{%9((0 z*Z;$#5Ni9)MUvF#ET^D-y9PCtJFzMr$If^k6R}ZQ*Z(v8b<9D06*bl0p_1_j)D-`X zVHjM_bzZ|rjK@M%+5e!V%xK7P?*=yO7#bYDlWG~)?YWM_d_x#|+<)f^= zh360-g&|z91gGL(n1K^twuj75o{7<9y-OCOmh5bd>;Fl154EqS*S0A?f$fQ(VluXf zwF77;&LsX3-^HPITxSLP!s?O)6y8IvZFHQic^lNx+8gzdNk@l&yS&fes%N|9Lu|n3 z-=a>+(E6_b{XYxG6IX9w+in}`NI!*2-iH{h{a-)c_G>#-vJJzR(T5XpKmLLd4PF0# ziY?X1bv6?Z#fDg*vFqH!4yYxmn_#;j6Lm28JXfI}PJ1v6PhtfP{SF1~`@kl4U{uB> z#2=!1+^(tJa3X4|XM6E!)b}o;lJ+;ujent%F-J2yS5mMA@li}weRDO;(-FVW)Gwl- z{oSjDW%nFZ54WMV(@89cFK|7Ex3nbv7!!zpM|I%kR<`dOq7I^V*bfI{Sv-e2`+r5{ zP>ZlnQf^+a~)RafJwUaIb)sY#f11QU@f5VIS zpqBVU)XaU+mi@2&c%KTL`2p>0=jf8x+BTrj6of_b5PfRh&q~oMCHm8)cr=a zw*zSr>VVpan$e@!6~DtzFscLlKb*p&4t7Kq?Pv#1P1L?`iaH6~qoytub(EgR=Xe)C z#hb6#?%CeS8zHLWU*IGB1=rxM&UQde?P5>SEFT4({fALK`yVR%Yj?FJ8H`$@MX2mu zfeUaKsv|MotikqJf;bs9wUaO$S7T*7gxU=^u?IfGchJ|lyX*hCoh{L(cq(ejmY~jq zw@^pwC#aL`B5LaM_ppZRqB_zB)j%3*7fePi*=*F3twbH==TR@U-{WxFcOFrwNkv+c zP4x;?yc09=8&npz>uC+`Lv`$PRMOtWILzM5c1b)25~rX#G!)g~EYu9GLhYt^@qqUK z6$*!_Slrvr@D_bs|6fAqq22>NK~32go-g%v{eNB}qfg$S_n#W}{DQvV=l7ZbfDLNmLH}2eq9Zp^~UTx^1^u)DkpDt#xl4 zhW%0d`!Z^2?s}i+?r--mi1n$D^33SZ{@2>=rXm4`|usqNRtQJ zbz^Z1@ln)y5jDtl-orYmf&GG-foy|q=2~D^;*IzUJ|4{eA4H+$5ZC^P0n}qMbf`TG z-awt@QNwI)mtZpS6MPdBhr7-h%$8v}aTZ$;$B(cP&%rjtJ5V|H5YzDOk+xJJzESp= ztcc3W_1G4Vd*&Z)+pZ^SM5|D1xEpKWr(XO3I}rzF+Hb$!s3lCpzBmo1N*Wvc7{UoH+| zQa0XrSW*pS^K_fhFHr+|h&oxz&9GeQhT-I&(~ClD-Dsx0RGvX4;XkN--*lF}e6Gh) z#8}c(f&V1p%vDiXHz&0 zb+8=6czlZ51+nw(@!H0-J8B#D!?`#Sl_S{}SaKCZC2v*K5j__*u#K34chT3ILd%7= zzqg~-@&f8L`y0%MPdsxjvLBg+Q2V?&>e-NpI(P=6w$~)Ah+knxe1dAQseS9cc2FF8S2^cUmpdXPCZ64UNNaT!VM<2p+@DuiHaOb zOGaGyz|71MaW!j>8&P9aM!zBHnGwU%Yc3ylt#n{)ms-(rF_CdGb@s2gcF4_EtJePZ cH!_R5W0#+J6p=SY&7RmqyD9r$JbHfQ|4=S#+yDRo delta 12439 zcmXZi2XqzH7RK=zfrQWlgg^o&bOMHiUP9*>mU4oU_k9XC_x~-UxVjBVd2F>)Yx$&WSdT z^A`?k>o}p9+|F@IVmda*xtNIWU_&h0-f;r3ErwtxY=%RSOE|A!7rcS`e%%iC{S4IS zC$KQO9UY(lMnyZ?jUzo9dv?QqoH!b5<5|>=?qdOrNpPG%Y=8k6kJGU&zKLgW8m80x zId~h>F|CuGcfFI(P8itPag>S6xEZHC?>J2{oMAkRy|ESMpl)~sOWNV+!iL30M#(Vlnh#SzL;J zaR=(cZg=ZYVbu4lq0X<5y|4|cV<+~29u$8l9x!G^zvDu_U%eT_*`E;YiO#7)iVbeQKPeF%Iuy zMeN_-amwHfRQ0dIs+foIco_#_=m6F{PQ+1o3B$4FK)c}p)SUZJ*I9`yFy|m{$A1Qr zfAw%XSDS~2QNholbz*KCAi%=IJANN)a6Br-Qr!cUp)shbnv2zO z2S(zjDL$*#-#MTfh+sHXuoK2&IzQ>dak>vWm_JVkto#tMj+SsIb&$B)Sby#9nYiY_P?lgTW}1$#b;3+ z8iNry*>fG%Cq9Z=u6Iy3t~l0G-T;+>-l*$lqXsk|uW9{nqS2TGGgty2;$duwv&P$c zKZ8Yx&v|}>{*0iO*;7=9f+tu;>R>tI&R#qcwTx$b=3+kLtyqHlJKJe2$HS-*cSy6I z4#b+oX{gMsM}7VdHp5G()Q6d?84>Uj5gcD->}S7V#x9oU6B;Sd(a&rsES1$*O< zs2wcs1zWBQaX9fAR3@s;cbuu%79;R9hTt^}#Rpgki!xeuI2O~D+XNcbIq()X!XK~z zhAp(7MxsVu3)^5b)CFguYGWOi!y6cgPf(dCu*e2f5vve4L+v9&P|JD(*5dxo%QRZ! zdsr0J{8aJ zG-_hRV!Lo64kk`Qjr0)e2Io*0{2n#Jho~tj^%74!OhKjgHmXJnuoRTJFf53*P#vg` zN!We~`PT(Ea^Q13h+A;}QoB+0W!BSpEW`2V@h}d@EDT?69b1O#(5vX5du%{_4WGl1 zT$}sWsEm%lA~-&m{7_R?AKnQ;D{SWr_Kfh1##)>ghru`sd*T$-K5!0`b$q2w z;oGR|eu^dWC-3+pY)BmFTV*|Ljzu{z7WIWGp36{kz8#CH=d<#e7cQ^vut+5RFcGJ)tAI0+c87gIWP(>8B);drhOA|Lojl8Gl2-JC# zkgqtoND`eI>+D(Z7B(V&h#E)?Y3hqjOrNuo#wZTl!Md2Vo|gn%i0$zpYJLBO&tm8X zd#*P`U9b--Gec14r(+2`f_g@LfN}UAtb^4y+MjaC*h%YuJq>;FCh7~(n=Ex*Q6n9S z@tBRx@F1$1e?w*Dkrx+z#Zp=Z%W=Fi>ih8+hFviP$DoRI78c?D&K4RP!Cq8#p1{ud zu1>(<%{Dd9qHY|AWw9-)7zcVTLS^m{#^N>9hE-yVeZLo~Rx*%FJG0TJ8$@ok3q@lR zabMI9xDP2*=Mbtm6Si5^_Q7t%OED3zdDeW@o{~A3!12pC8Y{nMe{R2oy@`Xi+haOq zJNbW}17|s~5QAU0B3h5B#C3MqNH(BS_z8BzpOJcUVs~1mKEyJ_W!@mY7>$v*4t4!w zo`Jh;btIt%K6RJRQn`Qw6*#cP``{F63O>dFEW6vzi@;>!#+Zq@SRV85v6`ufm5J+P zHB81p^kGe0fV$p6bX_{84`y@V_+CqG{F}A~XJc)B5y_hKCaQxy_t`qmK&_TbsE!og zZ+{QWMBVrTDpQZJAGSJRBj1Qw#Ak2@`WhUxl;>d+4kYH;^Lid8)58ZC!SODKY@`!V zBV3F%a35+!myl~Z*RVO}9=4kL47L9MhaIr~5zEAM9L)Wl9W+$Ufk*AR9*KR3`=V}i z0GTD{OVsj9I%XYNfx6K?R3`4?P^|cty}r-GTEy?6u5%9?VaRcts^_tQuAD-n5Fd>6 zKFC1ba2}Sx{3opXL$EP%Wz;enfDLdQ_QP#B2%lg%eSXq5sEMfS%)-K$>mA>ORdk~r zG>YIS-U*jc%k3vr_5Oho*y@z+U_&sGcqJCZ?@$By8OPy$)W$UUwB0xxRfI2Ke_Vn- z{6%Ucsc+ls@D$Vq>z=Wm$6+LKJ6ww+F&LlXvsmICo68t1N!$;^aXe}Y7ok%AJ!*ND zJ8N+)MiP%cOFwj>MI303JFy-9jEgY(T}#;!EJb`4%i`Ac7a>CoG� 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 diff --git a/languages/rocket.pot b/languages/rocket.pot index 549bccd4b0..e42629465f 100644 --- a/languages/rocket.pot +++ b/languages/rocket.pot @@ -2,14 +2,14 @@ # This file is distributed under the same license as the WP Rocket plugin. msgid "" msgstr "" -"Project-Id-Version: WP Rocket 3.17.0.1-alpha1\n" +"Project-Id-Version: WP Rocket 3.17.0.1-alpha2\n" "Report-Msgid-Bugs-To: http://wp-rocket.me/\n" "Last-Translator: WP Media (http://wp-rocket.me/)\n" "Language-Team: WP Media (http://www.transifex.com/projects/p/wp-media/) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-17T14:50:58+00:00\n" +"POT-Creation-Date: 2024-09-18T10:10:31+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: rocket\n" From 9d3251ba649b23c00a1516016a9588c566a471e2 Mon Sep 17 00:00:00 2001 From: WordPressFan Date: Wed, 18 Sep 2024 13:12:31 +0300 Subject: [PATCH 192/192] update the version again to 3.17.0.1 before final release --- wp-rocket.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wp-rocket.php b/wp-rocket.php index 080df9c281..3f18e01191 100755 --- a/wp-rocket.php +++ b/wp-rocket.php @@ -3,7 +3,7 @@ * Plugin Name: WP Rocket * Plugin URI: https://wp-rocket.me * Description: The best WordPress performance plugin. - * Version: 3.17.0.1-alpha2 + * Version: 3.17.0.1 * Requires at least: 5.8 * Requires PHP: 7.3 * Code Name: Iego @@ -20,7 +20,7 @@ defined( 'ABSPATH' ) || exit; // Rocket defines. -define( 'WP_ROCKET_VERSION', '3.17.0.1-alpha2' ); +define( 'WP_ROCKET_VERSION', '3.17.0.1' ); define( 'WP_ROCKET_WP_VERSION', '5.8' ); define( 'WP_ROCKET_WP_VERSION_TESTED', '6.3.1' ); define( 'WP_ROCKET_PHP_VERSION', '7.3' );