一个关于用 Express.js 在 Nodejs 中检测浏览器语言并返回正确文本的问题

发布于 1周前 作者 zlyuanteng 来自 nodejs/Nestjs

一个关于用 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 上面都写一遍这些么 还是说有什么更加聪明的姿势

谢谢大家


9 回复

你的代码放错位置了吧。放在别的路由顶部。


#1 不好意思我不是很理解。。应该是放在哪里的。。我第一次搞这些东西。。

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)来测试不同的语言设置。

回到顶部