Express.js: lenguaje dentro de la URL

Si tienes que hacer un proyecto en diferentes lenguages usando Node.js y Express.js en el que las urls contengan el lenguage a usar, no hay ninguna opción o metodo que por defecto sea el recomenado, sino que hay varias opciones disponibles. Aunque no trates de buscarlas en la documentación: o simplemente se ignora tal problemética o se explica tan por encima que no sirve para nada.

Yo he optado por usar el paquete i18n y crear un middleware que detecte el lenguage dentro de la url (tipo: loquesea.com/es/aqui-el-path) de la siguiente manera:
Nota que estoy usando hbs como view engine.


const express = require('express');
var app = express();
var hbs = require('hbs');
var i18n = require("i18n");
var _ = require('lodash');
app.set('view engine', 'hbs');
// Available languages
let locales = ['es', 'de', 'en', 'fr', 'it'];
// Set up i18n
i18n.configure({
locales: locales, // locales disponibles
defaultLocale: 'en', // local por defecto
directory: __dirname + '/locales' // directorio donse se guardan las traducciones en formato .json
});
// Middleware to detect the locale on url
app.use(function(req,res,next){
// Helper to use i18n inside HBS
res.locals.__ = res.__ = function() {
return i18n.__.apply(req, arguments);
};
// Look for the locale on the first tram of the url
// example: www.example.com/local/path
var path = _.split(req.path, "/", 2)
locales.forEach( (locale) => {
if(path[1] == locale){
// if detected, use it
i18n.setLocale(req, locale);
}
});
next();
})
// Crate a route for every locale
locales.forEach( (locale) => {
app.get('/' + locale, function(req, res) {
res.send(locale);
});
});
view raw app.js hosted with ❤ by GitHub

Creo que hay el código, junto con los comentarios, es suficientemente autoexplicativo.

Otras opciones serían la comentadas en este hilo de Stackoverflow: https://stackoverflow.com/questions/12186644/multi-language-routes-in-express-js

Comentarios

Entradas populares de este blog