在Express应用程序中为受支持的语言环境动态设置国家

时间:2014-05-29 11:06:40

标签: node.js express coffeescript

我正在使用node-cldr库(https://github.com/papandreou/node-cldr)进行本地化,并为各个国家/地区提供选项列表http://pastebin.com/jyM5pCLn

territoriesList = cldr.extractTerritoryDisplayNames('en')
countries = _(territoriesList)
              .pairs()
              .filter (pair) -> isNaN(pair[0]) 
              .zipObject()
              .value()


app = express()
maxAgesOption = { maxAge: 86400000 * 30 }
if not config.server.compressAssets then maxAgesOption.maxAge = 0
i18next.backend(gettextSync)
i18next.init(i18nextOptions)
i18next.registerAppHelper(app)
app
  .use( '/css', express.static( "public/css", maxAgesOption) )
  .use( '/js', express.static( "public/js", maxAgesOption) )
  ...
  .set( "countries", countries )

目前,我在'en'设置territoriesList = cldr.extractTerritoryDisplayNames('en')如何从请求中将lang-code推送到此处?

我有这个

.use (req, res, next) ->
      code = i18next.lng().substr(0, 2)
      territoriesList = cldr.extractTerritoryDisplayNames(code)
      countries = []
      regions = []
      territories = __.each territoriesList, (value, index, list) ->
        if (isNaN(index))
          countries[index] = value
        else
          regions[index] = value

但这是为每个请求做的,因为它像中间件一样被添加,即使对于image / css请求,中间件也会为每个请求运行。

但由于这些值不会在请求之间发生变化,只有当用户更改语言时,它才不应该是中间件?

任何建议都非常感激。

1 个答案:

答案 0 :(得分:0)

使用中间件。中间件将根据app.use声明位置执行。如果您在没有语言轮换的情况下发送用户css或图像,请在.use(' / js',express.static(" public / js",maxAgesOption))之后添加此中间件;

对于性能问题,您可以使用任何内存缓存存储,例如Redis。始终从内存存储中获取用户语言代码,当用户更新其设置时,只需将值更改为该用户的内存存储。