使用基于i18n的sails.js的国际化功能键入错误

时间:2015-04-19 17:15:24

标签: internationalization sails.js

我尝试使用sails基于i18n的国际化功能。

在我的控制器中它运作良好。但是,我想在我的模型定义中设置它。

请参阅以下代码:

module.exports = {

attributes: {
name:{
  type:'string',
  required:true,
  displayName: sails.__("test")
  },
   ....

不幸的是它不起作用。我有以下错误:

   displayName: sails.__("test")
                     ^
  TypeError: Object [a Sails app] has no method '__'

你有想法吗?

非常感谢任何帮助。

谢谢,

2 个答案:

答案 0 :(得分:0)

  

displayName: sails.__("test")

您正试图静态调用国际化函数 ;也就是说,您已经看到了错误,因为您在.js文件require() d由node.js完成并且sails完成之前,您正在运行该功能负荷。

有两种方法可以解决这个问题。

1。翻译每个查询的值

如果您希望存储displayName的原始值,并在每次查询模型时将其国际化,则可以覆盖toJSON()

  

您可以通过简单地覆盖模型中的默认toJSON函数来操作传出记录,而不是为使用特定模型的每个控制器操作编写自定义代码(包括"开箱即用"蓝图)。

例如:

  attributes: {
    name:{
      type:'string',
      required:true,
    },
    getDisplayName: function () {
      return sails.__(this.name);
    },
    toJSON: function () {
      var obj = this.toObject();
      obj.displayName = sails.__(this.name);
      return obj;
    },
    ...
  }

2。在创建

之前翻译值

在将模型保存到数据库之前,您可以使用Waterline Lifecycle Callbacks将值转换为特定语言

  

Sails在某些操作之前或之后自动调用的模型上公开了一些生命周期回调。例如,我们有时会使用生命周期回调在创建或更新帐户模型之前自动加密密码。

  attributes: {
    name:{
      type:'string',
      required:true,
    },
    displayName: {
      type: 'string'
    },
    ...
  },
  beforeCreate: function (model, next) {
    model.displayName = sails.__(model.name);
    next();
  }

这种国际化的displayName的价值现在将在您的模型中插入数据库之前设置。

让我知道这对你有用。

答案 1 :(得分:0)

您的解决方案很有趣。但是,我的愿望是为每个属性设置一个显示名称。

module.exports = {

attributes: {
name:{
type:'string',
required:true,
displayName: "Your great name"
},
 adress:{
type:'string',
required:true,
displayName: "Where do you live?"
},

...

是否有一个简单或干净的解决方案来应用风帆.__(foreach属性显示属性的名称?

谢谢,