Skip to content

Spown/mongoose-i18n-localize

 
 

Repository files navigation

mongoose-i18n-localize

mongoose-i18n-localize is a mongoose plugin to support i18n and localization in your mongoose schemas.

It seems like mongoose-i18n is not longer supported and I didn't get it to work on my machine, so I decided to write my own version.

Requirements

  • Node >= 4.0.0
  • Mongoose >= 4.12.2

Usage

npm install mongoose-i18n-localize

Create your schema:

var mongoose = require('mongoose');
var mongooseI18n = require('mongoose-i18n-localize');

var schema = new mongoose.Schema({
	name: {
		type: String,
		i18n: true
	}
});

schema.plugin(mongooseI18n, {
	locales: ['en', 'de'],
	defaultLocale: 'de' // if not specified or invalid - will assume locales[0]
});

var Model = mongoose.model('Name', schema);

This will create a structure like:

{
	name: {
		en: String,
		de: String
	}
}

All validators of name get also assigned to name.en and name.de.

Currently these field types (or an Array of these) support i18n: String, Number, Boolean, Date.

mongoose-i18n-localize adds the methods toObjectLocalized() and toJSONLocalized() to the i18n schema methods. To set the locale of a resource to en, just do:

Model.find(function(err, resources) {
	var localizedResources = resources.toJSONLocalized('en');
});

//or

Model.find(function(err, resources) {
	var localizedResources = Model.schema.methods.toJSONLocalized(resources, 'en');
});

localizedResources has now the following structure:

[
	{
		name: {
			en: 'hello',
			de: 'hallo',
			localized: 'hello'
		}
	}
]

Use toObjectLocalized or toJSONLocalized according to toObject or toJSON.

If you want the fields to assume only the localized values use the methods toObjectLocalizedOnly() or toJSONLocalizedOnly().

Model.find(function(err, resources) {
	var localizedResources = resources.toJSONLocalizedOnly('de');
});

localizedResources has now the following structure:

[
	{
		name: 'hallo'
	}
]

All methods accept 3 optional arguments:

  1. resource (Object) - document(s) to localize
  2. localeName (String) - target locale to populate .localized subfield(in case of .toObjectLocalized(), .toJSONLocalized()) or the field itself (.toObjectLocalizedOnly(), .toJSONLocalizedOnly()). Will use options.defaultLocale if omitted.
  3. defaultLocaleName (String) - locale to fallback, if the value for localeName is undefined. Will also use options.defaultLocale if omitted.
  4. serialization options (object) - params that are passed down to the native toObject/toJSON schema methods.
Model.find(function(err, resources) {
   var localizedResources;
   localizedResources = resources.toJSONLocalized();
   localizedResources = resources.toJSONLocalizedOnly('de');
   localizedResources = resources.toObjectLocalized(resources, 'de', 'en');
   localizedResources = resources.toObjectLocalizedOnly('de', 'en');
   localizedResources = resources.toObjectLocalized(resources, 'de', 'en', {getters: true});
   localizedResources = resources.toObjectLocalizedOnly('de', 'en', {getters: true});
   localizedResources = resources.toObjectLocalizedOnly({getters: true});
});

Tests

To run the tests you need a local MongoDB instance available. Run with:

npm test

Issues

Please use the GitHub issue tracker to raise any problems or feature requests.

If you would like to submit a pull request with any changes you make, please feel free!

About

Mongoose plugin to support i18n and localization

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 100.0%