chore(i18n): Remove resources' single bundle to reduce package size (#37543)

This commit is contained in:
Tasso Evangelista 2025-11-21 10:09:32 -03:00 committed by GitHub
parent 8596daf01a
commit 5f805f0274
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 95 additions and 32 deletions

View File

@ -37,10 +37,10 @@
"test:e2e:federation": "playwright test --config=playwright-federation.config.ts",
"test:e2e:nyc": "nyc report --reporter=lcovonly",
"testapi": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --config ./.mocharc.api.js",
"testunit": "yarn .testunit:definition && yarn .testunit:client && yarn .testunit:server:cov",
"testunit": "yarn .testunit:definition && yarn .testunit:jest && yarn .testunit:server:cov",
".testunit:server": "mocha --config ./.mocharc.js",
".testunit:server:cov": "nyc -r text -r lcov mocha --config ./.mocharc.js",
".testunit:client": "TZ=UTC TS_NODE_COMPILER_OPTIONS='{\"allowJs\": false}' jest",
".testunit:jest": "TZ=UTC TS_NODE_COMPILER_OPTIONS='{\"allowJs\": false}' jest",
".testunit:definition": "mocha --config ./.mocharc.definition.js",
"testunit-watch": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\"}' mocha --watch --config ./.mocharc.js",
"test": "yarn testunit && yarn testapi",

View File

@ -1,8 +1,80 @@
import { availableTranslationNamespaces, defaultTranslationNamespace, extractTranslationNamespaces } from '@rocket.chat/i18n';
import i18nDict from '@rocket.chat/i18n/dist/resources';
import languages from '@rocket.chat/i18n/dist/languages';
import { i18n } from '../../app/utils/lib/i18n';
// Meteor bundler is incredible (derogatory)
// eslint-disable-next-line no-constant-condition
if (false) {
import('@rocket.chat/i18n/dist/resources/af.i18n.json');
import('@rocket.chat/i18n/dist/resources/ar.i18n.json');
import('@rocket.chat/i18n/dist/resources/az.i18n.json');
import('@rocket.chat/i18n/dist/resources/be-BY.i18n.json');
import('@rocket.chat/i18n/dist/resources/bg.i18n.json');
import('@rocket.chat/i18n/dist/resources/bn-BD.i18n.json');
import('@rocket.chat/i18n/dist/resources/bn-IN.i18n.json');
import('@rocket.chat/i18n/dist/resources/bs.i18n.json');
import('@rocket.chat/i18n/dist/resources/ca.i18n.json');
import('@rocket.chat/i18n/dist/resources/cs.i18n.json');
import('@rocket.chat/i18n/dist/resources/cy.i18n.json');
import('@rocket.chat/i18n/dist/resources/da.i18n.json');
import('@rocket.chat/i18n/dist/resources/de-AT.i18n.json');
import('@rocket.chat/i18n/dist/resources/de-IN.i18n.json');
import('@rocket.chat/i18n/dist/resources/de.i18n.json');
import('@rocket.chat/i18n/dist/resources/el.i18n.json');
import('@rocket.chat/i18n/dist/resources/en.i18n.json');
import('@rocket.chat/i18n/dist/resources/eo.i18n.json');
import('@rocket.chat/i18n/dist/resources/es.i18n.json');
import('@rocket.chat/i18n/dist/resources/et.i18n.json');
import('@rocket.chat/i18n/dist/resources/eu.i18n.json');
import('@rocket.chat/i18n/dist/resources/fa.i18n.json');
import('@rocket.chat/i18n/dist/resources/fi.i18n.json');
import('@rocket.chat/i18n/dist/resources/fr.i18n.json');
import('@rocket.chat/i18n/dist/resources/gl.i18n.json');
import('@rocket.chat/i18n/dist/resources/he.i18n.json');
import('@rocket.chat/i18n/dist/resources/hi-IN.i18n.json');
import('@rocket.chat/i18n/dist/resources/hi.i18n.json');
import('@rocket.chat/i18n/dist/resources/hr.i18n.json');
import('@rocket.chat/i18n/dist/resources/hu.i18n.json');
import('@rocket.chat/i18n/dist/resources/id.i18n.json');
import('@rocket.chat/i18n/dist/resources/it.i18n.json');
import('@rocket.chat/i18n/dist/resources/ja.i18n.json');
import('@rocket.chat/i18n/dist/resources/ka-GE.i18n.json');
import('@rocket.chat/i18n/dist/resources/km.i18n.json');
import('@rocket.chat/i18n/dist/resources/ko.i18n.json');
import('@rocket.chat/i18n/dist/resources/ku.i18n.json');
import('@rocket.chat/i18n/dist/resources/lo.i18n.json');
import('@rocket.chat/i18n/dist/resources/lt.i18n.json');
import('@rocket.chat/i18n/dist/resources/lv.i18n.json');
import('@rocket.chat/i18n/dist/resources/mn.i18n.json');
import('@rocket.chat/i18n/dist/resources/ms-MY.i18n.json');
import('@rocket.chat/i18n/dist/resources/nb.i18n.json');
import('@rocket.chat/i18n/dist/resources/nl.i18n.json');
import('@rocket.chat/i18n/dist/resources/nn.i18n.json');
import('@rocket.chat/i18n/dist/resources/pa-IN.i18n.json');
import('@rocket.chat/i18n/dist/resources/pl.i18n.json');
import('@rocket.chat/i18n/dist/resources/pt-BR.i18n.json');
import('@rocket.chat/i18n/dist/resources/pt.i18n.json');
import('@rocket.chat/i18n/dist/resources/ro.i18n.json');
import('@rocket.chat/i18n/dist/resources/ru.i18n.json');
import('@rocket.chat/i18n/dist/resources/se.i18n.json');
import('@rocket.chat/i18n/dist/resources/si.i18n.json');
import('@rocket.chat/i18n/dist/resources/sk-SK.i18n.json');
import('@rocket.chat/i18n/dist/resources/sl-SI.i18n.json');
import('@rocket.chat/i18n/dist/resources/sq.i18n.json');
import('@rocket.chat/i18n/dist/resources/sr.i18n.json');
import('@rocket.chat/i18n/dist/resources/sv.i18n.json');
import('@rocket.chat/i18n/dist/resources/ta-IN.i18n.json');
import('@rocket.chat/i18n/dist/resources/th-TH.i18n.json');
import('@rocket.chat/i18n/dist/resources/tr.i18n.json');
import('@rocket.chat/i18n/dist/resources/ug.i18n.json');
import('@rocket.chat/i18n/dist/resources/uk.i18n.json');
import('@rocket.chat/i18n/dist/resources/vi-VN.i18n.json');
import('@rocket.chat/i18n/dist/resources/zh-HK.i18n.json');
import('@rocket.chat/i18n/dist/resources/zh-TW.i18n.json');
import('@rocket.chat/i18n/dist/resources/zh.i18n.json');
}
void i18n.init({
lng: 'en',
fallbackLng: 'en',
@ -10,9 +82,13 @@ void i18n.init({
ns: availableTranslationNamespaces,
nsSeparator: '.',
resources: Object.fromEntries(
Object.entries(i18nDict).map(([language, source]) => [
languages.map((language) => [
language,
extractTranslationNamespaces(source as unknown as Record<string, string>),
extractTranslationNamespaces(
// TODO: commonjs is terrible but we don't have esm build yet
// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-dynamic-require
require(`@rocket.chat/i18n/dist/resources/${language}.i18n.json`) as unknown as Record<string, string>,
),
]),
),
initImmediate: false,

View File

@ -1,5 +1,5 @@
import { availableTranslationNamespaces, defaultTranslationNamespace, extractTranslationNamespaces } from '@rocket.chat/i18n';
import i18nDict from '@rocket.chat/i18n/dist/resources';
import languages from '@rocket.chat/i18n/dist/languages';
import i18next from 'i18next';
import sprintf from 'i18next-sprintf-postprocessor';
@ -12,9 +12,13 @@ void i18n.init({
ns: availableTranslationNamespaces,
nsSeparator: '.',
resources: Object.fromEntries(
Object.entries(i18nDict).map(([language, source]) => [
languages.map((language) => [
language,
extractTranslationNamespaces(source as unknown as Record<string, string>),
extractTranslationNamespaces(
// TODO: commonjs is terrible but we don't have esm build yet
// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-dynamic-require
require(`@rocket.chat/i18n/dist/resources/${language}.i18n.json`) as unknown as Record<string, string>,
),
]),
),
initImmediate: false,

View File

@ -9,10 +9,8 @@
"import": "./dist/index.js",
"require": "./dist/index.cjs"
},
"./dist/resources": {
"types": "./dist/resources.d.ts",
"import": "./dist/resources.js",
"require": "./dist/resources.cjs"
"./dist/resources/*": {
"default": "./dist/resources/*"
},
"./dist/languages": {
"types": "./dist/languages.d.ts",

View File

@ -53,30 +53,15 @@ async function build() {
}
// ./resources
const allResources = resources.reduce(
(acc, resource) => {
return {
...acc,
[resource.language]: resource.content,
};
},
{} as Record<string, Record<string, string>>,
);
const allResourcesSerialized = JSON.stringify(allResources, null, 2);
await writeFile(join(distDirectory, 'resources.js'), `export default ${allResourcesSerialized};`);
await writeFile(
join(distDirectory, 'resources.cjs'),
`"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = ${allResourcesSerialized};`,
);
const baseResource = resources.find((r) => r.language === 'en');
if (!baseResource) {
throw new Error('Base resource "en" not found');
}
await writeFile(
join(distDirectory, 'resources.d.ts'),
`export interface RocketchatI18n {
${Object.keys(allResources.en)
${Object.keys(baseResource.content)
.map((key) => `${JSON.stringify(key)}: string;`)
.join('\n\t')}
}