@things-factory/i18n-base 10.1.167 → 10.1.170

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -117,7 +117,14 @@ function setLanguage(context, lng, options = {}) {
117
117
  context.state = Object.assign(context.state || {}, { lng });
118
118
  context.language = context.lng = lng;
119
119
  context.set('content-language', lng);
120
- if (lookupCookie) {
120
+ /*
121
+ * The cookie is the language the screen shows, and the client writes it when that changes. Writing it back on
122
+ * every response took a change back: a request sent before the profile turned the screen Korean answered
123
+ * after it and put en-US back, and the server kept every later request in English. So the server writes it
124
+ * only when the request carried none - a first visit starts in its Accept-Language - or when the deployment
125
+ * fixes one language for everybody.
126
+ */
127
+ if (lookupCookie && (!context.cookies.get(lookupCookie) || disableUserFavoredLanguage)) {
121
128
  context.cookies.set(lookupCookie, lng, {
122
129
  httpOnly: false,
123
130
  signed: false,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/middlewares/koa-i18next/index.ts"],"names":[],"mappings":"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","sourcesContent":["import detect from './detect'\n\nimport { config } from '@things-factory/env'\n\nconst disableUserFavoredLanguage = config.get('i18n/disableUserFavoredLanguage', false)\nconst defaultLanguage = config.get('i18n/defaultLanguage', 'en-US')\n\nexport default function koaI18next(i18next, options = {} as any) {\n return async function i18nextMiddleware(ctx, next) {\n ctx.i18next = i18next\n\n let lng = disableUserFavoredLanguage ? defaultLanguage : detect(ctx, options)\n lng && setLanguage(ctx, lng, options)\n\n ctx.t = function (...args) {\n // do detect path\n if (!lng && isDetectPath(options.order)) {\n lng = detect(ctx, Object.assign(options, { order: ['path'] }))\n lng && setLanguage(ctx, lng, options)\n }\n\n if (args.length === 1) {\n args.push({})\n }\n\n for (let i = 0, len = args.length; i < len; i++) {\n let arg = args[i]\n if (typeof arg === 'object' && !Array.isArray(arg)) {\n arg.lng = lng\n }\n }\n return i18next.t.apply(i18next, args)\n }\n\n await next()\n }\n}\n\nfunction setPath(object, path, newValue) {\n let stack\n if (typeof path !== 'string') stack = [].concat(path)\n if (typeof path === 'string') stack = path.split('.')\n\n while (stack.length > 1) {\n let key = stack.shift()\n if (key.indexOf('###') > -1) key = key.replace(/###/g, '.')\n if (!object[key]) object[key] = {}\n object = object[key]\n }\n\n let key = stack.shift()\n if (key.indexOf('###') > -1) key = key.replace(/###/g, '.')\n object[key] = newValue\n}\n\nkoaI18next.getResourcesHandler = function (i18next, options) {\n options = options || {}\n let maxAge = options.maxAge || 60 * 60 * 24 * 30\n const propertyParam = options.propertyParam || 'query'\n\n return async function (ctx, next) {\n if (options.path && ctx.path !== options.path) {\n return await next()\n }\n if (!i18next.services.backendConnector) return ctx.throw(404, 'koa-i18next-middleware:: no backend configured')\n\n let resources = {}\n\n ctx.type = 'json'\n if (options.cache !== undefined ? options.cache : process.env.NODE_ENV === 'production') {\n ctx.set('Cache-Control', 'public, max-age=' + maxAge)\n ctx.set('Expires', new Date(new Date().getTime() + maxAge * 1000).toUTCString())\n } else {\n ctx.set('Pragma', 'no-cache')\n ctx.set('Cache-Control', 'no-cache')\n }\n\n let languages = ctx[propertyParam][options.lngParam || 'lng']\n ? ctx[propertyParam][options.lngParam || 'lng'].split(' ')\n : []\n let namespaces = ctx[propertyParam][options.nsParam || 'ns']\n ? ctx[propertyParam][options.nsParam || 'ns'].split(' ')\n : []\n\n // extend ns\n namespaces.forEach(ns => {\n if (i18next.options.ns && i18next.options.ns.indexOf(ns) < 0) i18next.options.ns.push(ns)\n })\n\n i18next.services.backendConnector.load(languages, namespaces, function () {\n languages.forEach(lng => {\n namespaces.forEach(ns => {\n setPath(resources, [lng, ns], i18next.getResourceBundle(lng, ns))\n })\n })\n ctx.body = resources\n })\n }\n}\n\nkoaI18next.getMissingKeyHandler = function (i18next, options) {\n options = options || {}\n const propertyParam = options.propertyParam || 'query'\n\n return async function (ctx, next) {\n if (options.path && ctx.path !== options.path) {\n return await next()\n }\n let lng = ctx[propertyParam][options.lngParam || 'lng']\n let ns = ctx[propertyParam][options.nsParam || 'ns']\n\n if (!i18next.services.backendConnector) return ctx.throw(404, 'koa-i18next-middleware:: no backend configured')\n\n for (var m in ctx.request.body) {\n i18next.services.backendConnector.saveMissing([lng], ns, m, ctx.request.body[m])\n }\n ctx.body = 'ok'\n }\n}\n\nfunction isDetectPath(order = []) {\n return order.indexOf('path') !== -1\n}\n\nfunction setLanguage(context, lng, options = {} as any) {\n const { lookupCookie, lookupPath, lookupSession } = options\n context.locals = Object.assign(context.locals || {}, { lng })\n context.state = Object.assign(context.state || {}, { lng })\n context.language = context.lng = lng\n context.set('content-language', lng)\n\n if (lookupCookie) {\n context.cookies.set(lookupCookie, lng, {\n httpOnly: false,\n signed: false,\n sameSite: 'strict'\n })\n }\n if (lookupSession && context.session) {\n context.session[lookupSession] = lng\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/middlewares/koa-i18next/index.ts"],"names":[],"mappings":"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","sourcesContent":["import detect from './detect'\n\nimport { config } from '@things-factory/env'\n\nconst disableUserFavoredLanguage = config.get('i18n/disableUserFavoredLanguage', false)\nconst defaultLanguage = config.get('i18n/defaultLanguage', 'en-US')\n\nexport default function koaI18next(i18next, options = {} as any) {\n return async function i18nextMiddleware(ctx, next) {\n ctx.i18next = i18next\n\n let lng = disableUserFavoredLanguage ? defaultLanguage : detect(ctx, options)\n lng && setLanguage(ctx, lng, options)\n\n ctx.t = function (...args) {\n // do detect path\n if (!lng && isDetectPath(options.order)) {\n lng = detect(ctx, Object.assign(options, { order: ['path'] }))\n lng && setLanguage(ctx, lng, options)\n }\n\n if (args.length === 1) {\n args.push({})\n }\n\n for (let i = 0, len = args.length; i < len; i++) {\n let arg = args[i]\n if (typeof arg === 'object' && !Array.isArray(arg)) {\n arg.lng = lng\n }\n }\n return i18next.t.apply(i18next, args)\n }\n\n await next()\n }\n}\n\nfunction setPath(object, path, newValue) {\n let stack\n if (typeof path !== 'string') stack = [].concat(path)\n if (typeof path === 'string') stack = path.split('.')\n\n while (stack.length > 1) {\n let key = stack.shift()\n if (key.indexOf('###') > -1) key = key.replace(/###/g, '.')\n if (!object[key]) object[key] = {}\n object = object[key]\n }\n\n let key = stack.shift()\n if (key.indexOf('###') > -1) key = key.replace(/###/g, '.')\n object[key] = newValue\n}\n\nkoaI18next.getResourcesHandler = function (i18next, options) {\n options = options || {}\n let maxAge = options.maxAge || 60 * 60 * 24 * 30\n const propertyParam = options.propertyParam || 'query'\n\n return async function (ctx, next) {\n if (options.path && ctx.path !== options.path) {\n return await next()\n }\n if (!i18next.services.backendConnector) return ctx.throw(404, 'koa-i18next-middleware:: no backend configured')\n\n let resources = {}\n\n ctx.type = 'json'\n if (options.cache !== undefined ? options.cache : process.env.NODE_ENV === 'production') {\n ctx.set('Cache-Control', 'public, max-age=' + maxAge)\n ctx.set('Expires', new Date(new Date().getTime() + maxAge * 1000).toUTCString())\n } else {\n ctx.set('Pragma', 'no-cache')\n ctx.set('Cache-Control', 'no-cache')\n }\n\n let languages = ctx[propertyParam][options.lngParam || 'lng']\n ? ctx[propertyParam][options.lngParam || 'lng'].split(' ')\n : []\n let namespaces = ctx[propertyParam][options.nsParam || 'ns']\n ? ctx[propertyParam][options.nsParam || 'ns'].split(' ')\n : []\n\n // extend ns\n namespaces.forEach(ns => {\n if (i18next.options.ns && i18next.options.ns.indexOf(ns) < 0) i18next.options.ns.push(ns)\n })\n\n i18next.services.backendConnector.load(languages, namespaces, function () {\n languages.forEach(lng => {\n namespaces.forEach(ns => {\n setPath(resources, [lng, ns], i18next.getResourceBundle(lng, ns))\n })\n })\n ctx.body = resources\n })\n }\n}\n\nkoaI18next.getMissingKeyHandler = function (i18next, options) {\n options = options || {}\n const propertyParam = options.propertyParam || 'query'\n\n return async function (ctx, next) {\n if (options.path && ctx.path !== options.path) {\n return await next()\n }\n let lng = ctx[propertyParam][options.lngParam || 'lng']\n let ns = ctx[propertyParam][options.nsParam || 'ns']\n\n if (!i18next.services.backendConnector) return ctx.throw(404, 'koa-i18next-middleware:: no backend configured')\n\n for (var m in ctx.request.body) {\n i18next.services.backendConnector.saveMissing([lng], ns, m, ctx.request.body[m])\n }\n ctx.body = 'ok'\n }\n}\n\nfunction isDetectPath(order = []) {\n return order.indexOf('path') !== -1\n}\n\nfunction setLanguage(context, lng, options = {} as any) {\n const { lookupCookie, lookupPath, lookupSession } = options\n context.locals = Object.assign(context.locals || {}, { lng })\n context.state = Object.assign(context.state || {}, { lng })\n context.language = context.lng = lng\n context.set('content-language', lng)\n\n /*\n * The cookie is the language the screen shows, and the client writes it when that changes. Writing it back on\n * every response took a change back: a request sent before the profile turned the screen Korean answered\n * after it and put en-US back, and the server kept every later request in English. So the server writes it\n * only when the request carried none - a first visit starts in its Accept-Language - or when the deployment\n * fixes one language for everybody.\n */\n if (lookupCookie && (!context.cookies.get(lookupCookie) || disableUserFavoredLanguage)) {\n context.cookies.set(lookupCookie, lng, {\n httpOnly: false,\n signed: false,\n sameSite: 'strict'\n })\n }\n if (lookupSession && context.session) {\n context.session[lookupSession] = lng\n }\n}\n"]}