1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.LanguageDetector = undefined;
|
7 | exports.handle = handle;
|
8 | exports.getResourcesHandler = getResourcesHandler;
|
9 | exports.missingKeyHandler = missingKeyHandler;
|
10 | exports.addRoute = addRoute;
|
11 |
|
12 | var _utils = require('./utils');
|
13 |
|
14 | var utils = _interopRequireWildcard(_utils);
|
15 |
|
16 | var _LanguageDetector = require('./LanguageDetector');
|
17 |
|
18 | var _LanguageDetector2 = _interopRequireDefault(_LanguageDetector);
|
19 |
|
20 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
21 |
|
22 | function _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 |
|
24 | var LanguageDetector = exports.LanguageDetector = _LanguageDetector2.default;
|
25 |
|
26 | function 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 |
|
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 |
|
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 |
|
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 |
|
83 | req.i18n = i18n;
|
84 | req.t = t;
|
85 |
|
86 |
|
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 |
|
98 | if (!req.lng) return next();
|
99 | i18next.loadLanguages(req.lng, function () {
|
100 | next();
|
101 | });
|
102 | };
|
103 | };
|
104 |
|
105 | function 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 |
|
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 |
|
143 | function 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 |
|
159 | function addRoute(i18next, route, lngs, app, verb, fc) {
|
160 | if (typeof verb === 'function') {
|
161 | fc = verb;
|
162 | verb = 'get';
|
163 | }
|
164 |
|
165 |
|
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 |
|
174 |
|
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 |
|
189 | exports.default = {
|
190 | handle: handle,
|
191 | getResourcesHandler: getResourcesHandler,
|
192 | missingKeyHandler: missingKeyHandler,
|
193 | addRoute: addRoute,
|
194 | LanguageDetector: LanguageDetector
|
195 | }; |
\ | No newline at end of file |