From a03da9c10b26cc2cf8b731c9495c1d16461a0e97 Mon Sep 17 00:00:00 2001 From: alexsparkes Date: Mon, 17 Jun 2024 00:15:09 +0100 Subject: [PATCH] refactor(translations): Use new translation package Co-authored-by: Isaac --- bun.lockb | Bin 337346 -> 338220 bytes package.json | 6 +- scripts/updatetranslations.js | 10 +- src/components/Form/Settings/Radio/Radio.jsx | 3 +- src/config/default.js | 2 +- src/config/variables.js | 2 +- .../marketplace/views/newItemPage.jsx | 336 ++++++--------- src/features/misc/views/Marketplace.jsx | 2 +- src/features/navbar/components/Apps.jsx | 2 +- src/features/quote/Quote.jsx | 6 +- src/features/stats/api/achievements/index.js | 68 +-- src/features/time/Date.jsx | 2 +- src/features/weather/api/getWeather.js | 2 +- src/i18n/en-GB/_achievements.yml | 36 ++ src/i18n/en-GB/_addons.yml | 30 ++ src/i18n/en-GB/_marketplace.yml | 49 +++ src/i18n/en-GB/_settings.yml | 391 ++++++++++++++++++ src/i18n/en-GB/_welcome.yml | 75 ++++ src/i18n/en-GB/main.yml | 105 +++++ src/i18n/languages.json | 16 +- src/i18n/locales/{de_DE.json => de-DE.json} | 0 src/i18n/locales/{en_GB.json => en-GB.json} | 0 src/i18n/locales/{en_US.json => en-US.json} | 0 src/i18n/locales/{es_419.json => es-419.json} | 0 src/i18n/locales/{id_ID.json => id-ID.json} | 0 src/i18n/locales/{pt_BR.json => pt-BR.json} | 0 src/i18n/locales/{tr_TR.json => tr-TR.json} | 0 src/i18n/locales/{zh_CN.json => zh-CN.json} | 0 src/index.jsx | 12 +- src/lib/translations.js | 71 +--- src/utils/settings/default.js | 11 +- vite.config.mjs | 13 +- 32 files changed, 919 insertions(+), 331 deletions(-) create mode 100644 src/i18n/en-GB/_achievements.yml create mode 100644 src/i18n/en-GB/_addons.yml create mode 100644 src/i18n/en-GB/_marketplace.yml create mode 100644 src/i18n/en-GB/_settings.yml create mode 100644 src/i18n/en-GB/_welcome.yml create mode 100644 src/i18n/en-GB/main.yml rename src/i18n/locales/{de_DE.json => de-DE.json} (100%) rename src/i18n/locales/{en_GB.json => en-GB.json} (100%) rename src/i18n/locales/{en_US.json => en-US.json} (100%) rename src/i18n/locales/{es_419.json => es-419.json} (100%) rename src/i18n/locales/{id_ID.json => id-ID.json} (100%) rename src/i18n/locales/{pt_BR.json => pt-BR.json} (100%) rename src/i18n/locales/{tr_TR.json => tr-TR.json} (100%) rename src/i18n/locales/{zh_CN.json => zh-CN.json} (100%) diff --git a/bun.lockb b/bun.lockb index 01b4ce6de15b23e6e9087e44d63995d71b2760e7..53c134af164956a4593a56f4d15e661d896fa742 100644 GIT binary patch delta 63914 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 z zNc8N3^o{A5@S%~hL!%-BLe4aJ;Iie5(7^fa4eix<3^TNM8r7ZK(&cXBSM*rtV3UB~ z%sVGqb*uHk+^aab`~0-9~dBgYON8r5W% zm)g+YE2#V{*0^btrWIc`VS%}fpX->xS%aV Mz3X9T!@{%w2O**pK>z>% delta 63427 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 { - if (file === 'en_GB.json') { + if (file === 'en-GB.json') { return; } @@ -36,7 +36,7 @@ fs.readdirSync(localesDir).forEach((file) => { return; } - const en = require(path.join(localesDir, 'en_GB.json')); + const en = require(path.join(localesDir, 'en-GB.json')); const newdata = merge(en, require(path.join(localesDir, file))); compareAndRemoveKeys(newdata, en); @@ -47,7 +47,7 @@ fs.readdirSync(localesDir).forEach((file) => { }); fs.readdirSync(achievementsDir).forEach((file) => { - if (file === 'en_GB.json') { + if (file === 'en-GB.json') { return; } @@ -55,9 +55,9 @@ fs.readdirSync(achievementsDir).forEach((file) => { return; } - const enGBFilePath = path.join(achievementsDir, 'en_GB.json'); + const enGBFilePath = path.join(achievementsDir, 'en-GB.json'); if (!fs.existsSync(enGBFilePath)) { - console.error(`File 'en_GB.json' does not exist in the directory '${achievementsDir}'`); + console.error(`File 'en-GB.json' does not exist in the directory '${achievementsDir}'`); return; } diff --git a/src/components/Form/Settings/Radio/Radio.jsx b/src/components/Form/Settings/Radio/Radio.jsx index 111885fe..99dfae8b 100644 --- a/src/components/Form/Settings/Radio/Radio.jsx +++ b/src/components/Form/Settings/Radio/Radio.jsx @@ -4,7 +4,6 @@ import { Radio as PureRadio, RadioGroup } from '@headlessui/react'; import { MdCheckCircle } from 'react-icons/md'; import EventBus from 'utils/eventbus'; -import { translations } from 'lib/translations'; function Radio(props) { const [value, setValue] = useState(localStorage.getItem(props.name)); @@ -17,7 +16,7 @@ function Radio(props) { if (props.name === 'language') { // old tab name if (localStorage.getItem('tabName') === variables.getMessage('tabname')) { - localStorage.setItem('tabName', translations[value.replace('-', '_')].tabname); + localStorage.setItem('tabName', translations[value].tabname); } } diff --git a/src/config/default.js b/src/config/default.js index e495ab18..edf8500b 100644 --- a/src/config/default.js +++ b/src/config/default.js @@ -1,6 +1,6 @@ const DefaultOptions = { installed: [], - language: 'en_GB', + language: 'en-GB', toastDisplayTime: 2500, fontstyle: 'normal', fontweight: 400, diff --git a/src/config/variables.js b/src/config/variables.js index b5c2d119..ffe435d7 100644 --- a/src/config/variables.js +++ b/src/config/variables.js @@ -3,7 +3,7 @@ import Stats from 'features/stats/api/stats'; const variables = { language: {}, - languagecode: '', + locale_id: '', stats: Stats, constants, }; diff --git a/src/features/marketplace/views/newItemPage.jsx b/src/features/marketplace/views/newItemPage.jsx index 904701cd..f1d747c6 100644 --- a/src/features/marketplace/views/newItemPage.jsx +++ b/src/features/marketplace/views/newItemPage.jsx @@ -25,7 +25,8 @@ const NewItemPage = () => { const { subTab } = useTab(); const controller = new AbortController(); const [count, setCount] = useState(5); - const [itemData, setItemData] = useState(null); + const [item, setItemData] = useState(null); + const [shareModal, setShareModal] = useState(false); async function getItemData() { let testType = 'quote_packs'; @@ -39,34 +40,10 @@ const NewItemPage = () => { const item = await response.json(); console.log(item); - // Extract all the information you need - const { - onCollection, - type, - display_name, - author, - description, - version, - icon_url, - data, - local, - slug, - quotes, - } = item; + const { data } = item; - // Return an object with all the information return { - onCollection, - type, - display_name, - author, - description, - version, - icon_url, data, - local, - slug, - quotes, }; } @@ -79,7 +56,7 @@ const NewItemPage = () => { fetchData(); }, []); - if (!itemData) { + if (!item) { return null; // or a loading spinner } @@ -94,7 +71,7 @@ const NewItemPage = () => { data, local, slug, - } = itemData; + } = item; const moreInfoItem = (icon, header, text) => (
@@ -134,95 +111,140 @@ const NewItemPage = () => { return null; }; - { - /*async function toggle(pageType, data) { - if (pageType === 'item') { - const toggleType = type === 'all' || type === 'collections' ? data.type : type; - const item = await ( - await fetch(`${variables.constants.API_URL}/marketplace/item/${toggleType}/${data.name}`, { - signal: controller.signal, - }) - ).json(); + const ItemDetails = () => { + return ( +
+ + {variables.getMessage('modals.main.marketplace.product.details')} + +
+ {item?.updated_at && + moreInfoItem( + , + variables.getMessage('modals.main.marketplace.product.updated_at'), + formattedDate, + )} + {item?.quotes && + moreInfoItem( + , + variables.getMessage('modals.main.marketplace.product.no_quotes'), + item.quotes.length, + )} + {item?.photos && + moreInfoItem( + , + variables.getMessage('modals.main.marketplace.product.no_images'), + item.photos.length, + )} + {item?.quotes && item?.language + ? moreInfoItem( + , + variables.getMessage('modals.main.settings.sections.language.title'), + languageNames.of(item.language), + ) + : null} + {/*{moreInfoItem( + , + variables.getMessage('modals.main.settings.sections.background.type.title'), + variables.getMessage( + 'modals.main.marketplace.' + this.getName(this.props.data.data.type), + ) || 'marketplace', + )}*/} +
+
+ ); + }; - if (controller.signal.aborted === true) { - return; - } - - // check if already installed - let addonInstalled = false; - let addonInstalledVersion; - const installed = JSON.parse(localStorage.getItem('installed')); - if (installed.some((item) => item.name === item.data.name)) { - addonInstalled = true; - for (let i = 0; i < installed.length; i++) { - if (installed[i].name === item.data.name) { - addonInstalledVersion = installed[i].version; - break; - } - } - } - - setItem({ - onCollection: data._onCollection, - type: item.data.type, - display_name: item.data.name, - author: item.data.author, - description: item.data.description, - version: item.data.version, - icon: item.data.screenshot_url, - data: item.data, - local: { - installed: addonInstalled, - version: addonInstalledVersion, - }, - slug: data.name, - }); - - setType('item'); - - variables.stats.postEvent('marketplace-item', `${item.display_name} viewed`); - } else if (pageType === 'collection') { - setDone(false); - setItem({}); - - const collection = await ( - await fetch(`${variables.constants.API_URL}/marketplace/collection/${data}`, { - signal: controller.signal, - }) - ).json(); - - setItems(collection.data.items); - setCollection({ - visible: true, - title: collection.data.display_name, - description: collection.data.description, - img: collection.data.img, - }); - - setType('collection'); - } else { - setItem({}); - setCollection({}); - setType('normal'); + const ItemShowcase = () => { + switch (item.type) { + case 'quotes': + return ( + <> + + + + + + + {item.quotes.slice(0, count).map((quote, index) => ( + + + + + ))} + +
{variables.getMessage('modals.main.settings.sections.quote.title')}{variables.getMessage('modals.main.settings.sections.quote.author')}
{quote.quote}{quote.author}
+
+ count === item.quotes.length}> + {count !== item.quotes.length + ? variables.getMessage('modals.main.marketplace.product.show_all') + : variables.getMessage('modals.main.marketplace.product.show_less')} + +
+ + ); + case 'settings': + return ( + <> + + + + + + + {Object.entries(this.props.data.data.settings) + .slice(0, this.state.count) + .map(([key, value]) => ( + + + + + ))} + +
{variables.getMessage('modals.main.marketplace.product.setting')}{variables.getMessage('modals.main.marketplace.product.value')}
{key}{value}
+
+ this.incrementCount('settings')}> + {this.state.count !== this.props.data.data.settings.length + ? variables.getMessage('modals.main.marketplace.product.show_all') + : variables.getMessage('modals.main.marketplace.product.show_less')} + +
+ + ); + default: + return null; } - }*/ + }; + + const locale = localStorage.getItem('language'); + const shortLocale = locale.includes('_') ? locale.split('_')[0] : locale; + let languageNames = new Intl.DisplayNames([shortLocale], { type: 'language' }); + + let dateObj, formattedDate; + if (item.updated_at) { + dateObj = new Date(item.updated_at); + formattedDate = new Intl.DateTimeFormat(shortLocale, { + year: 'numeric', + month: 'long', + day: '2-digit', + }).format(dateObj); } return ( <> - {/* this.setState({ shareModal: false })} + onRequestClose={() => setShareModal(false)} > this.setState({ shareModal: false })} + modalClose={() => setShareModal(false)} /> - */} + {/*
{ {moreInfoItem( , variables.getMessage('modals.main.marketplace.product.created_by'), - itemData.author, + item.author, )} {itemWarning()}
@@ -271,105 +293,15 @@ const NewItemPage = () => { {variables.getMessage('modals.main.marketplace.product.description')} - {itemData.description} - - {itemData.quotes && itemData.quotes.length > 0 ? itemData.quotes[0].quote : 'Loading...'} - {itemData.type === 'quotes' && ( - <> - - - - - - - {itemData.quotes.slice(0, count).map((quote, index) => ( - - - - - ))} - -
{variables.getMessage('modals.main.settings.sections.quote.title')}{variables.getMessage('modals.main.settings.sections.quote.author')}
{quote.quote}{quote.author}
-
- count === itemData.quotes.length}> - {count !== itemData.quotes.length - ? variables.getMessage('modals.main.marketplace.product.show_all') - : variables.getMessage('modals.main.marketplace.product.show_less')} - -
- - )} - {/*{this.props.data.data.settings && ( - <> - - - - - - - {Object.entries(this.props.data.data.settings) - .slice(0, this.state.count) - .map(([key, value]) => ( - - - - - ))} - -
{variables.getMessage('modals.main.marketplace.product.setting')}{variables.getMessage('modals.main.marketplace.product.value')}
{key}{value}
-
- this.incrementCount('settings')}> - {this.state.count !== this.props.data.data.settings.length - ? variables.getMessage('modals.main.marketplace.product.show_all') - : variables.getMessage('modals.main.marketplace.product.show_less')} - -
- - )}*/} -
- - {variables.getMessage('modals.main.marketplace.product.details')} - -
- {/*{this.props.data.data.updated_at && - moreInfoItem( - , - variables.getMessage('modals.main.marketplace.product.updated_at'), - formattedDate, - )}*/} - {itemData?.quotes && - moreInfoItem( - , - variables.getMessage('modals.main.marketplace.product.no_itemData.quotes'), - itemData.quotes.length, - )} - {itemData?.photos && - moreInfoItem( - , - variables.getMessage('modals.main.marketplace.product.no_images'), - itemData.photos.length, - )} - {/*{itemData.itemData.quotes && itemData.language - ? moreInfoItem( - , - variables.getMessage('modals.main.settings.sections.language.title'), - languageNames.of(this.props.data.data.language), - ) - : null} - {moreInfoItem( - , - variables.getMessage('modals.main.settings.sections.background.type.title'), - variables.getMessage( - 'modals.main.marketplace.' + this.getName(this.props.data.data.type), - ) || 'marketplace', - )}*/} -
+ {item.description}
+ +
@@ -377,7 +309,7 @@ const NewItemPage = () => { className="icon" alt="icon" draggable={false} - src={itemData.icon_url} + src={item.icon_url} onError={(e) => { e.target.onerror = null; e.target.src = placeholderIcon; @@ -397,11 +329,11 @@ const NewItemPage = () => { )}

)} - {/*{this.props.data.data.sideload !== true && ( + {item.sideload !== true && (
- )}*/} + )} {/*} {this.props.data.data.in_collections?.length > 0 && (
diff --git a/src/features/misc/views/Marketplace.jsx b/src/features/misc/views/Marketplace.jsx index 6d821665..37859ff0 100644 --- a/src/features/misc/views/Marketplace.jsx +++ b/src/features/misc/views/Marketplace.jsx @@ -75,7 +75,7 @@ function Marketplace(props) { initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} - transition={{ duration: 10 }} + transition={{ duration: 0.8 }} > {subTab === '' ? ( diff --git a/src/features/navbar/components/Apps.jsx b/src/features/navbar/components/Apps.jsx index bc26c794..a321eb9b 100644 --- a/src/features/navbar/components/Apps.jsx +++ b/src/features/navbar/components/Apps.jsx @@ -116,7 +116,7 @@ class Apps extends PureComponent { {variables.language.getMessage( - variables.languagecode, + variables.locale_id, 'widgets.navbar.apps.no_apps', )} diff --git a/src/features/quote/Quote.jsx b/src/features/quote/Quote.jsx index ca5f5ba2..c15fd967 100644 --- a/src/features/quote/Quote.jsx +++ b/src/features/quote/Quote.jsx @@ -110,7 +110,7 @@ class Quote extends PureComponent { getAuthorLink(author) { return localStorage.getItem('authorLink') === 'false' || author === 'Unknown' ? null - : `https://${variables.languagecode.split('_')[0]}.wikipedia.org/wiki/${author + : `https://${variables.locale_id.split('_')[0]}.wikipedia.org/wiki/${author .split(' ') .join('_')}`; } @@ -131,7 +131,7 @@ class Quote extends PureComponent { const authorimgdata = await ( await fetch( `https://${ - variables.languagecode.split('_')[0] + variables.locale_id.split('_')[0] }.wikipedia.org/w/api.php?action=query&titles=${author}&origin=*&prop=pageimages&format=json&pithumbsize=100`, ) ).json(); @@ -144,7 +144,7 @@ class Quote extends PureComponent { const authorimglicensedata = await ( await fetch( `https://${ - variables.languagecode.split('_')[0] + variables.locale_id.split('_')[0] }.wikipedia.org/w/api.php?action=query&prop=imageinfo&iiprop=extmetadata&titles=File:${ authorPage.pageimage }&origin=*&format=json`, diff --git a/src/features/stats/api/achievements/index.js b/src/features/stats/api/achievements/index.js index 61c1cb54..5dec97ff 100644 --- a/src/features/stats/api/achievements/index.js +++ b/src/features/stats/api/achievements/index.js @@ -1,48 +1,48 @@ import variables from 'config/variables'; -import de_DE from 'i18n/locales/achievements/de_DE.json'; -import en_GB from 'i18n/locales/achievements/en_GB.json'; -import en_US from 'i18n/locales/achievements/en_US.json'; -import es from 'i18n/locales/achievements/es.json'; -import fr from 'i18n/locales/achievements/fr.json'; -import nl from 'i18n/locales/achievements/nl.json'; -import no from 'i18n/locales/achievements/no.json'; -import ru from 'i18n/locales/achievements/ru.json'; -import zh_CN from 'i18n/locales/achievements/zh_CN.json'; -import id_ID from 'i18n/locales/achievements/id_ID.json'; -import tr_TR from 'i18n/locales/achievements/tr_TR.json'; -import bn from 'i18n/locales/achievements/bn.json'; -import pt_BR from 'i18n/locales/achievements/pt_BR.json'; +// import de_DE from 'i18n/locales/achievements/de_DE.json'; +// import en-GB from 'i18n/locales/achievements/en-GB.json'; +// import en_US from 'i18n/locales/achievements/en_US.json'; +// import es from 'i18n/locales/achievements/es.json'; +// import fr from 'i18n/locales/achievements/fr.json'; +// import nl from 'i18n/locales/achievements/nl.json'; +// import no from 'i18n/locales/achievements/no.json'; +// import ru from 'i18n/locales/achievements/ru.json'; +// import zh_CN from 'i18n/locales/achievements/zh_CN.json'; +// import id_ID from 'i18n/locales/achievements/id_ID.json'; +// import tr_TR from 'i18n/locales/achievements/tr_TR.json'; +// import bn from 'i18n/locales/achievements/bn.json'; +// import pt_BR from 'i18n/locales/achievements/pt_BR.json'; import achievements from '../../achievements.json'; import { checkAchievements, newAchievements } from './condition'; -const translations = { - de_DE, - en_GB, - en_US, - es, - fr, - nl, - no, - ru, - zh_CN, - id_ID, - tr_TR, - bn, - pt_BR, -}; +// const translations = { +// de_DE, +// en-GB, +// en_US, +// es, +// fr, +// nl, +// no, +// ru, +// zh_CN, +// id_ID, +// tr_TR, +// bn, +// pt_BR, +// }; // todo: clean this up and condition.js too function getLocalisedAchievementData(id) { - const localised = translations[variables.languagecode][id] || - translations.en_GB[id] || { name: id, description: '' }; + // const localised = translations[variables.locale_id][id] || + // translations.en-GB[id] || { name: id, description: '' }; - return { - name: localised.name, - description: localised.description, - }; + // return { + // name: localised.name, + // description: localised.description, + // }; } export { achievements, checkAchievements, newAchievements, getLocalisedAchievementData }; diff --git a/src/features/time/Date.jsx b/src/features/time/Date.jsx index 299ef967..c5119143 100644 --- a/src/features/time/Date.jsx +++ b/src/features/time/Date.jsx @@ -94,7 +94,7 @@ const DateWidget = () => { setDate(format); } else { // Long date - const lang = variables.languagecode.split('_')[0]; + const lang = variables.locale_id.split('_')[0]; const datenth = localStorage.getItem('datenth') === 'true' diff --git a/src/features/weather/api/getWeather.js b/src/features/weather/api/getWeather.js index d7c0b255..64741915 100644 --- a/src/features/weather/api/getWeather.js +++ b/src/features/weather/api/getWeather.js @@ -25,7 +25,7 @@ export const getWeather = async (location, done) => { try { const response = await fetch( - variables.constants.API_URL + `/weather?city=${location}&language=${variables.languagecode}`, + variables.constants.API_URL + `/weather?city=${location}&language=${variables.locale_id}`, ); if (!response.ok) { diff --git a/src/i18n/en-GB/_achievements.yml b/src/i18n/en-GB/_achievements.yml new file mode 100644 index 00000000..5276e5e8 --- /dev/null +++ b/src/i18n/en-GB/_achievements.yml @@ -0,0 +1,36 @@ +727: + name: When You See It + description: Opened 727 tabs +1337: + name: MU3T4B + description: Opened 1337 tabs +10tabs: + name: 10/10 IGN + description: Opened 10 tabs +thankyou: + name: Thank You + description: Opened 39 tabs +seasoning: + name: Seasoning + description: Opened 100 tabs +mrworldwide: + name: Mr. Worldwide + description: Opened 305 tabs +tabaholic: + name: Tabaholic + description: Opened 500 tabs +808s: + name: 808s & Tab Breaks + description: Opened 808 tabs +averagelinuxuser: + name: Average Linux User + description: Installed an add-on +fullyriced: + name: Fully Riced + description: Installed 5 add-ons +21addons: + name: They installed 21 add-ons? Whaaat? + description: Installed 21 add-ons +overload: + name: System Overload + description: Installed 50 add-ons diff --git a/src/i18n/en-GB/_addons.yml b/src/i18n/en-GB/_addons.yml new file mode 100644 index 00000000..0d8cbb70 --- /dev/null +++ b/src/i18n/en-GB/_addons.yml @@ -0,0 +1,30 @@ +added: Added +check_updates: Check for updates +no_updates: No updates available +updates_available: Updates available {amount} +empty: + title: Empty + description: No addons are installed +sideload: + title: Sideload + description: Install a Mue addon not on the marketplace from your computer + failed: Failed to sideload addon + errors: + no_name: No name provided + no_author: No author provided + no_type: No type provided + invalid_photos: Invalid photos object + invalid_quotes: Invalid quotes object +sort: + title: Sort + newest: Installed (Newest) + oldest: Installed (Oldest) + a_z: Alphabetical (A-Z) + z_a: Alphabetical (Z-A) +create: + title: Create + moved_title: Create add-on has moved! + moved_description: >- + Following the 7.1 update, the creation of addons has now moved to the + web UI + moved_button: Coming Soon.... diff --git a/src/i18n/en-GB/_marketplace.yml b/src/i18n/en-GB/_marketplace.yml new file mode 100644 index 00000000..37f0605b --- /dev/null +++ b/src/i18n/en-GB/_marketplace.yml @@ -0,0 +1,49 @@ +by: by {author} +all: All +learn_more: Learn More +photo_packs: Photo Packs +quote_packs: Quote Packs +preset_settings: Preset Settings +no_items: No items in this category +collection: Collection +explore_collection: Explore Collection +add_all: Add All To Mue +collections: Collections +cant_find: Can't find what you're looking for? +knowledgebase_one: Visit the +knowledgebase_two: knowledgebase +knowledgebase_three: to create your own. +installing: Installing +product: + overview: Overview + information: Information + last_updated: Last Updated + description: Description + details: Details + more_from_curator: More like this from {name} + show_more: Show More + show_less: Show Less + show_all: Show All + showing: Showing + no_images: No. Images + no_quotes: No. Quotes + version: Version + created_by: Created by + updated_at: Updated on + part_of: Part of + explore: Explore + buttons: + addtomue: Add To Mue + remove: Remove + update_addon: Update Add-on + back: Back + report: Report + not_available_preview: Unavailable on Preview + not_in_language: This add-on is not in your language + third_party_api: This add-on uses a third-party API + sideload_warning: This add-on has been sideloaded. + setting: Setting + value: Value +offline: + title: Looks like you're offline + description: Please connect to the internet diff --git a/src/i18n/en-GB/_settings.yml b/src/i18n/en-GB/_settings.yml new file mode 100644 index 00000000..8c501a5d --- /dev/null +++ b/src/i18n/en-GB/_settings.yml @@ -0,0 +1,391 @@ +enabled: Enabled +open_knowledgebase: Open Knowledgebase +additional_settings: Additional Settings +reminder: + title: NOTICE + message: >- + In order for all of the changes to take place, the page must be + refreshed. +sections: + header: + more_info: More info + report_issue: Report Issue + enabled: Choose whether or not to show this widget + size: Slider to control how large the widget is + time: + title: Time + format: Format + type: Type + type_subtitle: >- + Choose whether to display the time in digital format, analogue + format, or a percentage completion of the day + digital: + title: Digital + subtitle: Change how the digital clock looks + seconds: Seconds + twentyfourhour: 24 Hour + twelvehour: 12 hour + zero: Zero-padded + analogue: + title: Analogue + subtitle: Change how the analogue clock looks + second_hand: Seconds hand + minute_hand: Minutes hand + hour_hand: Hours hand + hour_marks: Hour marks + minute_marks: Minute marks + round_clock: Rounded background + percentage_complete: Percentage complete + vertical_clock: + title: Vertical Clock + change_hour_colour: Change hour text colour + change_minute_colour: Change minute text colour + change_second_colour: Change second text colour + date: + title: Date + week_number: Week number + day_of_week: Day of week + datenth: Date nth + type: + short: Short + long: Long + subtitle: Whether to display the date in long form or short form + type_settings: Display settings and format for the selected date type + short_date: Short date + short_format: Short format + long_format: Long format + short_separator: + title: Short separator + dots: Dots + dash: Dash + gaps: Gaps + slashes: Slashes + quote: + title: Quote + additional: Other settings to customise the style of the quote widget + author_link: Author link + custom: Custom quote + custom_subtitle: Set your own custom quotes + no_quotes: No quotes + author: Author + custom_buttons: Buttons + custom_author: Custom author + author_img: Show author image + add: Add quote + source_subtitle: Choose where to get quotes from + buttons: + title: Buttons + subtitle: Choose which buttons to show on the quote + copy: Copy + tweet: Tweet + favourite: Favourite + greeting: + title: Greeting + events: Events + events_description: Control events on Mue such as birthdays. + enable_events: Show messages on special days + default: Default greeting message + name: Name for greeting + birthday: Birthday + birthday_subtitle: Show a Happy Birthday message when it is your birthday + birthday_age: Birthday age + birthday_date: Birthday date + additional: Settings for the greeting display + custom: Custom events + event_name: Event Name + day: Day + month: Month + no_events: No Events + no_events_description: Add Some Events + add_event: Add Event + background: + title: Background + transition: Fade-in transition + photo_information: Show photo information + show_map: Show location map on photo information if available + categories: Categories + buttons: + title: Buttons + view: Maximise + favourite: Favourite + download: Download + effects: + title: Effects + subtitle: Add effects to the background images + blur: Adjust blur + brightness: Adjust brightness + filters: + title: Background filter + amount: Filter amount + grayscale: Grayscale + sepia: Sepia + invert: Invert + saturate: Saturate + contrast: Contrast + type: + title: Type + api: API + custom_image: Custom image + custom_colour: Custom colour/gradient + random_colour: Random colour + random_gradient: Random gradient + unsplash: + title: Unsplash Collection(s) + subtitle: Select the collection(s) you want to use for your background + id: Collection ID(s) + id_subtitle: Enter a comma separated list of Unsplash IDs + source: + title: Source + subtitle: Select where to get background images from + api: Background API + custom_background: Custom background + custom_colour: Custom background colour + upload: Upload + add_colour: Add colour + add_background: Add background + drop_to_upload: Drop to upload + formats: 'Available formats: {list}' + select: Or Select + add_url: Add URL + disabled: Disabled + loop_video: Loop video + mute_video: Mute video + quality: + title: Quality + original: Original + high: High Quality + normal: Normal Quality + datasaver: Data Saver + custom_title: Custom Images + custom_description: Select images from your local computer + remove: Remove Image + display: Display + display_subtitle: Change how background and photo information are loaded + api: API Settings + api_subtitle: Options for getting an image from an external service (API) + search: + title: Search + additional: Additional options for search widget display and functionality + search_engine: Search Engine + search_engine_subtitle: Choose search engine to use in the search bar + custom: Custom Search URL + autocomplete: Autocomplete + autocomplete_provider: Autocomplete Provider + autocomplete_provider_subtitle: Search engine to use for autocomplete dropdown results + voice_search: Voice search + dropdown: Search Dropdown + focus: Focus on tab open + weather: + title: Weather + location: Location + auto: Auto + widget_type: Widget Type + temp_format: + title: Temperature format + celsius: Celsius + fahrenheit: Fahrenheit + kelvin: Kelvin + extra_info: + title: Extra information + show_location: Show location + show_description: Show description + weather_description: Weather description + cloudiness: Cloudiness + humidity: Humidity + visibility: Visibility + wind_speed: Wind speed + wind_direction: Wind direction + min_temp: Minimum temperature + max_temp: Maximum temperature + atmospheric_pressure: Atmospheric pressure + options: + basic: Basic + standard: Standard + expanded: Expanded + custom: Custom + custom_settings: Custom Settings + quicklinks: + title: Quick Links + additional: Additional settings for quick links display and functions + open_new: Open in new tab + tooltip: Tooltip + text_only: Show text only + add_link: Add Link + no_quicklinks: No quick links + edit: Edit + style: Style + options: + icon: Icon + text_only: Text Only + metro: Metro + styling: Styling + styling_description: Customise Quick Links appearance + message: + title: Message + add: Add message + messages: Messages + text: Text + no_messages: No messages + add_some: Go ahead and add some. + content: Message Content + appearance: + title: Appearance + style: + title: Widget Style + description: >- + Choose between the two styles, legacy (enabled for pre 7.0 users) + and our slick modern styling. + legacy: Legacy + new: New + theme: + title: Theme + description: Change the theme of the Mue widgets and modals + auto: Auto + light: Light + dark: Dark + navbar: + title: Navbar + widgets: Navbar Widgets + notes: Notes + refresh: Refresh + refresh_subtitle: Choose what is refreshed when you click the refresh button + hover: Only display on hover + additional: Modify navbar style and which buttons you want to display + refresh_options: + none: None + page: Page + apps_subtitle: Create a shortcut of your other commonly used websites. + font: + title: Font + description: Change the font used in Mue + custom: Custom font + google: Import from Google Fonts + weight: + title: Font weight + thin: Thin + extra_light: Extra Light + light: Light + normal: Normal + medium: Medium + semi_bold: Semi-Bold + bold: Bold + extra_bold: Extra-Bold + style: + title: Font style + normal: Normal + italic: Italic + oblique: Oblique + accessibility: + title: Accessibility + description: Make Mue comfortable and accessible + animations: Animations + text_shadow: + title: Widget text shadow + new: New + old: Old + none: None + widget_zoom: Widget Zoom + toast_duration: Toast Duration + milliseconds: milliseconds + order: + title: Widget Order + advanced: + title: Advanced + offline_mode: Offline mode + offline_subtitle: When enabled, all requests to online services will be disabled. + data: Data + data_description: >- + Choose whether to export your Mue settings to your computer, import + an existing settings file, or reset your settings to their default + values + data_subtitle: Manage your data on Mue. + reset_modal: + title: WARNING + question: Do you want to reset Mue? + information: >- + This will delete all data. If you wish to keep your data and + preferences, please export them first. + cancel: Cancel + customisation: Customisation + custom_css: Custom CSS + custom_css_subtitle: >- + Make Mue's styling customised to you with Cascading Style Sheets + (CSS). + custom_js: Custom JS + tab_name: Tab name + tab_name_subtitle: Change the name of the tab that appears in your browser + timezone: + title: Time Zone + subtitle: >- + Choose a timezone from the list instead of the automatic default + from your computer + automatic: Automatic + experimental_warning: >- + Please note that the Mue team cannot provide support if you have + experimental mode on. Please disable it first and see if the issue + continues to occur before contacting support. + preview_data_disabled: + title: Data Settings Disabled + description: >- + Data settings are disabled in preview mode. Please exit preview + mode to use this feature. + stats: + title: Stats + sections: + tabs_opened: Tabs opened + backgrounds_favourited: Backgrounds favourited + backgrounds_downloaded: Backgrounds downloaded + quotes_favourited: Quotes favourited + quicklinks_added: Quicklinks added + settings_changed: Settings changed + addons_installed: Add-ons installed + usage: Usage Stats + achievements: Achievements + achievement_unlocked: 'Achievement Unlocked: {name}' + unlocked: '{count} Unlocked' + locked: Locked + clear_modal: + question: Do you want to clear your stats? + information: This will clear all achievements and usage statistics. + experimental: + title: Experimental + warning: >- + These settings have not been fully tested/implemented and may not + work correctly! + developer: Developer + language: + title: Language + quote: Quote language + changelog: + title: Change Log + by: By {author} + about: + title: About + version: + title: Version + checking_update: Checking for update + update_available: Update available + no_update: No update available + offline_mode: Cannot check for update in offline mode + error: + title: Failed to get update information + description: An error occured + contact_us: Contact Us + support_mue: Support Mue + support_subtitle: >- + As Mue is entirely free, we rely on donations to cover the server + bills and fund development + support_donate: Donate + form_button: Form + resources_used: + title: Resources used + bg_images: Offline background images + contributors: Contributors + supporters: Supporters + no_supporters: There are currently no Mue supporters + photographers: Photographers + curators: Add-on creators +buttons: + reset: Reset + import: Import + export: Export diff --git a/src/i18n/en-GB/_welcome.yml b/src/i18n/en-GB/_welcome.yml new file mode 100644 index 00000000..a1c75501 --- /dev/null +++ b/src/i18n/en-GB/_welcome.yml @@ -0,0 +1,75 @@ +tip: Quick Tip +sections: + intro: + title: Welcome to Mue Tab + description: >- + Thank you for installing Mue, we hope you enjoy your time with our + extension. + notices: + discord_title: Join our Discord + discord_description: Talk with the Mue community and developers + discord_join: Join + github_title: Contribute on GitHub + github_description: Report bugs, add features or donate + github_open: Open + language: + title: Choose your language + description: >- + Mue can be displayed the languages listed below. You can also add new + translations on our + theme: + title: Select a theme + description: >- + Mue is available in both light and dark theme, or this can be + automatically set depending on your system theme. + tip: >- + Using the Auto settings will use the theme on your computer. This + setting will impact the modals and some of the widgets displayed on + the screen, such as weather and notes. + style: + title: Choose a style + description: >- + Mue currently offers the choice between the legacy styling and the + newly released modern styling. + legacy: Legacy + modern: Modern + settings: + title: Import Settings + description: Installing Mue on a new device? Feel free to import your old settings! + tip: >- + You can export your old settings by navigating to the Advanced tab in + your old Mue setup. Then you need to click the export button which + will download the JSON file. You can upload this file here to carry + across your settings and preferences from your previous Mue + installation. + privacy: + title: Privacy Options + description: Enable settings to further protect your privacy with Mue. + offline_mode_description: >- + Enabling offline mode will disable all requests to any service. This + will result in online backgrounds, online quotes, marketplace, + weather, quick links, change log and some about tab information to be + disabled. + links: + title: Links + privacy_policy: Privacy Policy + source_code: Source Code + final: + title: Final step + description: Your Mue Tab experience is about to begin. + changes: Changes + changes_description: >- + To change settings later click on the settings icon in the top right + corner of your tab. + imported: Imported {amount} settings +buttons: + next: Next + preview: Preview + previous: Previous + close: Close + finish: Finish +preview: + description: >- + You are currently in preview mode. Settings will be reset on closing + this tab. + continue: Continue setup diff --git a/src/i18n/en-GB/main.yml b/src/i18n/en-GB/main.yml new file mode 100644 index 00000000..6001e836 --- /dev/null +++ b/src/i18n/en-GB/main.yml @@ -0,0 +1,105 @@ +tabname: New Tab +widgets: + greeting: + morning: Good Morning + afternoon: Good Afternoon + evening: Good Evening + christmas: Merry Christmas + newyear: Happy New Year + halloween: Happy Halloween + birthday: Happy Birthday + background: + credit: Photo by + unsplash: on Unsplash + information: Information + download: Download + downloads: Downloads + views: Views + likes: Likes + location: Location + camera: Camera + resolution: Resolution + source: Source + category: Category + exclude: Don't show again + exclude_confirm: >- + Are you sure you don't want to see this image again? + + Note: if you don't like "{category}" images, you can deselect the category + in the background source settings. + confirm: Confirm + search: Search + quicklinks: + new: New Link + edit: Edit Link + name: Name + url: URL + icon: Icon (optional) + add: Add + name_error: Must provide name + url_error: Must provide URL + date: + week: Week + weather: + not_found: Not Found + meters: '{amount} metres' + extra_information: Extra Information + feels_like: Feels like {amount} + quote: + link_tooltip: Open on Wikipedia + share: Share + copy: Copy + favourite: Favourite + unfavourite: Unfavourite + navbar: + tooltips: + refresh: Refresh + notes: + title: Notes + placeholder: Type here + todo: + title: Todo + pin: Pin + add: Add + no_todos: No Todos + apps: + title: Apps + no_apps: No app links found +modals: + main: + title: Options + loading: Loading... + file_upload_error: File is over 2MB + navbar: + settings: Settings + addons: Add-ons + marketplace: Marketplace + error_boundary: + title: Error + message: Failed to load this component of Mue + report_error: Send Error Report + sent: Sent! + refresh: Refresh + update: + title: Update + offline: + title: Offline + description: Cannot get update logs while in offline mode + error: + title: Error + description: Could not connect to the server + share: + copy_link: Copy link + email: Email +toasts: + quote: Quote copied + notes: Notes copied + reset: Reset successfully + installed: Successfully installed + uninstalled: Successfully removed + updated: Successfully updated + error: Something went wrong + imported: Successfully imported + no_storage: Not enough storage + link_copied: Link copied + stats_reset: Stats reset diff --git a/src/i18n/languages.json b/src/i18n/languages.json index 446c3958..7cacc14f 100644 --- a/src/i18n/languages.json +++ b/src/i18n/languages.json @@ -1,7 +1,7 @@ [ { "name": "Bahasa Indonesia", - "value": "id_ID" + "value": "id-ID" }, { "name": "বাংলা", @@ -9,15 +9,15 @@ }, { "name": "Deutsch", - "value": "de_DE" + "value": "de-DE" }, { "name": "English (UK)", - "value": "en_GB" + "value": "en-GB" }, { "name": "English (US)", - "value": "en_US" + "value": "en-US" }, { "name": "Español", @@ -25,7 +25,7 @@ }, { "name": "Español (Latinoamérica)", - "value": "es_419" + "value": "es-419" }, { "name": "Français", @@ -45,14 +45,14 @@ }, { "name": "Türkçe", - "value": "tr_TR" + "value": "tr-TR" }, { "name": "中文 (简体)", - "value": "zh_CN" + "value": "zh-CN" }, { "name": "Portuguese (Brazil)", - "value": "pt_BR" + "value": "pt-BR" } ] diff --git a/src/i18n/locales/de_DE.json b/src/i18n/locales/de-DE.json similarity index 100% rename from src/i18n/locales/de_DE.json rename to src/i18n/locales/de-DE.json diff --git a/src/i18n/locales/en_GB.json b/src/i18n/locales/en-GB.json similarity index 100% rename from src/i18n/locales/en_GB.json rename to src/i18n/locales/en-GB.json diff --git a/src/i18n/locales/en_US.json b/src/i18n/locales/en-US.json similarity index 100% rename from src/i18n/locales/en_US.json rename to src/i18n/locales/en-US.json diff --git a/src/i18n/locales/es_419.json b/src/i18n/locales/es-419.json similarity index 100% rename from src/i18n/locales/es_419.json rename to src/i18n/locales/es-419.json diff --git a/src/i18n/locales/id_ID.json b/src/i18n/locales/id-ID.json similarity index 100% rename from src/i18n/locales/id_ID.json rename to src/i18n/locales/id-ID.json diff --git a/src/i18n/locales/pt_BR.json b/src/i18n/locales/pt-BR.json similarity index 100% rename from src/i18n/locales/pt_BR.json rename to src/i18n/locales/pt-BR.json diff --git a/src/i18n/locales/tr_TR.json b/src/i18n/locales/tr-TR.json similarity index 100% rename from src/i18n/locales/tr_TR.json rename to src/i18n/locales/tr-TR.json diff --git a/src/i18n/locales/zh_CN.json b/src/i18n/locales/zh-CN.json similarity index 100% rename from src/i18n/locales/zh_CN.json rename to src/i18n/locales/zh-CN.json diff --git a/src/index.jsx b/src/index.jsx index 8aec1add..a3ef29c1 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -12,15 +12,15 @@ import './scss/index.scss'; // the toast css is based on default so we need to import it import 'react-toastify/dist/ReactToastify.min.css'; -import { initTranslations } from 'lib/translations'; +import { createTranslator } from 'lib/translations'; -const languagecode = localStorage.getItem('language') || defaults.language; -variables.language = initTranslations(languagecode); -variables.languagecode = languagecode; -document.documentElement.lang = languagecode.replace('_', '-'); +const locale_id = localStorage.getItem('language').replace('_', '-') || defaults.language; +variables.language = createTranslator(locale_id); +variables.locale_id = locale_id; +document.documentElement.lang = locale_id; variables.getMessage = (text, optional) => - variables.language.getMessage(variables.languagecode, text, optional || {}); + variables.language.getMessage(variables.locale_id, text, optional || {}); Sentry.init({ dsn: variables.constants.SENTRY_DSN, diff --git a/src/lib/translations.js b/src/lib/translations.js index 0dc6be88..f12d619e 100644 --- a/src/lib/translations.js +++ b/src/lib/translations.js @@ -1,60 +1,23 @@ -import I18n from '@eartharoid/i18n'; - -import * as de_DE from 'translations/de_DE.json'; -import * as en_GB from 'translations/en_GB.json'; -import * as en_US from 'translations/en_US.json'; -import * as es from 'translations/es.json'; -import * as es_419 from 'translations/es_419.json'; -import * as fr from 'translations/fr.json'; -import * as nl from 'translations/nl.json'; -import * as no from 'translations/no.json'; -import * as ru from 'translations/ru.json'; -import * as zh_CN from 'translations/zh_CN.json'; -import * as id_ID from 'translations/id_ID.json'; -import * as tr_TR from 'translations/tr_TR.json'; -import * as pt_BR from 'translations/pt_BR.json'; -import * as bn from 'translations/bn.json'; +import { I18nLite } from '@eartharoid/i18n'; +import { importJSON } from '@eartharoid/vite-plugin-i18n'; +export const languages = Object.keys(import.meta.glob('i18n/**/*.yml')); /** * Initialise the i18n object. * The i18n object is then returned. - * @param locale _ The locale to use. + * @param locale_id The locale to use. * @returns The i18n object. */ -export function initTranslations(locale) { - const i18n = new I18n(locale, { - de_DE, - en_GB, - en_US, - es, - es_419, - fr, - nl, - no, - ru, - zh_CN, - id_ID, - tr_TR, - pt_BR, - bn, - }); - - return i18n; -} - -export const translations = { - de_DE, - en_GB, - en_US, - es, - es_419, - fr, - nl, - no, - ru, - zh_CN, - id_ID, - tr_TR, - pt_BR, - bn, -}; +export async function createTranslator(locale_id) { + const loaded = importJSON( + await import(`i18n/${locale_id}/_achievements.yml`), + await import(`i18n/${locale_id}/_addons.yml`), + await import(`i18n/${locale_id}/_marketplace.yml`), + await import(`i18n/${locale_id}/_settings.yml`), + await import(`i18n/${locale_id}/_welcome.yml`), + await import(`i18n/${locale_id}/main.yml`), + ); + const i18n = new I18nLite(); + const t = i18n.loadParsed(...loaded).createTranslator(); + return t; +} \ No newline at end of file diff --git a/src/utils/settings/default.js b/src/utils/settings/default.js index 0c4a4108..90774344 100644 --- a/src/utils/settings/default.js +++ b/src/utils/settings/default.js @@ -9,16 +9,13 @@ export function setDefaultSettings(reset) { localStorage.clear(); // Languages - const languageCodes = languages.map(({ value }) => value); - const browserLanguage = - (navigator.languages && - navigator.languages.find((lang) => lang.replace('-', '_') && languageCodes.includes(lang))) || - navigator.language.replace('-', '_'); + const locale_ids = languages.map(({ value }) => value); + const browserLanguage = (navigator.languages && navigator.languages.find((lang) => locale_ids.includes(lang))) || navigator.language; - if (languageCodes.includes(browserLanguage)) { + if (locale_ids.includes(browserLanguage)) { localStorage.setItem('language', browserLanguage); } else { - localStorage.setItem('language', 'en_GB'); + localStorage.setItem('language', 'en-GB'); } localStorage.setItem('tabName', variables.getMessage('tabname')); diff --git a/vite.config.mjs b/vite.config.mjs index 054cbdf8..a03c74b8 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -5,6 +5,8 @@ import fs from 'fs'; import ADMZip from 'adm-zip'; import * as pkg from './package.json'; import progress from 'vite-plugin-progress'; +import { I18nPlugin } from '@eartharoid/vite-plugin-i18n'; +import YAML from 'yaml'; const isProd = process.env.NODE_ENV === 'production'; @@ -98,7 +100,15 @@ export default defineConfig(({ command, mode }) => { define: { __APP_ENV__: JSON.stringify(env.APP_ENV), }, - plugins: [react(), prepareBuilds(), progress()], + plugins: [ + react(), + I18nPlugin({ + include: './src/i18n/**/*.yml', + parser: (file) => YAML.parse(file), + }), + prepareBuilds(), + progress() + ], server: { open: true, hmr: { @@ -134,7 +144,6 @@ export default defineConfig(({ command, mode }) => { features: path.resolve(__dirname, './src/features'), lib: path.resolve(__dirname, './src/lib'), scss: path.resolve(__dirname, './src/scss'), - translations: path.resolve(__dirname, './src/i18n/locales'), utils: path.resolve(__dirname, './src/utils'), }, },