3

Currently I have integrated successfully to routes, request and config.

Application Structure

  • app.js - The entry point to our application. This file defines our express server and connects it to MongoDB using mongoose. It also requires the routes and models we'll be using in the application.

  • config/ - This folder contains configuration for passport as well as a central location for configuration/environment variables.

  • routes/ - This folder contains the route definitions for our API.

  • models/ - This folder contains the schema definitions for our Mongoose models.

routes/api/users.js

var mongoose = require('mongoose');
var router = require('express').Router();
var passport = require('passport');
var User = mongoose.model('User');
var auth = require('../auth');

router.post('/users', function(req, res, next){
  var user = new User();

  user.username = req.body.user.username;
  user.email = req.body.user.email;
  user.setPassword(req.body.user.password);

  user.save(req, res).then(function(){
    return res.json({user: user.toAuthJSON()});
  }).catch(next);
});

module.exports = router;

models/User.js

var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');
var crypto = require('crypto');
var jwt = require('jsonwebtoken');
var secret = require('../config').secret;

var UserSchema = new mongoose.Schema({
  username: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/^[a-zA-Z0-9]+$/, 'is invalid'], index: true},
  email: {type: String, lowercase: true, unique: true, required: [true, "can't be blank"], match: [/\S+@\S+\.\S+/, 'is invalid'], index: true},
  bio: String,
  image: String,
  favorites: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Article' }],
  following: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
  hash: String,
  salt: String
}, {timestamps: true});

 /**<<HERE>> Does not work inside the models. <<HERE>>**/
UserSchema.plugin(uniqueValidator, {message: i18n.__('user.register.errors.is_already_taken')});

mongoose.model('User', UserSchema);

app.js

var http = require('http'),
    path = require('path'),
    methods = require('methods'),
    express = require('express'),
    bodyParser = require('body-parser'),
    session = require('express-session'),
    cors = require('cors'),
    passport = require('passport'),
    errorhandler = require('errorhandler'),
    mongoose = require('mongoose');
    cookieParser = require('cookie-parser');
    i18n = require('i18n');

var isProduction = process.env.NODE_ENV === 'production';

// Create global app object
var app = express();

app.use(cors());

app.use(cookieParser())

// Configure i18n
i18n.configure({
  locales:['en', 'es'],
  directory: __dirname + '/locales',
  objectNotation: true,
  //defaultLocale: 'en',
  register: global,
  cookie: 'lang'
})

i18n.init();

// you will need to use cookieParser to expose cookies to req.cookies
app.use(cookieParser());

// i18n init parses req for language headers, cookies, etc.
app.use(i18n.init);

// Support "Accept-Language" : "es" or "en" via headers
app.use(function (req, res, next) {
  i18n.init(req, res);

  if (typeof req.locale !== 'undefined') {
    console.log('locale : ', req.locale);
    i18n.setLocale(req.locale);
  }else{
    var locale = i18n.getLocale();
    res.set('Content-Language', locale);
  }
  next();
});
// finally, let's start our server...
var server = app.listen( process.env.PORT || 3000, function(){
  console.log('Listening on port ' + server.address().port);
});

But when I try translate inside a models/ for example i18n.__('my-key'), this does not detect the locale so this returns the locale for default "en", but from header i receive correctly the lang "es".

Please let me know how I will fix it :)

wilfredonoyola
  • 485
  • 5
  • 12

0 Answers0