一个关于用 Express.js 在 Nodejs 中检测浏览器语言并返回正确文本的问题
一个关于用 Express.js 在 Nodejs 中检测浏览器语言并返回正确文本的问题
大家好 请问怎样才能用 Express.js 达到以下效果:
Client 访问一个网站任意页面后:
如果 cookie 已经有保存过偏好语言 比如说 en
那么 Server 就返回英语的文本
不然就
检测浏览器语言 比如说检测到 ja 存入 cookie 返回日语文本
我现在做到这样:
var lang = null;
app.use(function(req, res, next) {
lang = req.cookies.lang;
if (!lang) {
lang = req.acceptsLanguages('en', 'zh-cn', 'zh-hk', 'zh-sg', 'zh-tw');
switch (lang) {
case 'zh-cn' || 'zh-sg':
lang = 'zh-Hans';
break;
case 'zh-hk' || 'zh-tw':
lang = 'zh-Hant';
break;
default:
lang = 'en';
}
res.cookie('lang', lang, {path: '/', httpOnly: true});
}
next();
});
问题是这个 function 好像只是作用在 '/'
上面 难道我要在每一个 url 的 router 上面都写一遍这些么 还是说有什么更加聪明的姿势
谢谢大家
你的代码放错位置了吧。放在别的路由顶部。
app.use 的先后顺序会有影响,把这个放在最前面
<br>var app = express()<br><br>// 没有挂载路径的中间件,应用的每个请求都会执行该中间件<br>app.use(function (req, res, next) {<br> console.log('我放在最前面,先过我这里。'))<br> next()<br>})<br><br>// 挂载至 /xxx 的中间件<br>app.use('/xxx', function (req, res, next) {<br> console.log('我是路由 xxx')<br> next()<br>})<br>
看看文档理解下,express 用一两次就很熟悉了,没几个 api
是要返回 lang 变量的值?还是 lang 变量对应语言的文本的值?
#3 #4 谢谢两位 我好像搞懂了
#6 是返回 lang 对应语言的文本的 value
#4 我一开始看到在官方文档上面写着 app.use 里面 path 的 default 是 ‘/’ 想着没有 specify path 的话只会在 root 有 request 的时候执行 结果发现我这个应该算是 middleware 是所有 request 都会执行的 😅
在 Express.js 中检测浏览器语言并返回相应的文本,可以通过使用 accepts
模块来实现。accepts
模块可以根据请求的 Accept-Language
头部来确定客户端的首选语言。以下是一个简单的示例代码,展示了如何实现这一功能:
首先,确保你已经安装了 Express 和 accepts
模块:
npm install express accepts
然后,你可以编写如下的代码:
const express = require('express');
const accepts = require('accepts');
const app = express();
// 定义一个简单的语言映射
const messages = {
'en': 'Hello, World!',
'es': '¡Hola, Mundo!',
'fr': 'Bonjour, le monde!',
};
app.get('/', (req, res) => {
const lang = accepts(req).language();
const message = messages[lang] || messages['en']; // 默认英语
res.send(message);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个示例中,当客户端发起请求时,accepts(req).language()
会解析 Accept-Language
头部,并返回一个最合适的语言标签(如 ‘en’, ‘es’, ‘fr’)。然后,代码会查找相应的消息并返回给客户端。如果请求中没有包含 Accept-Language
头部或者语言标签不匹配,则会返回默认的英语消息。
你可以通过修改浏览器的请求头部或者使用工具(如 Postman)来测试不同的语言设置。