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); | |
}); | |
}); |
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
Publicar un comentario