{"id":69264,"date":"2025-01-07T15:04:32","date_gmt":"2025-01-07T09:34:32","guid":{"rendered":"https:\/\/www.tothenew.com\/blog\/?p=69264"},"modified":"2025-04-16T11:53:03","modified_gmt":"2025-04-16T06:23:03","slug":"scaling-a-multi-lingual-web-platform-with-strapi-from-1-to-1000-pages","status":"publish","type":"post","link":"https:\/\/www.tothenew.com\/blog\/scaling-a-multi-lingual-web-platform-with-strapi-from-1-to-1000-pages\/","title":{"rendered":"Scaling a Multi-Lingual Web Platform with Strapi, from 1 to 1000+ Pages"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>In the fast-paced digital world, building scalable, flexible, and author-friendly web solutions is critical. For building over 1000+ authorable web pages for an audience as diverse as ours, we turned to Strapi V4, a headless CMS that could make content management streamlined for us and helped us reach localization and customization at scale.<\/p>\n<div id=\"attachment_71418\" style=\"width: 1452px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-71418\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-71418 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-10-11-1.png\" alt=\"List of Pages\" width=\"1442\" height=\"861\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-10-11-1.png 1442w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-10-11-1-300x179.png 300w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-10-11-1-1024x611.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-10-11-1-768x459.png 768w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-10-11-1-624x373.png 624w\" sizes=\"(max-width: 1442px) 100vw, 1442px\" \/><p id=\"caption-attachment-71418\" class=\"wp-caption-text\">List of Pages<\/p><\/div>\n<p>Here&#8217;s how Strapi V4 helped us bring this ambitious project to life.<\/p>\n<ol>\n<li><strong>Scalable Media Management with AWS S3:<\/strong> Managing thousands of web pages means dealing with a vast number of images and assets. To handle this seamlessly, we integrated AWS S3 as the image upload provider in Strapi. This enabled us to:\n<ul>\n<li>Offload storage to a robust cloud service.<\/li>\n<li>Ensure quick and reliable access to media files.<\/li>\n<li>Simplify content workflows for authors through direct uploads using Strapi&#8217;s intuitive interface.<\/li>\n<\/ul>\n<p>Through S3 integration, our pages were lightweight and optimized with media delivery that ensured better load times for the end-user.<\/li>\n<li><strong>Localization using i18n: Reaching Vernacular Audiences:<\/strong> Our audience spans across India and our content needed to be delivered in multiple languages. With Strapi&#8217;s i18n (Internationalization) plugin, localization of each page in multiple languages, including Hindi, Telugu, Tamil, and Kannada, was easier. Key benefits of i18n in our project:\n<ul>\n<li>Ease of localization: The authors could create language-specific content directly within the Strapi interface.<\/li>\n<li>Single source of truth: A centralized structure for content ensured consistency across languages.<\/li>\n<li>Dynamic page generation: Used of localized content with Next.js enabled us to provide vernacular pages dynamically catering to a diverse user base.<\/li>\n<\/ul>\n<div id=\"attachment_71419\" style=\"width: 1464px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-71419\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-71419 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-15-33.png\" alt=\"Localization-i18n\" width=\"1454\" height=\"863\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-15-33.png 1454w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-15-33-300x178.png 300w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-15-33-1024x608.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-15-33-768x456.png 768w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-15-33-624x370.png 624w\" sizes=\"(max-width: 1454px) 100vw, 1454px\" \/><p id=\"caption-attachment-71419\" class=\"wp-caption-text\">Localization-i18n<\/p><\/div>\n<p>This focus on localization has improved user engagement as well as made our platform accessible to millions of users who are not native speakers.<\/li>\n<li><strong>Modular and Reusable Components:<\/strong> To ensure uniformity, we developed the frontend part with reusable components and using dynamic zones from Strapi. Some of the important parts we used include the following:\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>PageLayout:\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>The PageLayout component allows authors to define and organize web pages intuitively. It acts as a structure that ensure consistency across the site while addressing various layout requirements<\/li>\n<li>Authors can drag and drop the components in these layouts directly in Strapi\u2019s Interface. These configurations dynamically render on the frontend, giving real-time feedback.<\/li>\n<li>In Next.js, the layout is dynamically loaded and applied using a higher-order component. Here&#8217;s a snippet of how it is defined:<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div id=\"attachment_71420\" style=\"width: 1455px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-71420\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-71420 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-23.png\" alt=\"Page Layout\" width=\"1445\" height=\"862\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-23.png 1445w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-23-300x179.png 300w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-23-1024x611.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-23-768x458.png 768w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-23-624x372.png 624w\" sizes=\"(max-width: 1445px) 100vw, 1445px\" \/><p id=\"caption-attachment-71420\" class=\"wp-caption-text\">Page Layout<\/p><\/div>\n<div id=\"attachment_71421\" style=\"width: 1469px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-71421\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-71421 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-55.png\" alt=\"Page Components\" width=\"1459\" height=\"801\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-55.png 1459w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-55-300x165.png 300w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-55-1024x562.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-55-768x422.png 768w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-16-55-624x343.png 624w\" sizes=\"(max-width: 1459px) 100vw, 1459px\" \/><p id=\"caption-attachment-71421\" class=\"wp-caption-text\">Page Components<\/p><\/div>\n<pre><span style=\"color: #808080;\">const renderPageLayout = () =&gt; {\r\n\u00a0 \u00a0 \u00a0 if (typeof window !== 'undefined') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 rewriteURL();\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 const layoutMappings = {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PageLayout1,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PageLayout2,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PageLayout3,\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 PageLayoutWithContactDetails,\r\n\u00a0 \u00a0 \u00a0 };\r\n\r\n\u00a0 \u00a0 \u00a0 const onValueChange = (value) =&gt; {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 console.debug('value', value);\r\n\u00a0 \u00a0 \u00a0 };\r\n\r\n\u00a0 \u00a0 \u00a0 const Layout = layoutMappings[page?.layout?.layoutType?.name] || null;\r\n\r\n\u00a0 \u00a0 \r\n\u00a0 \u00a0 \u00a0 const components =\u00a0 \u00a0 util.transformByKey(appConfig?.themeConfig?.sections);\r\n\u00a0 \u00a0 \u00a0 if (page &amp;&amp; page.sections &amp;&amp; Array.isArray(page.sections))\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 page.sections.push(components?.contact);\r\n\u00a0 \u00a0 \u00a0 \r\n\u00a0 \u00a0 \u00a0 return Layout ? (\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;Layout\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {...page}\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 layout={page?.layout}\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 onValueChange={onValueChange}\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 pageTheme={pageTheme}\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/&gt;\r\n\u00a0 \u00a0 \u00a0 ) : (\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;h2&gt;Page Layout is not defined...&lt;\/h2&gt;\r\n\u00a0 \u00a0 \u00a0 );\r\n\u00a0 };<\/span><\/pre>\n<\/li>\n<li>Form Components: Provided capabilities for integrating forms to handle insurance journeys, checking CIBIL scores, among other user interaction requirements.\n<div id=\"attachment_71422\" style=\"width: 1460px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-71422\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-71422 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-13.png\" alt=\"Form Layout\" width=\"1450\" height=\"861\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-13.png 1450w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-13-300x178.png 300w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-13-1024x608.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-13-768x456.png 768w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-13-624x371.png 624w\" sizes=\"(max-width: 1450px) 100vw, 1450px\" \/><p id=\"caption-attachment-71422\" class=\"wp-caption-text\">Form Layout<\/p><\/div>\n<p><div id=\"attachment_71423\" style=\"width: 1465px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-71423\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-71423 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-56.png\" alt=\"Form Components\" width=\"1455\" height=\"798\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-56.png 1455w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-56-300x165.png 300w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-56-1024x562.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-56-768x421.png 768w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-18-56-624x342.png 624w\" sizes=\"(max-width: 1455px) 100vw, 1455px\" \/><p id=\"caption-attachment-71423\" class=\"wp-caption-text\">Form Components<\/p><\/div><\/li>\n<li>AdvanceDescription Components: The AdvanceDescription Component is a powerful, reusable module designed to display detailed and styled content blocks. Its flexibility allows it to be repurposed across multiple scenarios, significantly reducing redundancy and ensuring a consistent design language. The AdvancedDescription Component can act as a \u201ccontainer\u201d for smaller components such as images, buttons, or embedded videos.\n<p><div id=\"attachment_71424\" style=\"width: 1455px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-71424\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-71424 size-full\" src=\"https:\/\/www.tothenew.com\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-19-55.png\" alt=\"AdvanceDescription Component\" width=\"1445\" height=\"805\" srcset=\"\/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-19-55.png 1445w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-19-55-300x167.png 300w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-19-55-1024x570.png 1024w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-19-55-768x428.png 768w, \/blog\/wp-ttn-blog\/uploads\/2025\/04\/Screenshot-from-2025-04-04-20-19-55-624x348.png 624w\" sizes=\"(max-width: 1445px) 100vw, 1445px\" \/><p id=\"caption-attachment-71424\" class=\"wp-caption-text\">AdvanceDescription Component<\/p><\/div><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>These components, configured in Strapi and rendered via <b>Next.js<\/b>, provided unmatched flexibility. Authors could drag, drop, and reorder components to create unique pages without needing developer intervention.<\/li>\n<li><strong>Connecting Next.js with Strapi:<\/strong> Integrating <i>Next.js<\/i> with <i>Strapi<\/i> enables us to build powerful, modern web applications that combine efficient front-end rendering with flexible content management. Here\u2019s how this connection works and why it\u2019s beneficial:\n<ul>\n<li>API-Driven Content Delivery: Strapi, as a headless CMS, provides a REST or GraphQL API to serve content. Next.js fetches this data during the build process (for static generation) or at runtime (for server-side rendering). This setup ensures content is delivered dynamically and efficiently.<\/li>\n<li>Dynamic Rendering with Strapi:\n<ul>\n<li>Server-Side Rendering (SSR): Next.js can request and render data from Strapi during each page request, ensuring users always see the most up-to-date content.<\/li>\n<li>Static Site Generation (SSG): Strapi content can be pre-fetched during build time, allowing for blazing-fast page loads with cached content.<\/li>\n<\/ul>\n<\/li>\n<li>Benefits of Integration:\n<ul>\n<li>Strapi handles content management and storage, while Next.js optimizes content delivery, making this combination ideal for scaling projects.<\/li>\n<li>We can choose when to fetch data\u2014either on the server, client, or during build time\u2014based on project needs.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>This integration of Next.js and Strapi delivers a perfect balance of performance, scalability, and developer efficiency, making it a go-to solution for modern web development projects.<\/li>\n<\/ol>\n<h2>Challenges<\/h2>\n<ol>\n<li>Page Hanging Issue Due to SQLite:\n<ul>\n<li>Challenge: The application experienced significant delays or complete hangs when handling larger datasets because SQLite struggled with high-concurrency workloads.<\/li>\n<li>Solution: Migrated the database from SQLite to PostgreSQL. This improved query performance, enabled better indexing and concurrency, and supported more advanced features needed for scaling.<\/li>\n<\/ul>\n<\/li>\n<li>Caching Mechanism Improvements:\n<ul>\n<li>Challenge: High latency and increased load on backend servers due to repeated requests for static and frequently accessed dynamic data.<\/li>\n<li>Solution: Implemented caching strategies using CloudFront for content delivery and NGINX as a reverse proxy cache. These changes reduced latency and offloaded traffic from the application servers.<\/li>\n<\/ul>\n<\/li>\n<li>Back Syncing Production Data:\n<ul>\n<li>Challenge: Ensuring data consistency between the production environment and other systems, such as staging or analytics.<\/li>\n<li>Solution: Built and automated a robust back-syncing process using database dump and restore mechanisms, combined with incremental syncing scripts to avoid data loss or inconsistencies.<\/li>\n<\/ul>\n<\/li>\n<li>Writing Common Utilities for Data Transformations:\n<ul>\n<li>Challenge: Repeated code patterns for removing data attributes and restructuring arrays\/objects, leading to redundancy and inconsistencies.<\/li>\n<li>Solution: Developed reusable utility functions for data transformation tasks. This reduced duplication, improved maintainability, and ensured a consistent approach to handling data structures across the codebase.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>Outcomes<\/h2>\n<p>With Strapi V4, we successfully built a platform capable of managing over 1000+ authorable pages, serving both English and regional language audiences. Key outcomes included:<\/p>\n<ul>\n<li>Streamlined Authoring Process: Non-technical team members could easily create and manage content.<\/li>\n<li>Localized Content at Scale: Vernacular pages expanded our reach and improved user engagement.<\/li>\n<li>Dynamic Tools for Users: The calculators provided personalized and interactive experiences for users, enhancing engagement and satisfaction.<\/li>\n<li>Improved Performance: The combined power of Strapi, Amazon S3, and Next.js delivered fast-loading, SEO-optimized pages.<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>Strapi V4 turned out to be one of the core parts of our journey, allowing us to create a web platform that was scalable, customizable, and readied for localization. The connection with Amazon S3 and Next.js coordinated together seamlessly to allow smooth access and a rich experience for both the authors and end-users.<\/p>\n<p>If you&#8217;re looking to build something content-rich, friendly for authors, highly performing, and with advanced interactivity, Strapi V4 is certainly worth a look. The teams focus on their creative and growth aspects while Strapi fully handles the technical complications of modern web development.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In the fast-paced digital world, building scalable, flexible, and author-friendly web solutions is critical. For building over 1000+ authorable web pages for an audience as diverse as ours, we turned to Strapi V4, a headless CMS that could make content management streamlined for us and helped us reach localization and customization at scale. Here&#8217;s [&hellip;]<\/p>\n","protected":false},"author":2039,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":42},"categories":[5876],"tags":[6901],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/69264"}],"collection":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/users\/2039"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/comments?post=69264"}],"version-history":[{"count":3,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/69264\/revisions"}],"predecessor-version":[{"id":71511,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/posts\/69264\/revisions\/71511"}],"wp:attachment":[{"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/media?parent=69264"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/categories?post=69264"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tothenew.com\/blog\/wp-json\/wp\/v2\/tags?post=69264"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}