---
# System prepended metadata

title: Implementing Internationalization in NEXT.JS

---

Using `next-translate` is a more streamlined approach to handling internationalization (i18n) in Next.js. Here’s a step-by-step guide to implement it for both static and dynamic content:

### 1. Setup Next.js with `next-translate`

1. **Install `next-translate`:**

   ```bash
   npm install next-translate
   ```

2. **Create the `i18n.js` configuration file:**

   ```javascript
   // i18n.js
   module.exports = {
     locales: ['en', 'es', 'fr'], // Add your supported languages here
     defaultLocale: 'en',
     pages: {
       '*': ['common'], // Load common namespace for all pages
     },
   };
   ```

3. **Update `next.config.js` to include the `next-translate` configuration:**

   ```javascript
   // next.config.js
   const nextTranslate = require('next-translate');

   module.exports = nextTranslate({
     // Other Next.js configurations
   });
   ```

### 2. Translating Static Content

1. **Create a folder structure for your translations:**

   ```
   /locales
     /en
       common.json
     /es
       common.json
     /fr
       common.json
   ```

2. **Add translation files (`common.json`):**

   ```json
   // locales/en/common.json
   {
     "greeting": "Hello",
     "welcome": "Welcome to our website"
   }

   // locales/es/common.json
   {
     "greeting": "Hola",
     "welcome": "Bienvenido a nuestro sitio web"
   }

   // locales/fr/common.json
   {
     "greeting": "Bonjour",
     "welcome": "Bienvenue sur notre site Web"
   }
   ```

3. **Use `useTranslation` hook in your components:**

   ```javascript
   // pages/index.js
   import useTranslation from 'next-translate/useTranslation';

   const HomePage = () => {
     const { t } = useTranslation('common');
     return (
       <div>
         <h1>{t('greeting')}</h1>
         <p>{t('welcome')}</p>
       </div>
     );
   };

   export default HomePage;
   ```

### 3. Translating Dynamic Content from API

For dynamic content, you can fetch data from your API and use the translations provided by `next-translate`.

1. **Fetch data in `getStaticProps` or `getServerSideProps`:**

   ```javascript
   // pages/[id].js
   import useTranslation from 'next-translate/useTranslation';

   export async function getStaticProps({ params, locale }) {
     const res = await fetch(`https://api.example.com/data/${params.id}?lang=${locale}`);
     const data = await res.json();

     return {
       props: {
         data,
       },
     };
   }

   export async function getStaticPaths() {
     const res = await fetch('https://api.example.com/data');
     const items = await res.json();

     const paths = items.map((item) => ({
       params: { id: item.id },
       locale: 'en', // Add other locales if needed
     }));

     return { paths, fallback: false };
   }

   const ItemPage = ({ data }) => {
     const { t } = useTranslation('common');
     return (
       <div>
         <h1>{data.title}</h1> {/* Assuming the API returns localized content */}
         <p>{data.description}</p> {/* Assuming the API returns localized content */}
       </div>
     );
   };

   export default ItemPage;
   ```

### 4. Handling Locale Changes

To handle locale changes dynamically, you can use a language switcher component.

1. **Create a LanguageSwitcher component:**

   ```javascript
   // components/LanguageSwitcher.js
   import { useRouter } from 'next/router';
   import i18nConfig from '../i18n';

   const LanguageSwitcher = () => {
     const router = useRouter();
     const { locales, locale: currentLocale } = router;
     const { pathname, asPath, query } = router;

     const changeLanguage = (e) => {
       const locale = e.target.value;
       router.push({ pathname, query }, asPath, { locale });
     };

     return (
       <select onChange={changeLanguage} defaultValue={currentLocale}>
         {locales.map((locale) => (
           <option key={locale} value={locale}>
             {locale}
           </option>
         ))}
       </select>
     );
   };

   export default LanguageSwitcher;
   ```

2. **Use the LanguageSwitcher in your layout:**

   ```javascript
   // pages/_app.js
   import LanguageSwitcher from '../components/LanguageSwitcher';
   import '../styles/globals.css';

   function MyApp({ Component, pageProps }) {
     return (
       <>
         <LanguageSwitcher />
         <Component {...pageProps} />
       </>
     );
   }

   export default MyApp;
   ```

By following these steps, you can implement internationalization in your Next.js project using `next-translate`, efficiently handling both static and dynamic content translations.