From 138fadf672539a2e6187ddbae995dbda8ad07437 Mon Sep 17 00:00:00 2001 From: Nybkox Date: Thu, 27 Feb 2025 13:35:40 +0100 Subject: [PATCH] feat: compile messages --- packages/web/package.json | 1 + packages/web/src/translations.ts | 39 +++++++++++++++++++----- yarn.lock | 51 ++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 8 deletions(-) diff --git a/packages/web/package.json b/packages/web/package.json index 21212e0f2..b3caea15f 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -58,6 +58,7 @@ "uuid": "^3.4.0" }, "dependencies": { + "@messageformat/core": "^3.4.0", "chartjs-plugin-zoom": "^1.2.0", "date-fns": "^4.1.0", "debug": "^4.3.4", diff --git a/packages/web/src/translations.ts b/packages/web/src/translations.ts index aa8d39143..2e72c30a1 100644 --- a/packages/web/src/translations.ts +++ b/packages/web/src/translations.ts @@ -1,16 +1,23 @@ import enUS from '../../../translations/en-US.json'; import csCZ from '../../../translations/cs-CZ.json'; + +import MessageFormat, { MessageFunction } from '@messageformat/core'; import { getStringSettingsValue } from './settings/settingsTools'; const translations = { 'en-US': enUS, 'cs-CZ': csCZ, }; +const supportedLanguages = Object.keys(translations); + +const compiledMessages: Partial>>> = {}; export function getSelectedLanguage(): string { const borwserLanguage = getBrowserLanguage(); - const selectedLanguage = getStringSettingsValue('localization.language', borwserLanguage); + + if (!supportedLanguages.includes(selectedLanguage)) return 'en-US'; + return selectedLanguage; } @@ -26,18 +33,34 @@ type TranslateOptions = { values?: Record; }; -export function _t(key: string, options: TranslateOptions): string { - const { defaultMessage } = options; - - const selectedLanguage = getSelectedLanguage(); - const selectedTranslations = translations[selectedLanguage] ?? enUS; - +function getTranslation(key: string, defaultMessage: string, language: string) { + const selectedTranslations = translations[language] ?? enUS; const translation = selectedTranslations[key]; if (!translation) { - console.warn(`Translation not found for key: ${key}. For language: ${selectedLanguage}`); + console.warn(`Translation not found for key: ${key}. For language: ${language}`); return defaultMessage; } return translation; } + +export function _t(key: string, options: TranslateOptions): string { + const { defaultMessage, values } = options; + + const selectedLanguage = getSelectedLanguage(); + + if (!compiledMessages[selectedLanguage]) { + compiledMessages[selectedLanguage] = {}; + } + + if (!compiledMessages[selectedLanguage][key]) { + const translation = getTranslation(key, defaultMessage, selectedLanguage); + const complied = new MessageFormat(selectedLanguage).compile(translation); + compiledMessages[selectedLanguage][key] = complied; + } + + const compliledTranslation = compiledMessages[selectedLanguage][key]; + + return compliledTranslation(values ?? {}); +} diff --git a/yarn.lock b/yarn.lock index 74b163fd4..a6f960d95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1708,6 +1708,42 @@ resolved "https://registry.yarnpkg.com/@mdi/font/-/font-7.4.47.tgz#2ae522867da3a5c88b738d54b403eb91471903af" integrity sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw== +"@messageformat/core@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@messageformat/core/-/core-3.4.0.tgz#2814c23383dec7bddf535d54f2a03e410165ca9f" + integrity sha512-NgCFubFFIdMWJGN5WuQhHCNmzk7QgiVfrViFxcS99j7F5dDS5EP6raR54I+2ydhe4+5/XTn/YIEppFaqqVWHsw== + dependencies: + "@messageformat/date-skeleton" "^1.0.0" + "@messageformat/number-skeleton" "^1.0.0" + "@messageformat/parser" "^5.1.0" + "@messageformat/runtime" "^3.0.1" + make-plural "^7.0.0" + safe-identifier "^0.4.1" + +"@messageformat/date-skeleton@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@messageformat/date-skeleton/-/date-skeleton-1.1.0.tgz#3bad068cbf5873d14592cfc7a73dd4d8615e2739" + integrity sha512-rmGAfB1tIPER+gh3p/RgA+PVeRE/gxuQ2w4snFWPF5xtb5mbWR7Cbw7wCOftcUypbD6HVoxrVdyyghPm3WzP5A== + +"@messageformat/number-skeleton@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz#e7c245c41a1b2722bc59dad68f4d454f761bc9b4" + integrity sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg== + +"@messageformat/parser@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@messageformat/parser/-/parser-5.1.1.tgz#ca7d6c18e9f3f6b6bc984a465dac16da00106055" + integrity sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg== + dependencies: + moo "^0.5.1" + +"@messageformat/runtime@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@messageformat/runtime/-/runtime-3.0.1.tgz#94d1f6c43265c28ef7aed98ecfcc0968c6c849ac" + integrity sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg== + dependencies: + make-plural "^7.0.0" + "@mongodb-js/saslprep@^1.1.5": version "1.1.6" resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.6.tgz#54da3f794c71a17445740fe2b74882e0c76a3058" @@ -8490,6 +8526,11 @@ make-fetch-happen@^9.0.1: socks-proxy-agent "^6.0.0" ssri "^8.0.0" +make-plural@^7.0.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-7.4.0.tgz#fa6990dd550dea4de6b20163f74e5ed83d8a8d6d" + integrity sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg== + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -8819,6 +8860,11 @@ mongodb@^6.3.0: bson "^6.7.0" mongodb-connection-string-url "^3.0.0" +moo@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== + mri@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" @@ -10468,6 +10514,11 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, s resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-identifier@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" + integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"