Giter Club home page Giter Club logo

nuxt-language-negotiation's Introduction

Nuxt Language Negotiation

This module provides basic multi-language support for a Nuxt 3 app. It's minimal by design and tries to do one thing only.

I created this module because I mostly work on large CMS powered websites that

Features

  • SSR language negotiation/detection based on path prefix, Accept-Language or custom (e.g. via API).
  • Single source of truth for "current language" state
  • Multi-language routes (single route for multiple languages with different path per language)

What it doesn't do

This module is not a replacement for @nuxtjs/i18n and doesn't aim to be one. The following features are not provided and are left to the user of the module:

  • Translations / localization
  • Meta tags / SEO
  • Multi domain
  • Language switcher
  • Multiple strategies (prefix, domain, default)

Usage

Setup

export default defineNuxtConfig({
  modules: ['nuxt-language-negotiation'],

  languageNegotiation: {
    // Define the available languages.
    availableLanguages: ['en', 'de', 'fr', 'it'],

    // We use two negotiators: Path prefix takes precedence. In cases where no
    // path prefix is available, we fallback to Accept-Language headers.
    negotiators: ['pathPrefix', 'acceptLanguage'],

    // Write debug messages to the console on client and server.
    debug: true,
  },
})

Routing

The module assumes the following:

  • Routes generall have a language prefix
    • e.g. /en/search, /de/suche, etc.
  • Routes use a single param for the language prefix
    • e.g. /:language/product/:id.
  • Routes without a language prefix are required to specify the language via route.meta
    • e.g. /german-landing-page only available in German, so it defines de in route.meta.language.
  • Routes without a language prefix but with a specific path for every language specifiy the mapping via route.meta

This means your pages directory should look like this:

pages/
  [language]/
    index.vue
    search.vue
    products/
      [id].vue
      index.vue
  landing-page.vue
  index.vue

Internally the module does not create a route for each language. This means there is a single route for every page in the pages folder. That way you can continue to use und router.push() without having to "translate" the route first:

<template>
  <nuxt-link :to="{ name: 'search' }">Search</nuxt-link>
</template>

When the current language is de, the resulting link will be /de/suche.

nuxt-language-negotiation's People

Contributors

dulnan avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.