 <h2>Middleware recommendation</h2> <p>The answer by @miro is very good but can be improved as in the following middleware in a separate file (as @ebohlman suggests).</p> <h3>The middleware</h3> <pre><code>module.exports = { configure: function(app, i18n, config) { app.locals.i18n = config; i18n.configure(config); }, init: function(req, res, next) { var rxLocale = /^\/(\w\w)/i; if (rxLocale.test(req.url)){ var locale = rxLocale.exec(req.url)[1]; if (req.app.locals.i18n.locales.indexOf(locale) &gt;= 0) req.setLocale(locale); } //else // no need to set the already default next(); }, url: function(app, url) { var locales = app.locals.i18n.locales; var urls = []; for (var i = 0; i &lt; locales.length; i++) urls[i] = '/' + locales[i] + url; urls[i] = url; return urls; } }; </code></pre> <p>Also in sample project in <a href="https://github.com/Wtower/express-experiment/blob/master/services/i18n_urls.js" rel="nofollow">github</a>.</p> <h3>Explanation</h3> <p>The middleware has three functions. The first is a small helper that configures <code>i18n-node</code> and also saves the settings in <code>app.locals</code> (haven't figured out how to access the settings from <code>i18n-node</code> itself).</p> <p>The main one is the second, which takes the locale from the url and sets it in the request object.</p> <p>The last one is a helper which, for a given url, returns an array with all possible locales. Eg calling it with <code>'/about'</code> we would get <code>['/en/about', ..., '/about']</code>.</p> <h3>How to use</h3> <p>In <code>app.js</code>:</p> <pre><code>// include var i18n = require('i18n'); var services = require('./services'); // configure services.i18nUrls.configure(app, i18n, { locales: ['el', 'en'], defaultLocale: 'el' }); // add middleware after static app.use(services.i18nUrls.init); // router app.use(services.i18nUrls.url(app, '/'), routes); </code></pre> <p><a href="https://github.com/Wtower/express-experiment/blob/master/app.js" rel="nofollow">Github link</a></p> <p>The locale can be accessed from eg any controller with <code>i18n-node</code>'s <code>req.getLocale()</code>.</p> <h3>RFC</h3> <p>What @josh3736 recommends is surely compliant with RFC etc. Nevertheless, this is a quite common requirement for many i18n web sites and apps, and even Google respects same resources localised and served under different urls (can verify this in webmaster tools). What I would recommended though is to have the same alias after the lang code, eg <code>/en/home</code>, <code>/de/home</code> etc.</p>