UNPKG

6.34 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.LanguageDetector = undefined;
7exports.handle = handle;
8exports.getResourcesHandler = getResourcesHandler;
9exports.missingKeyHandler = missingKeyHandler;
10exports.addRoute = addRoute;
11
12var _utils = require('./utils');
13
14var utils = _interopRequireWildcard(_utils);
15
16var _LanguageDetector = require('./LanguageDetector');
17
18var _LanguageDetector2 = _interopRequireDefault(_LanguageDetector);
19
20function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
22function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
23
24var LanguageDetector = exports.LanguageDetector = _LanguageDetector2.default;
25
26function handle(i18next) {
27 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
28
29 return function i18nextMiddleware(req, res, next) {
30 if (typeof options.ignoreRoutes === 'function') {
31 if (options.ignoreRoutes(req, res, options, i18next)) {
32 return next();
33 }
34 } else {
35 var ignores = options.ignoreRoutes instanceof Array && options.ignoreRoutes || [];
36 for (var i = 0; i < ignores.length; i++) {
37 if (req.path.indexOf(ignores[i]) > -1) return next();
38 }
39 }
40
41 var i18n = i18next.cloneInstance({ initImmediate: false });
42 i18n.on('languageChanged', function (lng) {
43 // Keep language in sync
44 req.language = req.locale = req.lng = lng;
45
46 if (res.locals) {
47 res.locals.language = lng;
48 res.locals.languageDir = i18next.dir(lng);
49 }
50
51 if (!res.headersSent) {
52 res.set('Content-Language', lng);
53 }
54
55 req.languages = i18next.services.languageUtils.toResolveHierarchy(lng);
56
57 if (i18next.services.languageDetector) {
58 i18next.services.languageDetector.cacheUserLanguage(req, res, lng);
59 }
60 });
61
62 var lng = req.lng;
63 if (!req.lng && i18next.services.languageDetector) lng = i18next.services.languageDetector.detect(req, res);
64
65 // set locale
66 req.language = req.locale = req.lng = lng;
67 if (!res.headersSent) {
68 res.set('Content-Language', lng);
69 }
70 req.languages = i18next.services.languageUtils.toResolveHierarchy(lng);
71
72 // trigger sync to instance - might trigger async load!
73 i18n.changeLanguage(lng || i18next.options.fallbackLng[0]);
74
75 if (req.i18nextLookupName === 'path' && options.removeLngFromUrl) {
76 req.url = utils.removeLngFromUrl(req.url, i18next.services.languageDetector.options.lookupFromPathIndex);
77 }
78
79 var t = i18n.t.bind(i18n);
80 var exists = i18n.exists.bind(i18n);
81
82 // assert for req
83 req.i18n = i18n;
84 req.t = t;
85
86 // assert for res -> template
87 if (res.locals) {
88 res.locals.t = t;
89 res.locals.exists = exists;
90 res.locals.i18n = i18n;
91 res.locals.language = lng;
92 res.locals.languageDir = i18next.dir(lng);
93 }
94
95 if (i18next.services.languageDetector) i18next.services.languageDetector.cacheUserLanguage(req, res, lng);
96
97 // load resources
98 if (!req.lng) return next();
99 i18next.loadLanguages(req.lng, function () {
100 next();
101 });
102 };
103};
104
105function getResourcesHandler(i18next, options) {
106 options = options || {};
107 var maxAge = options.maxAge || 60 * 60 * 24 * 30;
108
109 return function (req, res) {
110 if (!i18next.services.backendConnector) return res.status(404).send('i18next-express-middleware:: no backend configured');
111
112 var resources = {};
113
114 res.contentType('json');
115 if (options.cache !== undefined ? options.cache : process.env.NODE_ENV === 'production') {
116 res.header('Cache-Control', 'public, max-age=' + maxAge);
117 res.header('Expires', new Date(new Date().getTime() + maxAge * 1000).toUTCString());
118 } else {
119 res.header('Pragma', 'no-cache');
120 res.header('Cache-Control', 'no-cache');
121 }
122
123 var languages = req.query[options.lngParam || 'lng'] ? req.query[options.lngParam || 'lng'].split(' ') : [];
124 var namespaces = req.query[options.nsParam || 'ns'] ? req.query[options.nsParam || 'ns'].split(' ') : [];
125
126 // extend ns
127 namespaces.forEach(function (ns) {
128 if (i18next.options.ns && i18next.options.ns.indexOf(ns) < 0) i18next.options.ns.push(ns);
129 });
130
131 i18next.services.backendConnector.load(languages, namespaces, function () {
132 languages.forEach(function (lng) {
133 namespaces.forEach(function (ns) {
134 utils.setPath(resources, [lng, ns], i18next.getResourceBundle(lng, ns));
135 });
136 });
137
138 res.send(resources);
139 });
140 };
141};
142
143function missingKeyHandler(i18next, options) {
144 options = options || {};
145
146 return function (req, res) {
147 var lng = req.params[options.lngParam || 'lng'];
148 var ns = req.params[options.nsParam || 'ns'];
149
150 if (!i18next.services.backendConnector) return res.status(404).send('i18next-express-middleware:: no backend configured');
151
152 for (var m in req.body) {
153 i18next.services.backendConnector.saveMissing([lng], ns, m, req.body[m]);
154 }
155 res.send('ok');
156 };
157};
158
159function addRoute(i18next, route, lngs, app, verb, fc) {
160 if (typeof verb === 'function') {
161 fc = verb;
162 verb = 'get';
163 }
164
165 // Combine `fc` and possible more callbacks to one array
166 var callbacks = [fc].concat(Array.prototype.slice.call(arguments, 6));
167
168 for (var i = 0, li = lngs.length; i < li; i++) {
169 var parts = String(route).split('/');
170 var locRoute = [];
171 for (var y = 0, ly = parts.length; y < ly; y++) {
172 var part = parts[y];
173 // if the route includes the parameter :lng
174 // this is replaced with the value of the language
175 if (part === ':lng') {
176 locRoute.push(lngs[i]);
177 } else if (part.indexOf(':') === 0 || part === '') {
178 locRoute.push(part);
179 } else {
180 locRoute.push(i18next.t(part, { lng: lngs[i] }));
181 }
182 }
183
184 var routes = [locRoute.join('/')];
185 app[verb || 'get'].apply(app, routes.concat(callbacks));
186 }
187};
188
189exports.default = {
190 handle: handle,
191 getResourcesHandler: getResourcesHandler,
192 missingKeyHandler: missingKeyHandler,
193 addRoute: addRoute,
194 LanguageDetector: LanguageDetector
195};
\No newline at end of file