【问题标题】:Handlebars - Access Navigator车把 - Access Navigator
【发布时间】:2016-05-26 04:13:16
【问题描述】:

我正在修改 Ghost 博客的部分内容以使用不同的语言。为此,我正在编写一个 Handlebars 助手:

hbs.registerHelper("language", function () {
        var lang = (navigator.language) ? navigator.language : navigator.userLanguage;  
        return lang;
    });

但是,当消息为 navigator is undefined 时,我收到错误消息。 Ghost 使用的是express-hbs,所以我猜它与自定义风格有关,因为同一个助手was declared here

我在这里遗漏了什么明显的东西?

【问题讨论】:

  • 我认为您的代码在 server.navigator 上运行在浏览器中是全局的。
  • @gujefers 那么调整上面的代码以引用正确的实例的正确方法是什么?
  • 在浏览器中渲染,或者从会话对象中获取语言(可能是请求)
  • @gujefers 澄清一下,这样做的目的是将它传递到一个视图中,我可以在该语言在浏览器中呈现内容之前获取该语言。所以最终我想把它放在助手中。有什么想法吗?
  • 小心使用这种方法——我绝对不会推荐它作为处理多种语言的通用方法。您删除了在您的博客前面有一个缓存层的能力(缓存将存储页面的第一个访问者请求的任何语言),除非您重定向到特定语言的页面,否则您也会向谷歌处罚。谷歌有一些关于如何正确处理多语言网站的细节 - support.google.com/webmasters/answer/182192?hl=en

标签: javascript node.js express handlebars.js ghost-blog


【解决方案1】:
function getLanguage(req){
    ....
}
app.get('/', function (req, res, next) {
    res.render('home', {
        showTitle: true,

        helpers: {
            language: function () { return getLanguage(req); }
        }
    });
});

【讨论】:

    【解决方案2】:

    经过一夜的编码,我发现了这一点。

    index.jsrenderPost 函数中,我可以(以非常原始的方式)查询客户端语言:

    response.post.language = req.headers["accept-language"].substring(0,5).toLowerCase();

    这将在post 对象中创建一个新属性。借助custom conditional helper(放在helpers.js):

    {{#ifCond language '==' 'en-us'}}
         {{content lang="1"}}
    {{else}}
         {{content lang="2"}}
    {{/ifCond}}
    

    core\server\helpers\content.js 中,我已经实现了一个自定义语言解析器,它根据索引显示正确的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 2016-07-31
      • 2012-04-23
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多