How I Built a Multilingual Blog with Django, Celery, and Redis

How I Built a Multilingual Blog with Django, Celery, and Redis

Table of Contents

    I’m excited to share that my blog now supports automatic translations in multiple languages! This was one of the most rewarding projects I’ve worked on, combining a variety of technologies to make my content accessible to a global audience. What started as a simple idea quickly turned into a deep dive into Django, task management with Celery, and dynamic language handling. Let me walk you through the journey.

    Building the Foundation: Translation Model and Languages

    The first step was creating a solid foundation. I built a Translation model in Django to store translated versions of each post. This model keeps the translated content separate while linking it back to the original article. Each translation is tied to a specific language, making it easy to manage updates and edits.

    I also configured Django to support multiple languages using the LANGUAGES setting. This enabled me to specify a list of major world languages to translate posts into, while carefully excluding English (my default language). There was no need for a /en directory or an English translation since the original post already serves that purpose.

    Automating Translations with Celery and Redis

    The real magic happened when I automated the translation process. Using Celery for task management and Redis as the message broker, I created a system that automatically translates posts whenever I create or update them. Here’s how it works:

    • When a new post is saved, or an existing one is edited, a signal triggers a Celery task.
    • The task communicates with an external translation API to generate translations for the title and body.
    • The translated content is saved in the database, either as a new translation or by updating an existing one.

    This setup allows translations to run in the background without affecting the performance of my site. Celery’s seamless integration with Django and Redis made this process incredibly efficient, even for a production environment.

    Creating a Dynamic Language Switcher

    To enhance the user experience, I added a language switcher to each post. This switcher allows visitors to toggle between languages effortlessly. Using Bulma CSS, I styled the switcher to look clean and intuitive. Each language name is displayed alongside its corresponding country flag, making it easy for readers to identify their preferred option.

    When viewing a translated post, the language switcher includes a link back to the original English version. This ensures visitors can always navigate between the default and translated content seamlessly.

    Deploying to Production on AWS EC2

    Deploying everything to my AWS EC2 instance was a critical step. My deployment pipeline automates most of the work:

    1. Fetching the latest code.
    2. Running database migrations.
    3. Restarting the server and related services.

    I configured Redis and Celery as system services to ensure they run automatically on reboot and remain stable in production. With this setup, translations are generated and updated in real-time without any manual intervention.

    Handling SEO and Sitemaps

    To ensure search engines can index my blog effectively, I updated the sitemap to include all translated pages. This means every language version of a post is discoverable and accessible, giving the site a significant SEO boost. I also took care to avoid duplicate content issues by excluding English translations and keeping the original post as the canonical version.

    Lessons Learned and Future Plans

    This project taught me a lot about building scalable multilingual systems. I tackled challenges like avoiding duplicate content, managing language exclusions, and ensuring everything runs smoothly in production. It was a rewarding journey, and seeing visitors from around the world access my content in their preferred language is incredibly satisfying.

    I’m already thinking about future improvements, like adding more languages or refining the translation process further. If you’re curious about how I implemented this or want to add multilingual support to your own site, feel free to reach out.

    Published: 1 month, 3 weeks ago.

    Related Posts

    Django installed in under 60 seconds

    Here’s how to install Django in less than 60 seconds using UV. I am using Ubuntu and …

    Automating Django Project Creation

    I’ve been thinking a lot about workflow this week. Looking at my daily tasks, I …

    Building Models in Django: A Step-by-Step Guide (Part 1)

    When I first started learning Django, I remember feeling overwhelmed by the sheer number of …

    DjangoCon Europe 2025: Why I’ll Be in Dublin to Celebrate Django and Community

    DjangoCon Europe is back, and this time, it’s taking place in one of the most …