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 (req, res, next) {
|
30 | var ignores = options.ignoreRoutes instanceof Array && options.ignoreRoutes || [];
|
31 | for (var i = 0; i < ignores.length; i++) {
|
32 | if (req.path.indexOf(ignores[i]) > -1) return next();
|
33 | }
|
34 |
|
35 | var i18n = i18next.cloneInstance();
|
36 | i18n.on('languageChanged', function (lng) {
|
37 |
|
38 | req.language = req.locale = req.lng = lng;
|
39 | req.languages = i18next.services.languageUtils.toResolveHierarchy(lng);
|
40 | });
|
41 |
|
42 | var lng = req.lng;
|
43 | if (!req.lng && i18next.services.languageDetector) lng = i18next.services.languageDetector.detect(req, res);
|
44 |
|
45 |
|
46 | req.language = req.locale = req.lng = lng;
|
47 | req.languages = i18next.services.languageUtils.toResolveHierarchy(lng);
|
48 |
|
49 |
|
50 | i18n.changeLanguage(lng || i18next.options.fallbackLng[0]);
|
51 |
|
52 | if (req.i18nextLookupName === 'path' && options.removeLngFromUrl) {
|
53 | req.url = utils.removeLngFromUrl(req.url, i18next.services.languageDetector.options.lookupFromPathIndex);
|
54 | }
|
55 |
|
56 | var t = i18n.t.bind(i18n);
|
57 | var exists = i18n.exists.bind(i18n);
|
58 |
|
59 |
|
60 | req.i18n = i18n;
|
61 | req.t = t;
|
62 |
|
63 |
|
64 | if (res.locals) {
|
65 | res.locals.t = t;
|
66 | res.locals.exists = exists;
|
67 | res.locals.i18n = i18n;
|
68 | res.locals.language = lng;
|
69 | res.locals.languageDir = i18next.dir(lng);
|
70 | }
|
71 |
|
72 | if (i18next.services.languageDetector) i18next.services.languageDetector.cacheUserLanguage(req, res, lng);
|
73 |
|
74 |
|
75 | if (!req.lng) return next();
|
76 | i18next.loadLanguages(req.lng, function () {
|
77 | next();
|
78 | });
|
79 | };
|
80 | };
|
81 |
|
82 | function getResourcesHandler(i18next, options) {
|
83 | options = options || {};
|
84 | var maxAge = options.maxAge || 60 * 60 * 24 * 30;
|
85 |
|
86 | return function (req, res) {
|
87 | if (!i18next.services.backendConnector) return res.status(404).send('i18next-express-middleware:: no backend configured');
|
88 |
|
89 | var resources = {};
|
90 |
|
91 | res.contentType('json');
|
92 | if (options.cache !== undefined ? options.cache : process.env.NODE_ENV === 'production') {
|
93 | res.header('Cache-Control', 'public, max-age=' + maxAge);
|
94 | res.header('Expires', new Date(new Date().getTime() + maxAge * 1000).toUTCString());
|
95 | } else {
|
96 | res.header('Pragma', 'no-cache');
|
97 | res.header('Cache-Control', 'no-cache');
|
98 | }
|
99 |
|
100 | var languages = req.query[options.lngParam || 'lng'] ? req.query[options.lngParam || 'lng'].split(' ') : [];
|
101 | var namespaces = req.query[options.nsParam || 'ns'] ? req.query[options.nsParam || 'ns'].split(' ') : [];
|
102 |
|
103 |
|
104 | namespaces.forEach(function (ns) {
|
105 | if (i18next.options.ns && i18next.options.ns.indexOf(ns) < 0) i18next.options.ns.push(ns);
|
106 | });
|
107 |
|
108 | i18next.services.backendConnector.load(languages, namespaces, function () {
|
109 | languages.forEach(function (lng) {
|
110 | namespaces.forEach(function (ns) {
|
111 | utils.setPath(resources, [lng, ns], i18next.getResourceBundle(lng, ns));
|
112 | });
|
113 | });
|
114 |
|
115 | res.send(resources);
|
116 | });
|
117 | };
|
118 | };
|
119 |
|
120 | function missingKeyHandler(i18next, options) {
|
121 | options = options || {};
|
122 |
|
123 | return function (req, res) {
|
124 | var lng = req.params[options.lngParam || 'lng'];
|
125 | var ns = req.params[options.nsParam || 'ns'];
|
126 |
|
127 | if (!i18next.services.backendConnector) return res.status(404).send('i18next-express-middleware:: no backend configured');
|
128 |
|
129 | for (var m in req.body) {
|
130 | i18next.services.backendConnector.saveMissing([lng], ns, m, req.body[m]);
|
131 | }
|
132 | res.send('ok');
|
133 | };
|
134 | };
|
135 |
|
136 | function addRoute(i18next, route, lngs, app, verb, fc) {
|
137 | if (typeof verb === 'function') {
|
138 | fc = verb;
|
139 | verb = 'get';
|
140 | }
|
141 |
|
142 |
|
143 | var callbacks = [fc].concat(Array.prototype.slice.call(arguments, 6));
|
144 |
|
145 | for (var i = 0, li = lngs.length; i < li; i++) {
|
146 | var parts = String(route).split('/');
|
147 | var locRoute = [];
|
148 | for (var y = 0, ly = parts.length; y < ly; y++) {
|
149 | var part = parts[y];
|
150 |
|
151 |
|
152 | if (part === ':lng') {
|
153 | locRoute.push(lngs[i]);
|
154 | } else if (part.indexOf(':') === 0 || part === '') {
|
155 | locRoute.push(part);
|
156 | } else {
|
157 | locRoute.push(i18next.t(part, { lng: lngs[i] }));
|
158 | }
|
159 | }
|
160 |
|
161 | var routes = [locRoute.join('/')];
|
162 | app[verb || 'get'].apply(app, routes.concat(callbacks));
|
163 | }
|
164 | };
|
165 |
|
166 | exports.default = {
|
167 | handle: handle,
|
168 | getResourcesHandler: getResourcesHandler,
|
169 | missingKeyHandler: missingKeyHandler,
|
170 | addRoute: addRoute
|
171 | }; |
\ | No newline at end of file |