Bird
Raised Fist0
NextJSframework~5 mins

Locale detection strategies in NextJS

Choose your learning style10 modes available
Introduction

Locale detection helps your website show content in the right language automatically. It makes visitors feel welcome by speaking their language without asking them.

When you want your website to show different languages based on visitor location.
When you want to remember a user's language choice for future visits.
When you want to redirect users to the correct language version of your site automatically.
When you want to improve user experience by showing content in their preferred language.
When you want to support multiple languages without making users pick manually every time.
Syntax
NextJS
export const middleware = (request) => {
  const locale = request.nextUrl.locale || 'en';
  // Your locale detection logic here
  return NextResponse.next();
};

This example shows a basic middleware function in Next.js to detect locale.

You can access the locale from the request URL or headers.

Examples
This example reads the browser's language preference from headers and rewrites the URL to use that locale.
NextJS
import { NextResponse } from 'next/server';

export function middleware(request) {
  const acceptLanguage = request.headers.get('accept-language');
  const locale = acceptLanguage?.split(',')[0].split('-')[0] || 'en';
  const url = request.nextUrl.clone();
  url.locale = locale;
  return NextResponse.rewrite(url);
}
This example checks if the user has a saved locale in cookies and uses it to set the locale.
NextJS
import { NextResponse } from 'next/server';

export function middleware(request) {
  const cookieLocale = request.cookies.get('NEXT_LOCALE')?.value;
  const locale = cookieLocale || 'en';
  const url = request.nextUrl.clone();
  url.locale = locale;
  return NextResponse.rewrite(url);
}
This example redirects users to the default locale if none is set in the URL.
NextJS
import { NextResponse } from 'next/server';

export function middleware(request) {
  const url = request.nextUrl.clone();
  if (!url.locale || url.locale === 'default') {
    url.locale = 'en';
    return NextResponse.redirect(url);
  }
  return NextResponse.next();
}
Sample Program

This middleware tries to detect the user's locale by first checking a cookie, then the browser's language header, and finally defaults to English. It redirects the user to the URL with the correct locale if needed.

NextJS
import { NextResponse } from 'next/server';

export function middleware(request) {
  // Try to get locale from cookie
  const cookieLocale = request.cookies.get('NEXT_LOCALE')?.value;

  // If no cookie, get from Accept-Language header
  const acceptLanguage = request.headers.get('accept-language');
  const headerLocale = acceptLanguage?.split(',')[0].split('-')[0];

  // Decide locale: cookie > header > default
  const locale = cookieLocale || headerLocale || 'en';

  // Clone URL and set locale
  const url = request.nextUrl.clone();
  url.locale = locale;

  // Redirect to URL with locale if different
  if (request.nextUrl.locale !== locale) {
    return NextResponse.redirect(url);
  }

  return NextResponse.next();
}
OutputSuccess
Important Notes

Always provide a default locale to avoid errors.

Use cookies to remember user language choices for better experience.

Check browser headers carefully as they can contain multiple languages.

Summary

Locale detection helps show the right language automatically.

You can detect locale from cookies, headers, or URL.

Next.js middleware is a good place to handle locale detection and redirects.

Practice

(1/5)
1. What is the main purpose of locale detection in a Next.js application?
easy
A. To change the website layout based on screen size
B. To improve server response time by caching pages
C. To track user clicks for analytics
D. To automatically show the website in the user's preferred language

Solution

  1. Step 1: Understand locale detection purpose

    Locale detection is used to identify the user's language preference automatically.
  2. Step 2: Match purpose to options

    Showing the website in the user's preferred language matches the purpose of locale detection.
  3. Final Answer:

    To automatically show the website in the user's preferred language -> Option D
  4. Quick Check:

    Locale detection = show preferred language [OK]
Hint: Locale detection means showing language automatically [OK]
Common Mistakes:
  • Confusing locale detection with performance optimization
  • Thinking it changes layout instead of language
  • Mixing locale detection with analytics tracking
2. Which Next.js feature is commonly used to configure supported locales for automatic detection?
easy
A. next.config.js i18n field
B. pages/api/locale.js file
C. Custom _document.js file
D. Static CSS files

Solution

  1. Step 1: Identify where locale config is set

    Next.js uses the i18n field inside next.config.js to define supported locales.
  2. Step 2: Check other options

    API files, _document.js, and CSS files do not configure locales.
  3. Final Answer:

    next.config.js i18n field -> Option A
  4. Quick Check:

    Locale config = next.config.js i18n [OK]
Hint: Locales go in next.config.js under i18n [OK]
Common Mistakes:
  • Trying to configure locales in API routes
  • Using _document.js for locale settings
  • Assuming CSS files control language
3. Given this middleware snippet in Next.js, what happens when a user with 'fr' browser language visits the site?
export function middleware(request) {
  const locale = request.headers.get('accept-language')?.split(',')[0].split('-')[0];
  if (locale === 'fr') {
    return Response.redirect(new URL('/fr', request.url));
  }
  return Response.next();
}
medium
A. User is redirected to the homepage
B. User is redirected to the /fr page
C. User gets a 404 error
D. User stays on the current page without redirect

Solution

  1. Step 1: Analyze locale extraction from headers

    The code extracts the first language code from the 'accept-language' header, e.g., 'fr'.
  2. Step 2: Check redirect condition

    If locale is 'fr', the middleware redirects to '/fr' URL.
  3. Final Answer:

    User is redirected to the /fr page -> Option B
  4. Quick Check:

    Locale 'fr' triggers redirect to /fr [OK]
Hint: Check header locale then redirect if matches [OK]
Common Mistakes:
  • Ignoring the redirect and assuming no change
  • Confusing header parsing logic
  • Assuming redirect to homepage always
4. Identify the error in this Next.js middleware code for locale detection:
export function middleware(request) {
  const locale = request.headers.get('accept-language').split(',')[0];
  if (locale === 'en') {
    return Response.redirect(new URL('/en', request.url));
  }
  return Response.next();
}
medium
A. Missing optional chaining on headers.get could cause runtime error
B. Redirect URL is incorrect, should be '/en-US'
C. Response.next() is not a valid method
D. Locale comparison should use locale.includes('en')

Solution

  1. Step 1: Check headers.get usage

    headers.get('accept-language') can return null if header missing, so calling split() without check causes error.
  2. Step 2: Identify fix

    Using optional chaining like headers.get('accept-language')?.split(',')[0] prevents runtime error.
  3. Final Answer:

    Missing optional chaining on headers.get could cause runtime error -> Option A
  4. Quick Check:

    Null header needs optional chaining [OK]
Hint: Always check headers.get may return null [OK]
Common Mistakes:
  • Assuming headers.get always returns string
  • Incorrect redirect URL format
  • Using invalid Response methods
5. You want to detect user locale in Next.js by checking cookie first, then header, and fallback to default 'en'. Which code snippet correctly implements this logic in middleware?
hard
A. const locale = 'en' || request.cookies.get('NEXT_LOCALE') || request.headers.get('accept-language');
B. const locale = request.headers.get('accept-language')?.split(',')[0].split('-')[0] || request.cookies.get('NEXT_LOCALE') || 'en';
C. const locale = request.cookies.get('NEXT_LOCALE') || request.headers.get('accept-language')?.split(',')[0].split('-')[0] || 'en';
D. const locale = request.cookies.get('NEXT_LOCALE') && request.headers.get('accept-language') || 'en';

Solution

  1. Step 1: Understand priority order

    We want to check cookie first, then header, then default 'en'.
  2. Step 2: Analyze each option

    const locale = request.cookies.get('NEXT_LOCALE') || request.headers.get('accept-language')?.split(',')[0].split('-')[0] || 'en'; checks cookie first, then header with safe optional chaining, then 'en'. Others have wrong order or logic.
  3. Final Answer:

    const locale = request.cookies.get('NEXT_LOCALE') || request.headers.get('accept-language')?.split(',')[0].split('-')[0] || 'en'; -> Option C
  4. Quick Check:

    Cookie first, then header, then default [OK]
Hint: Use || in order: cookie, header, default [OK]
Common Mistakes:
  • Checking header before cookie
  • Using && instead of || causing wrong logic
  • Missing optional chaining on header
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard