【问题标题】:How can I get the browser language in node.js (express.js)?如何在 node.js (express.js) 中获取浏览器语言?
【发布时间】:2012-08-04 10:31:50
【问题描述】:

用户请求某个页面,我想知道(在服务器端)他/她的浏览器中的语言是什么。所以我可以用正确的消息渲染模板。

在客户端这很简单:

var language = window.navigator.userLanguage || window.navigator.language

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    您可以使用 req.headers["accept-language"] 来获取用户在其浏览器中设置的语言/区域设置。

    为了更容易获得支持,您可能需要查看locale module

    【讨论】:

    • req.headers["accept-language"] 返回:"uk,ru;q=0.8,en-us;q=0.5,en;q=0.3" 选择的语言是 "uk"。如何从列表中获取该语言?
    • @OlegDats 语言环境模块将帮助您解析,但基本上它的意思是,用户想要语言环境(按优先顺序)uk(英国英语),ru(俄语),en-us( US English), en(plain English), q是权重因子,q越高偏好越高。
    • @JoachimIsaksson uk 不是英国英语,应该是“en-gb”。可能英国是乌克兰人。前两个字母总是语言,而不是地区。
    【解决方案2】:

    request.acceptsLanguages 将包含request.headers['accept-language'] 的解析版本。

    见:http://expressjs.com/en/api.html#req.acceptsLanguages

    【讨论】:

    【解决方案3】:

    使用 Express 4.x,您可以使用 req.acceptsLanguages(lang [, ...]) 中的构建来检查是否接受某些语言。

    var express = require('express');
    app.get('/translation', function(request, response) {
        var lang = request.acceptsLanguages('fr', 'es', 'en');
        if (lang) {
            console.log('The first accepted of [fr, es, en] is: ' + lang);
            ...
        } else {
            console.log('None of [fr, es, en] is accepted');
            ...
        }
    });
    

    要获取所有接受语言的列表,使用 Express 4.x,您可以使用模块 accepts

    var express = require('express'), accepts = require('accepts');
    app.get('/translation', function(request, response) {
        console.log(accepts(request).languages());
        ...
    });
    

    【讨论】:

    • 实际上,req.acceptsLanguages 只是在后台使用接受模块执行 apply,因此如果您不传递任何参数,您将获得相同的语言列表(作为按优先顺序排列)。请注意,虽然没有记录在案的行为,但 Express 文档说 lang 参数是必需的。
    【解决方案4】:

    您需要解析req.headers["accept-language"] 中的字符串。这将为您提供客户首选语言的优先列表。您也可以查看req.acceptsLanguages(lang [, ...]) 是否支持您的语言。

    我强烈建议使用express-request-language 来进行任何语言匹配工作,因为第一次就很难做到正确。

    大多数时候,匹配一种语言是不够的。用户可能想要更改首选语言。 express-request-language 帮助您将首选语言存储在 cookie 中,它还为您的服务器提供 URL 路径以更改首选语言。

    只需几行代码即可完成上述所有功能:

    app.use(requestLanguage({
      languages: ['en-US', 'zh-CN'],
      cookie: {
        name: 'language',
        options: { maxAge: 24*3600*1000 },
        url: '/languages/{language}'
      }
    }));
    

    如果不匹配,中间件也会匹配默认语言(en-US 以上)。

    【讨论】:

      【解决方案5】:

      设置请求语言并全局使用的中间件:

      // place this middleware before declaring any routes
      app.use((req, res, next) => {
          // This reads the accept-language header
          // and returns the language if found or false if not
          const lang = req.acceptsLanguages('bg', 'en')
          
          if (lang) { // if found, attach it as property to the request
              req.lang = lang
          } else { // else set the default language
              req.lang = 'en'
          }
      
          next()
      })
      

      现在您可以访问“req.lang”

      app.get('/', (req, res) => {
          res.send(`The request language is '${req.lang}'`)
      })
      

      翻译示例

      const translate = {
          en: {
              helloWorld: "Hello World!"
          },
          bg: {
              helloWorld: "Здравей Свят!"
          }
      }
      app.get('/hello-world', (req, res) => {
          res.send(translate[req.lang].helloWorld)
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-29
        • 2018-08-29
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多