2012-08-07 182 views

回答

45

您可以使用req.headers [「接受語言」]獲得語言/區域的用戶已在其瀏覽器中設置。

要獲得更容易的支持,您可能需要查看locale module

+1

req.headers [「accept-language」]返回:「uk,ru; q = 0.8,en-us; q = 0.5,en; q = 0.3」所選語言爲「uk」。如何從列表中獲得這種語言? – 2012-08-07 12:15:21

+4

@OlegDats語言環境模塊將幫助您解析該問題,但基本上這意味着,用戶需要的語言環境(優先順序)英國英語,俄語ru,俄語en,美國英語en英語),q是權重因子,q越高意味着偏好越高。 – 2012-08-07 12:19:01

+9

@JoachimIsaksson英國不是英語,那將是'en-gb'。可能英國人是烏克蘭人。前兩個字母總是lanuages,而不是地區。 – UpTheCreek 2012-09-04 06:45:07

22

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

請參見:http://expressjs.com/en/api.html#req.acceptsLanguages

+2

基礎包是談判代表https://github.com/federomero/negotiator – 2014-03-20 11:54:16

+5

不再是真正的快遞4 – Offirmo 2014-09-27 15:29:15

+1

在Express 4中,您可以使用'req.acceptedLanguages'作爲檢查用戶是否接受單個或列表語言。檢查出來:http://blog.hubii.com/dev-detecting-header-language-on-express-js/ – miduga 2015-08-28 09:46:16

15

隨着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'); 
     ... 
    } 
}); 

要獲得所有接受語言列表,使用快遞4.x版本,也可以使用該模塊accepts

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

實際上,'req.acceptsLanguages'只是使用接受模塊下的「應用」所以如果你不傳遞任何參數,你會得到相同的語言列表(作爲首選項的數組)。請注意,雖然沒有文檔化的行爲,但Express文檔聲稱需要'lang'參數。 – Inkling 2016-01-20 03:28:12

0

您需要解析字符串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以上)。