about summary refs log tree commit diff
path: root/config
diff options
context:
space:
mode:
Diffstat (limited to 'config')
-rw-r--r--config/webpack/generateLocalePacks.js28
-rw-r--r--config/webpack/translationRunner.js27
2 files changed, 43 insertions, 12 deletions
diff --git a/config/webpack/generateLocalePacks.js b/config/webpack/generateLocalePacks.js
index 09fba4a18..b1b818159 100644
--- a/config/webpack/generateLocalePacks.js
+++ b/config/webpack/generateLocalePacks.js
@@ -20,18 +20,25 @@ module.exports = Object.keys(flavours).reduce(function (map, entry) {
   if (!flavour.locales) {
     return map;
   }
-  const locales = readdirSync(flavour.locales).filter(
-    filename => /\.js(?:on)?$/.test(filename) && !/defaultMessages|whitelist|index/.test(filename)
-  );
+  const locales = readdirSync(flavour.locales).filter(filename => {
+    return /\.json$/.test(filename) &&
+      !/defaultMessages/.test(filename) &&
+      !/whitelist/.test(filename);
+  }).map(filename => filename.replace(/\.json$/, ''));
+
+  let inherited_locales_path = null;
+  if (flavour.inherit_locales && flavours[flavour.inherit_locales]?.locales) {
+    inherited_locales_path = flavours[flavour.inherit_locales]?.locales;
+  }
+
   const outPath = resolve('tmp', 'locales', entry);
 
   rimraf.sync(outPath);
   mkdirp.sync(outPath);
 
   locales.forEach(function (locale) {
-    const localeName = locale.replace(/\.js(?:on)?$/, '');
-    const localePath = join(outPath, `${localeName}.js`);
-    const baseLocale = localeName.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
+    const localePath = join(outPath, `${locale}.js`);
+    const baseLocale = locale.split('-')[0]; // e.g. 'zh-TW' -> 'zh'
     const localeDataPath = [
       // first try react-intl
       `node_modules/react-intl/locale-data/${baseLocale}.js`,
@@ -45,21 +52,22 @@ module.exports = Object.keys(flavours).reduce(function (map, entry) {
       filename => filename.replace(/(?:node_modules|app\/javascript)\//, '')
     )[0];
     const localeContent = `//
-// locales/${entry}/${localeName}.js
+// locales/${entry}/${locale}.js
 // automatically generated by generateLocalePacks.js
 //
 
-import messages from '../../../${flavour.locales}/${locale.replace(/\.js$/, '')}';
+${inherited_locales_path ? `import inherited from '../../../${inherited_locales_path}/${locale}.json';` : ''}
+import messages from '../../../${flavour.locales}/${locale}.json';
 import localeData from '${localeDataPath}';
 import { setLocale } from 'locales';
 
 setLocale({
   localeData,
-  messages,
+  ${inherited_locales_path ? 'messages: Object.assign({}, inherited, messages)' : 'messages'},
 });
 `;
     writeFileSync(localePath, localeContent, 'utf8');
-    map[`locales/${entry}/${localeName}`] = localePath;
+    map[`locales/${entry}/${locale}`] = localePath;
   });
 
   return map;
diff --git a/config/webpack/translationRunner.js b/config/webpack/translationRunner.js
index 38050baf8..c7f84cc7e 100644
--- a/config/webpack/translationRunner.js
+++ b/config/webpack/translationRunner.js
@@ -1,11 +1,12 @@
 const fs = require('fs');
 const path = require('path');
-const { default: manageTranslations } = require('react-intl-translations-manager');
+const { default: manageTranslations, readMessageFiles } = require('react-intl-translations-manager');
 
 const RFC5646_REGEXP = /^[a-z]{2,3}(?:-(?:x|[A-Za-z]{2,4}))*$/;
 
 const rootDirectory = path.resolve(__dirname, '..', '..');
-const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales');
+const externalDefaultMessages = path.resolve(rootDirectory, 'app', 'javascript', 'mastodon', 'locales', 'defaultMessages.json');
+const translationsDirectory = path.resolve(rootDirectory, 'app', 'javascript', 'flavours', 'glitch', 'locales');
 const messagesDirectory = path.resolve(rootDirectory, 'build', 'messages');
 const availableLanguages = fs.readdirSync(translationsDirectory).reduce((languages, filename) => {
   const basename = path.basename(filename, '.json');
@@ -86,6 +87,25 @@ validateLanguages(languages, [
   !argv.force && testAvailability,
 ].filter(Boolean));
 
+// Override `provideExtractedMessages` to ignore translation strings provided upstream already
+const provideExtractedMessages = () => {
+  const extractedMessages = readMessageFiles(messagesDirectory);
+  const originalExtractedMessages = JSON.parse(fs.readFileSync(externalDefaultMessages, 'utf8'));
+  const originalKeys = new Set();
+
+  originalExtractedMessages.forEach(file => {
+    file.descriptors.forEach(descriptor => {
+      originalKeys.add(descriptor.id)
+    });
+  });
+
+  extractedMessages.forEach(file => {
+    file.descriptors = file.descriptors.filter((descriptor) => !originalKeys.has(descriptor.id));
+  });
+
+  return extractedMessages.filter((file) => file.descriptors.length > 0);
+};
+
 // manage translations
 manageTranslations({
   messagesDirectory,
@@ -96,4 +116,7 @@ manageTranslations({
   jsonOptions: {
     trailingNewline: true,
   },
+  overrideCoreMethods: {
+    provideExtractedMessages,
+  },
 });