Build With Abdallah logo Build With Abdallah Software · AI · Automation
Tutorial 6 min read Jun 25, 2026

Building an Internationalized E-commerce Site with Next.js and i18n Libraries

What You'll Build

A
Abdallah Mohamed
Senior Full-Stack Engineer
Building an Internationalized E-commerce Site with Next.js and i18n Libraries

Building an Internationalized E-commerce Site with Next.js and i18n Libraries

What You'll Build

In this tutorial, you'll create a simple e-commerce application using Next.js, enhanced with internationalization (i18n) capabilities. By the end, you'll have a multi-language e-commerce site where users can switch between languages like English and Spanish. The site will feature a homepage, product listings, and a shopping cart, all with text content that adapts to the selected language.

Why This Matters

Creating an internationalized e-commerce site is crucial for businesses aiming to reach a global audience. By supporting multiple languages, you can:

  • Improve User Experience: Users are more likely to engage with content in their native language.
  • Expand Market Reach: Attract customers from different regions, increasing your potential market size.
  • Enhance Accessibility: Cater to diverse linguistic needs, making your site more inclusive.

This is especially beneficial for startups and small businesses looking to scale internationally without the overhead of maintaining separate sites for each language.

Architecture Overview

The architecture for our internationalized e-commerce site will be as follows:

+-----------------------------------------------------+
|                                                     |
|                   Next.js App                       |
|                                                     |
| +----------------+  +-----------------------------+ |
| | Localization   |  | Product Management          | |
| | (i18n Library) |  | (Static and Dynamic Content)| |
| +----------------+  +-----------------------------+ |
|                                                     |
| +----------------+  +-----------------------------+ |
| | Routing        |  | State Management            | |
| | (Next.js)      |  | (React Context/Redux)       | |
| +----------------+  +-----------------------------+ |
|                                                     |
+-----------------------------------------------------+
  • Next.js: Provides server-side rendering and static site generation, essential for SEO and performance.
  • i18n Library: Manages translations and language switching.
  • State Management: Handles cart state and user preferences.
  • Routing: Manages navigation and URL structure.

Step-by-Step Implementation

Let's dive into the implementation. We'll start by setting up a basic Next.js application, integrating an i18n library, and creating a simple homepage with language switching.

Step 1: Set Up a New Next.js Project

First, create a new Next.js project. If you haven't installed create-next-app, do so by running:

npm install -g create-next-app

Now, create your project:

npx create-next-app@latest internationalized-ecommerce

Navigate into your project directory:

cd internationalized-ecommerce

This command sets up a new Next.js project, providing a starting point with a basic file structure and configuration.

Step 2: Install and Configure the i18n Library

We'll use next-i18next, a popular library for internationalization in Next.js. Install it with:

npm install next-i18next react-i18next i18next

Create a new file named next-i18next.config.js in the root of your project:

// next-i18next.config.js
module.exports = {
  i18n: {
    defaultLocale: 'en',
    locales: ['en', 'es'],
  },
}

This configuration sets English as the default language and adds Spanish as an additional language.

Next, update your next.config.js to use this configuration:

// next.config.js
const { i18n } = require('./next-i18next.config');

module.exports = {
  i18n,
};

This setup enables language support in your Next.js application.

Step 3: Create the i18n Translation Files

Create a public/locales directory with subdirectories for each language. Inside each, create a common.json file to store translations.

Create the directory structure:

mkdir -p public/locales/en public/locales/es

Add translations for English:

// public/locales/en/common.json
{
  "welcome": "Welcome to our e-commerce site!",
  "cart": "Cart"
}

And for Spanish:

// public/locales/es/common.json
{
  "welcome": "¡Bienvenido a nuestro sitio de comercio electrónico!",
  "cart": "Carrito"
}

These files define the text content for the homepage in English and Spanish.

With these steps, you've set up a basic Next.js application with internationalization support. In the next steps, you'll integrate these translations into your components and add language switching functionality.

Step 4: Integrate Translations into Components

Now that you have your translation files ready, it's time to use them in your Next.js components. Let's start with a simple homepage component.

Create a pages/index.js file:

// pages/index.js
import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
import { useTranslation } from 'react-i18next';

export default function Home() {
  const { t } = useTranslation('common');

  return (
    <div>
      <h1>{t('welcome')}</h1>
    </div>
  );
}

export async function getStaticProps({ locale }) {
  return {
    props: {
      ...(await serverSideTranslations(locale, ['common'])),
    },
  };
}

This example uses the useTranslation hook from react-i18next to fetch the translation strings. The getStaticProps function ensures that the translations are loaded on the server side, which is crucial for SEO.

Step 5: Add Language Switching Functionality

To allow users to switch between languages, you need a language switcher component. Let's create one.

Create a new component components/LanguageSwitcher.js:

// components/LanguageSwitcher.js
import { useRouter } from 'next/router';

export default function LanguageSwitcher() {
  const router = useRouter();
  const { locales, locale } = router;

  const changeLanguage = (newLocale) => {
    const { pathname, asPath, query } = router;
    router.push({ pathname, query }, asPath, { locale: newLocale });
  };

  return (
    <div>
      {locales.map((loc) => (
        <button
          key={loc}
          onClick={() => changeLanguage(loc)}
          disabled={loc === locale}
        >
          {loc.toUpperCase()}
        </button>
      ))}
    </div>
  );
}

Now, import and use this component in your pages/index.js:

// pages/index.js
import LanguageSwitcher from '../components/LanguageSwitcher';

export default function Home() {
  const { t } = useTranslation('common');

  return (
    <div>
      <h1>{t('welcome')}</h1>
      <LanguageSwitcher />
    </div>
  );
}

With this setup, users can switch between English and Spanish using the buttons provided by the LanguageSwitcher component.

Common Mistakes

  1. Incorrect Locale Paths: Ensure your locales directory structure matches the configuration in next-i18next.config.js. Any mismatch will cause translation loading errors.

  2. Forgetting serverSideTranslations: Not including serverSideTranslations in getStaticProps or getServerSideProps can lead to missing translations, especially on initial page load.

  3. Ignoring Default Locale: Always set a default locale in your configuration. Failing to do so may lead to unexpected behavior in language fallback mechanisms.

How I Would Use This

  • When to Use: This setup is ideal for small to medium-sized projects where you need to support multiple languages without heavy CMS requirements. It's particularly useful for e-commerce sites targeting international customers.

  • When to Avoid: Avoid this setup if your site requires complex content management with frequent updates in multiple languages. In such cases, consider integrating a headless CMS with built-in i18n support.

  • Production Considerations: Ensure your translations are complete and tested across all locales. Use analytics to track language usage and optimize content accordingly.

  • Cost and Maintenance: Maintenance involves updating translation files and occasionally adjusting language-specific UI elements. Costs are primarily associated with translation services and potential third-party integrations.

Lessons Learned

  • Trade-offs: Using next-i18next simplifies i18n in Next.js but can add complexity to your build process, especially with static generation and caching.

  • Unexpected Issues: Be mindful of caching strategies in production. Stale content can be an issue if language files are updated but not reflected due to aggressive caching.

  • Real-world Considerations: Language nuances can affect user experience. Work with native speakers to ensure translations are culturally appropriate and contextually correct.

Next Steps

  • Advanced i18n Features: Explore advanced features like pluralization, context-based translations, and language detection.

  • Performance Optimization: Investigate Next.js performance optimizations, such as incremental static regeneration and image optimization, to enhance your multilingual site's speed.

  • Integration with CMS: Consider integrating a headless CMS like Contentful or Strapi for dynamic content management with i18n support.

Sources