UNPKG

5.68 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 (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 // Keep language in sync
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 // set locale
46 req.language = req.locale = req.lng = lng;
47 req.languages = i18next.services.languageUtils.toResolveHierarchy(lng);
48
49 // trigger sync to instance - might trigger async load!
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 // assert for req
60 req.i18n = i18n;
61 req.t = t;
62
63 // assert for res -> template
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 // load resources
75 if (!req.lng) return next();
76 i18next.loadLanguages(req.lng, function () {
77 next();
78 });
79 };
80};
81
82function 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 // extend ns
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
120function 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
136function addRoute(i18next, route, lngs, app, verb, fc) {
137 if (typeof verb === 'function') {
138 fc = verb;
139 verb = 'get';
140 }
141
142 // Combine `fc` and possible more callbacks to one array
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 // if the route includes the parameter :lng
151 // this is replaced with the value of the language
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
166exports.default = {
167 handle: handle,
168 getResourcesHandler: getResourcesHandler,
169 missingKeyHandler: missingKeyHandler,
170 addRoute: addRoute
171};
\No newline at end of file