From 344575dde18fff93fb8b60c33a44989eca157f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 25 Mar 2021 20:21:47 -0400 Subject: [PATCH] feat: add hooks to language loading (#9426) and flushNamespace method --- public/src/modules/translator.js | 26 +++++++++++++++++++++++++- src/languages.js | 9 ++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/public/src/modules/translator.js b/public/src/modules/translator.js index b83a5a450f..da6335a20b 100644 --- a/public/src/modules/translator.js +++ b/public/src/modules/translator.js @@ -2,7 +2,19 @@ (function (factory) { function loadClient(language, namespace) { - return Promise.resolve(jQuery.getJSON([config.assetBaseUrl, 'language', language, namespace].join('/') + '.json?' + config['cache-buster'])); + return new Promise(function (resolve, reject) { + jQuery.getJSON([config.assetBaseUrl, 'language', language, namespace].join('/') + '.json?' + config['cache-buster'], function (data) { + const payload = { + language: language, + namespace: namespace, + data: data, + }; + $(window).trigger('action:translator.loadClient', payload); + resolve(payload.promise ? Promise.resolve(payload.promise) : data); + }).fail(function (jqxhr, textStatus, error) { + reject(new Error(textStatus + ', ' + error)); + }); + }); } var warn = function () { console.warn.apply(console, arguments); }; if (typeof define === 'function' && define.amd) { @@ -549,6 +561,18 @@ }); }, + flushNamespace: function (namespace) { + Object.keys(Translator.cache).forEach(function (code) { + if (Translator.cache[code] && + Translator.cache[code].translations && + Translator.cache[code].translations[namespace] + ) { + Translator.cache[code].translations[namespace] = null; + } + }); + }, + + /** * Legacy translator function for backwards compatibility */ diff --git a/src/languages.js b/src/languages.js index d19f5798fb..200ec2a191 100644 --- a/src/languages.js +++ b/src/languages.js @@ -4,6 +4,7 @@ const fs = require('fs'); const path = require('path'); const utils = require('./utils'); const { paths } = require('./constants'); +const plugins = require('./plugins'); const Languages = module.exports; const languagesPath = path.join(__dirname, '../build/public/language'); @@ -13,7 +14,13 @@ Languages.timeagoCodes = files.filter(f => f.startsWith('jquery.timeago')).map(f Languages.get = async function (language, namespace) { const data = await fs.promises.readFile(path.join(languagesPath, language, `${namespace}.json`), 'utf8'); - return JSON.parse(data) || {}; + const parsed = JSON.parse(data) || {}; + const result = await plugins.hooks.fire('filter:languages.get', { + language, + namespace, + data: parsed, + }); + return result.data; }; let codeCache = null;