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.localized
subfield(in case of.toObjectLocalized(), .toJSONLocalized()
) or the field itself (.toObjectLocalizedOnly(), .toJSONLocalizedOnly()
). Will useoptions.defaultLocale
if omitted.defaultLocaleName
(String) - locale to fallback, if the value forlocaleName
isundefined
. Will also useoptions.defaultLocale
if omitted.serialization options
(object) - params that are passed down to the nativetoObject/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});
});
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!