2015-02-11 80 views
2

我刚刚进入NodeJS/ExpressJS开发,并且正在寻找一种使用Express创建多语言路线的方法。ExpressJS多国语言路线

app.get('/:language(en|nl)', function (req, res) { 
    res.render('home', { 
    }); 
}); 

app.get('/:language(en|nl)/news', function (req, res) { 
    res.render('news', { 
    }); 
});  

这个想法是提取语言并在MySQL查询中使用它来获取所需语言的数据。 下面的一段代码让我了解语言参数。

req.params.language 

这给我留下了两个问题:

1)是否有可能采用中间件提取的语言,而不是在每个路由这样做呢? 2)如果我的网页包含两个国家/地区标志图标以在不同语言之间进行切换,那么确保返回到同一页面但使用不同语言的最佳做法是什么?以及如何在其他语言中构建href HTML?我打算使用把手作为模板引擎。

+0

你让事情变得复杂。最好的将是使用标准的i18n,区域设置概念。与其他框架不同,ExpressJS也得到了相同的支持。看看[这里](http://www.drzon.net/i18n-for-node-express/) – NarendraSoni 2015-02-12 04:27:23

+0

从我所了解的i18n模块中可以根据浏览器设置的Accept-Language来选择正确的翻译。网页用户是否可以通过点击网页上的国家图标进行更改? – Supercell 2015-02-12 16:12:07

回答

3

这就是我到目前为止所做的,而且相当简单。

它可以在不同语言之间进行切换,并且当用户切换到另一种语言时也可以保持用户在同一页面上。

这还没有完成,但这是一个开始。

这只回答我的第二个问题。语言参数仍然必须在每条路线中提供,但现在我并不介意。

app.js

var express = require('express'); 
var app = express(); 

var handlebars = require('express-handlebars') 
.create({ 
    defaultLayout: 'main' 
}); 
app.engine('handlebars', handlebars.engine); 
app.set('view engine', 'handlebars'); 

app.set('port', process.env.PORT || 3000); 

app.get('/', function (req, res) { 
res.redirect('/nl'); 
}); 

app.get('/:language(en|nl)', function (req, res) { 
res.render('home', { 
    language: req.params.language, 
    originalUrl: '' 
}); 
}); 

app.get('/:language(en|nl)/news', function (req, res) { 
res.render('news', { 
    language: req.params.language, 
    originalUrl: 'news' 
}); 
}); 

// custom 404 page 
app.use(function (req, res) { 
res.type('text/plain'); 
res.status(404); 
res.send('404 - Not Found'); 
}); 

// custom 500 page 
app.use(function (err, req, res, next) { 
console.error(err.stack); 
res.type('text/plain'); 
res.status(500); 
res.send('500 - Server Error'); 
}); 

app.listen(app.get('port'), function() { 
console.log('Express started on http://localhost:' + 
    app.get('port') + '; press Ctrl-C to terminate.'); 
}); 

main.handlebars

<!doctype html> 
<html> 

<head> 
<title>Hello World</title> 
<style type="text/css"> 
    .menu { 
     margin: 0; 
    } 
    .menu > li { 
     display: inline-block; 
     margin: 0; 
     list-style: none; 
    } 
</style> 
</head> 

<body> 
<ul class="menu"> 
    <li><a href="/{{language}}">Home</a></li> 
    <li><a href="/{{language}}/news">News</a></li> 
    <li><a href="/nl/{{originalUrl}}">Dutch</a></li> 
    <li><a href="/en/{{originalUrl}}">English</a></li> 
</ul> 
{{{body}}} 
</body> 

</html> 

home.handlebars

<h1>Home</h1> 
<a href="/{{language}}/page1.html" >Navigation 1</a> 
<a href="/{{language}}/page2.html" >Navigation 2</a> 
<a href="/{{language}}/page3.html" >Navigation 3</a> 

news.handlebars

<h1>News</h1> 
<h2>{{language}}</h2>