express3手柄和18next节点-基于页面的国际化
express3-handlebars and 18next-node - internationalisation based on page?
我在这里的第一个问题-请放松。我使用express、express3手柄和带有node.js 的i18next节点
该计划是使用不同的翻译命名空间,具体取决于当前提供的视图(即哪个handlerbs文件)。因此,如果我们查看的是名为ie(.hbs)的页面,i18next将在名为ie(.json)的命名空间中查找相关语言。这使得翻译的组织和协调更加容易。
这就是我目前的工作方式:首先,我将当前页面发送到handlers模板中进行渲染(即使这样似乎也没有必要——handlers不会自动公开它正在渲染的文件?):
res.render( url_base_path, { layout: ("sub"), title: title, currentpage: url_base_path } );
然后我访问要在当前页面的命名空间中翻译的变量"greeting",就像{{t "greeting" page=currentpage }}
一样——令人讨厌的是,每个页面上都有10个这样的变量。不要重复你自己,有人吗?
't'是在express3 handlebas create()函数中定义的,类似于helpers: { t: t }
翻译功能看起来像这个
var t = function (i18next_key, options) {
var page, result;
page = options.hash.page;
result = i18next.t(page + ":" + i18next_key);
return new hbs.handlebars.SafeString(result);
};
为了完全公开,这就是我当前页面的(英文)名称空间文件的样子
{
"greeting": "Hello, it appears you're using Internet Explorer, an outdated web browser."
}
这是可行的,但似乎应该有一个更简单的解决方案。
我真正想要的是能够在车把模板中键入{{t "greeting"}}
以获得相同的结果。在不覆盖核心把手功能的情况下,这可能吗?
这是i18下一个文档页面http://i18next.com/pages/doc_features.html
我已经回答了自己的问题——结果比我预期的要容易。
您可以在我的handlebars translate helper(duh?)中访问handlerbs实例,因此在helper:renderer = this
(为了清晰起见)中,您可以只访问renderer.currentpage
来获得所需命名空间的名称。请注意,您仍然需要在render函数中发送currentpage(在res.render()
上),但我同意这一点
我已经这样做了(现在可能很慢,但它正是我想要的):
// Set namespace for translation
options.ns = options.ns || bestNamespaceFor( i18n_key );
result = i18n.t(i18n_key, options);
return new hbs.handlebars.SafeString(result);
function bestNamespaceFor( i18n_key ){
if ( i18n.exists(i18n_key, { ns: renderer.currentpage }) ) return renderer.currentpage;
if ( i18n.exists(i18n_key, { ns: renderer.layout }) ) return renderer.layout;
if ( i18n.exists(i18n_key, { ns: "common" }) ) return "common";
与{{t "my translation key" }}
完美配合,无论在哪里使用,都能获得正确的命名空间。
- ng类应用于页面加载,表达式不真实
- 将函数应用于页面上的所有链接
- 使j查询ajax调用既适用于页面加载,也适用于单击按钮
- 折叠表适用于页面上的所有表
- 有没有办法防止TinyMCE自动专注于页面加载
- 淡入比例效果,但适用于页面
- 哪个 jQuery 事件处理程序适用于页面加载
- Knockout:在创建自定义绑定后,绑定未应用于页面的一部分
- 如何在不依赖于页面中使用的结构/样式的情况下,在页面上的其他元素之上呈现一个元素
- Node.js-样式没有't应用于页面&谷歌Chrome表示:未捕获语法错误:意外的令牌<
- SVG:获取元素相对于页面的位置
- 使用数据属性的引导粘贴仅适用于页面重新加载
- jQuery锚点偏移仅适用于页面加载浏览问题
- 有没有一种简单的替代jQueryMobile的方法,只用于页面转换
- AJAX 仅适用于页面刷新
- 未能专注于页面加载
- CSS未应用于页面
- 获取元素相对于页面的坐标
- 加载依赖于页面的面向对象JS属性的最好方法是什么?
- jQuery -模拟专注于页面