Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Express 车把国际化_Express_Localization_Internationalization_Handlebars.js - Fatal编程技术网

Express 车把国际化

Express 车把国际化,express,localization,internationalization,handlebars.js,Express,Localization,Internationalization,Handlebars.js,我正在尝试将使用Express和Handlebar的应用程序国际化。是否可以让Handlebar片段(片段)加载并呈现本地化资源文件 注意,我已经读过这个问题: 以下是我的目录结构: views/ index.html login.html fragments/ frag1.html frag2.html frag3.html locales/ index.json login.json fragments/

我正在尝试将使用Express和Handlebar的应用程序国际化。是否可以让Handlebar片段(片段)加载并呈现本地化资源文件

注意,我已经读过这个问题:

以下是我的目录结构:

views/
   index.html
   login.html
   fragments/
       frag1.html
       frag2.html
       frag3.html
locales/
   index.json
   login.json
   fragments/
       frag1.json
       frag2.json
       frag3.json
如有必要,我可以将
locales/
目录中的JSON文件分离为如下内容:

locales/
   en-CA/
       index.json
       ...other files
   fr-CA/
       index.json
       ...other files
以下是我的server.js文件中的相关代码:

/。。。
hbs=exphbs.create({
extname:'.html',
布局图:[
__目录名+'/views'
],
partialsDir:[
__dirname+“/views/fragments”
],
助手:{
“json”:函数(上下文){
返回JSON.stringify(上下文);
},
“t”:函数(k){
// ?
}
}
});
app.engine('.html',hbs.engine);
app.set('view engine','html');
t
helper就是我需要的帮助。在我的模板/模板片段中,我有以下内容:

{{t'pageTitle}
{{t'foo'}}

{{t'moreThings'}

我的JSON文件可能如下所示:

locales/
   en-CA/
       index.json
       ...other files
   fr-CA/
       index.json
       ...other files
{
“页面标题”:“你好,世界”,
“foo”:“此处段落内容”,
“更多内容”:“共有%d项内容”
}

另外,我如何处理
printf
参数?

在应用程序中进行国际化意味着做两件事:

1) 确定应使用的区域设置

根据您确定使用的区域设置的方式,在助手中执行此操作可能会很困难。例如,助手无权访问请求对象。老实说,我想不出一个好方法来做这件事,在一个助手

就我个人而言,我使用中间件进行国际化。它们有几个选项来确定给定请求的区域设置。确定区域设置后,它将作为属性添加到请求对象中。因此,您只需要为每个请求确定一次区域设置。另一个优点是,您还可以访问Handlebar辅助对象外部的区域设置

2) 访问资源文件

从帮助器内访问资源文件意味着您应该在帮助器外读取和解析资源文件。每次需要翻译字符串时解析资源文件都会影响性能

在这里你也应该使用中间件。您可以执行下面的伪代码

函数设置(){
//从磁盘加载资源文件并解析它们。
var resources={/*已解析的资源*/}
返回函数(req、res、next){
var语言环境=确定性语言功能(req);
req.getText=函数(标签){
返回资源[本地][标签];
}
}
}
现在,您可以在代码的任何地方使用req.getText函数。就我个人而言,我从来没有在分部中使用语言标签。相反,我使用数据对象传递分部中所需的所有语言字符串。这背后的原因是,我认为partials应该尽可能可重用。在它们内部使用硬编码的语言标签会降低它们的可重用性

当您确实希望在partials中使用getText函数时,可以将getText函数传递给partials

大概是这样的:

locales/
   en-CA/
       index.json
       ...other files
   fr-CA/
       index.json
       ...other files
var objectPassedToPartial={
getText:req.getText
}
像这样使用它:

{{getText 'label'}}

阅读更多有关Mozilla解决方案的信息,我真的很喜欢它。

虽然我不能给你一个明确的答案,但我建议你查看Handlebar的每个助手的实现方式。这可能是一个很好的起点。我还强烈建议使用带编号的占位符(
{0}
而不是
%d
),或者实现复数处理,或者完全避免复数(
“moreThings”:“事物数:{0}”
)。区域设置的数字格式也可能是一个问题。