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.
- Node >= 4.0.0
- Mongoose >= 4.12.2
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:
resource(Object) - document(s) to localizelocaleName(String) - target locale to populate.localizedsubfield(in case of.toObjectLocalized(), .toJSONLocalized()) or the field itself (.toObjectLocalizedOnly(), .toJSONLocalizedOnly()). Will useoptions.defaultLocaleif omitted.defaultLocaleName(String) - locale to fallback, if the value forlocaleNameisundefined. Will also useoptions.defaultLocaleif omitted.serialization options(object) - params that are passed down to the nativetoObject/toJSONschema 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});
});To run the tests you need a local MongoDB instance available. Run with:
npm test
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!