initial localization code / english translations

This commit is contained in:
vgmoose 2024-03-23 17:51:47 -04:00
parent 8c60ce1fb8
commit 9f7c81b513
12 changed files with 260 additions and 99 deletions

View file

@ -9,6 +9,7 @@
"@fortawesome/free-solid-svg-icons": "^5.9.0",
"@fortawesome/react-fontawesome": "^0.1.4",
"filesaver.js": "^1.3.4",
"i18next": "^23.10.1",
"jszip": "^3.7.1",
"jszip-utils": "^0.1.0",
"moment": "^2.27.0",
@ -18,6 +19,7 @@
"react-day-picker": "^7.4.8",
"react-dom": "^16.8.3",
"react-fontawesome": "^1.6.1",
"react-i18next": "^14.1.0",
"react-portal-tooltip": "^2.4.7",
"react-responsive-modal": "^4.0.1",
"react-router-dom": "^5.0.1",

View file

@ -1,6 +1,6 @@
import React, { Fragment, Component } from 'react';
import loading from './img/loader.gif';
import AppList from './AppList';
import {fetchPackages} from './AppList';
import noscreen from './img/noscreen.png';
import './MainDisplay.css';
import { getParams, Spacer, Mobile, getFirstPixelFromImage, platformIcons } from './Utils';
@ -25,7 +25,7 @@ class AppDetails extends Component {
async componentDidMount() {
const packages = await AppList.fetchPackages(this.state.platform);
const packages = await fetchPackages(this.state.platform);
this.pkg = packages.find(pkg => pkg.name.toLowerCase() === this.curPkg && pkg.platform === this.state.platform);
if (!this.pkg) return this.setState({ loading: false });

View file

@ -1,26 +1,57 @@
import React, { Component, Fragment } from 'react';
import { Trans } from 'react-i18next';
import AppCard from './AppCard';
import LibGet from './LibGet';
import loader from './img/loader.gif';
import Sidebar from './Sidebar';
import { getCurrentCategory, getAllCategories } from './Sidebar';
import { getParams, Spacer, Mobile, stringDateToTimestamp } from './Utils';
import PlatformPicker from './PlatformPicker';
import icon from './img/icon.png';
import { withTranslation } from 'react-i18next';
export async function fetchPackages(platform) {
const repos = LibGet.getRepos(platform);
const repoPackages = await Promise.all(
(await LibGet.getApps(repos)).map(
async (response) => await response.json()
));
return repoPackages.reduce(
(acc, cur, idx) => acc.concat(
cur["packages"].map(pkg => ({
...pkg,
repo: repos[idx].url,
platform: repos[idx].platform
}))
), []);
}
export async function fetchCredits() {
const creditsResp = await fetch(`https://fortheusers.github.io/meta-repo/credits.json`);
const { credits } = await creditsResp.json();
return credits;
}
let sorts = [{
flavor: "by most recent",
flavor: "listing.sort.recent",
order: (b, a) => stringDateToTimestamp(a.updated) - stringDateToTimestamp(b.updated)
},
{
flavor: "by download count",
flavor: "listing.sort.download",
order: (b, a) => a.app_dls - b.app_dls
},
{
flavor: "randomly",
flavor: "listing.sort.alpha",
order: (a, b) => a.title.localeCompare(b.title)
},
{
flavor: "listing.sort.random",
order: () => 0.5 - Math.random()
},
{
flavor: "by file size",
flavor: "listing.sort.size",
order: (b, a) => (a.filesize + a.filesize) - (b.filesize + b.filesize)
}];
@ -32,7 +63,7 @@ class AppList extends Component {
constructor(props) {
super(props);
this.category = Sidebar.getCurrentCategory();
this.category = getCurrentCategory();
const { platform, query } = getParams(props);
this.platform = platform;
this.query = query;
@ -50,42 +81,18 @@ class AppList extends Component {
await me.sortLogic(me);
}
static async fetchPackages(platform) {
const repos = LibGet.getRepos(platform);
const repoPackages = await Promise.all(
(await LibGet.getApps(repos)).map(
async (response) => await response.json()
));
return repoPackages.reduce(
(acc, cur, idx) => acc.concat(
cur["packages"].map(pkg => ({
...pkg,
repo: repos[idx].url,
platform: repos[idx].platform
}))
), []);
}
static async fetchCredits() {
const creditsResp = await fetch(`https://fortheusers.github.io/meta-repo/credits.json`);
const { credits } = await creditsResp.json();
return credits;
}
async componentDidMount() {
await this.sortLogic(this);
}
async sortLogic(me) {
let packages = await AppList.fetchPackages(this.platform);
let packages = await fetchPackages(this.platform);
// perform the actual sort of packages, based on current sort / category
packages = packages.sort(sorts[me.state.curSort].order);
const cats = new Set(Sidebar.getAllCategories().map(cat => cat.short));
const cats = new Set(getAllCategories().map(cat => cat.short));
const { short } = me.category;
// let through for all and search, and misc only if not in any others
@ -103,6 +110,7 @@ class AppList extends Component {
render() {
const { packages, curSort } = this.state;
const { name } = this.category;
const { t } = this.props;
if (!packages) {
return (<div className="AppList">
@ -120,27 +128,37 @@ class AppList extends Component {
const isOnHome = window.location.pathname === "" || window.location.pathname === "/";
const platformPicker = isOnHome ? <div id="homeBlurb" style={{
marginBottom: 10,
marginLeft: 50,
marginRight: 50,
marginTop: 10}}>
<div style={{padding: 10, textAlign: "center"}}>
<img src={icon} alt="AppStore Logo" />
<span style={{
padding: 10
}}>Homebrew App Store</span>
const platformPicker = isOnHome ? (
<div id="homeBlurb" style={{
marginBottom: 10,
marginLeft: 50,
marginRight: 50,
marginTop: 10
}}>
<div style={{padding: 10, textAlign: "center"}}>
<img src={icon} alt="AppStore Logo" />
<span style={{padding: 10}}>Homebrew App Store</span>
</div>
<p>
<Trans i18nKey="homebrewDescription">
<a href="https://en.wikipedia.org/wiki/Homebrew_(video_games)">homebrew apps</a>
</Trans>
</p>
<p>
<Trans i18nKey="submitRequest">
<a href="/submit-or-request">Submit</a>
<a href="/about">About</a>
</Trans>
</p>
<PlatformPicker />
</div>
<p>Homebrew App Store is a free and open-source repository of <a href="https://en.wikipedia.org/wiki/Homebrew_(video_games)">homebrew apps</a> for the Wii U and Switch consoles. The apps, tools, and games distributed here are all made by independent software developers within the community.</p>
<p>If you would like to list your own open-source app here, or request an existing one to add to this index, please see the <a href="/submit-or-request">Submit</a> page. For other info about the team and project, see our <a href="/about">About</a> page.</p>
<PlatformPicker />
</div> : null;
) : null;
let headerText = (<Fragment>
{platformPicker}
<div className="catTitle">
<div className="menuspan">
{name} <br className="mobilebr"></br><span className="sort">{sortFlavor}</span>
{name} <br className="mobilebr"></br><span className="sort">{t(sortFlavor)}</span>
</div>
<div className="menu">
<button onClick={() => this.adjustSort(this)}>Adjust Sort</button>
@ -194,4 +212,4 @@ class AppList extends Component {
}
}
export default AppList;
export default withTranslation()(AppList);

View file

@ -7,7 +7,7 @@ import LibGet from './LibGet';
import loader from './img/loader.gif';
import moment from 'moment';
import Select from 'react-select';
import AppList from './AppList';
import {fetchPackages} from './AppList';
import { TinyColor } from '@ctrl/tinycolor';
import DayPickerInput from 'react-day-picker/DayPickerInput';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
@ -33,7 +33,7 @@ export default class AppStatsChart extends PureComponent {
async componentDidMount() {
// fetch async and save to state
const statsProper = await LibGet.getStats().then(response => response.json());
const allPackages = await AppList.fetchPackages();
const allPackages = await fetchPackages();
const { start: ogStart, end: ogEnd } = this.state;

View file

@ -1,6 +1,8 @@
import React, { Component, Fragment } from 'react';
import { Trans } from 'react-i18next';
import { Spacer, Mobile } from './Utils';
import AppList from './AppList';
import {fetchCredits, fetchPackages} from './AppList';
import twitterImg from './img/twitter.png';
import githubImg from './img/github.png';
import gitlabImg from './img/gitlab.png';
@ -30,12 +32,12 @@ class InfoPage extends Component {
const location = window.location.pathname;
if (location === "/about") {
let credits = await AppList.fetchCredits();
let credits = await fetchCredits();
this.setState({ credits });
}
if (location !== "/submit-or-request") {
let allPackages = await AppList.fetchPackages();
let allPackages = await fetchPackages();
allPackages.sort((a, b) => a.title.localeCompare(b.title));
this.setState({ allPackages })
@ -192,40 +194,55 @@ class InfoPage extends Component {
</table>;
pageText = <div>
<h1>About hb-appstore</h1>
<h1><Trans i18nKey="aboutTitle" /></h1>
<p className="pNormalWidth">
Homebrew App Store is a free and open-source repository of <a href="https://en.wikipedia.org/wiki/Homebrew_(video_games)">homebrew apps</a> for the Wii U and Switch consoles. This listing is maintained by the <a href="https://fortheusers.org">ForTheUsers team</a>, with the goal of making accessible and preserving the efforts of independent developers and hobbyists to end users.
</p><p className="pNormalWidth">
If you would like to list your own open-source app here, or request an existing one to add to this index, please see the <a href="/submit-or-request">Submit</a> page. For already listed apps, an <a href="/api-info">API</a> is available.
<Trans i18nKey="aboutDescription1">
<a href="https://en.wikipedia.org/wiki/Homebrew_(video_games)">Homebrew</a>
<a href="https://fortheusers.org">ForTheUsers</a>
</Trans>
</p>
<p className="pNormalWidth">
If you are a copyright holder and are concerned some of your work is being infringed upon, please fill out this <a href="/dmca-request">DMCA Form</a> to submit a takedown request. This also applies if you are an open-source developer and don't want us to distribute your project here.
</p>
<h3>How It Works</h3>
<p className="pNormalWidth">
The content in our repositories is available both as a website and as a <a href="https://github.com/fortheusers/hb-appstore">native homebrew app</a> for the Wii U and Switch consoles. These console apps try to provide a similar experience to using a web browser, and can be downloaded <a href="https://github.com/fortheusers/hb-appstore/releases">here</a>.
<Trans i18nKey="aboutDescription2">
<a href="/submit-or-request">Submit</a>
<a href="/api-info">API Info</a>
</Trans>
</p>
<p className="pNormalWidth">
The individual hosted packages are updated regularly with new apps and updates. These are maintained by ForTheUsers staff and volunteers from the community. If you would like to help or report and outdated package, please contact us on <a href="https://discord.gg/F2PKpEj">Discord</a>.
<Trans i18nKey="aboutDescription3">
<a href="/dmca-request">DMCA Page</a>
</Trans>
</p>
<h3><Trans i18nKey="howItWorksTitle" /></h3>
<p className="pNormalWidth">
<Trans i18nKey="howItWorksDescription1">
<a href="https://github.com/fortheusers/hb-appstore">Github</a>
<a href="https://github.com/fortheusers/hb-appstore/releases">Download</a>
</Trans>
</p>
<p className="pNormalWidth">
The Switch and Wii U platform icons were designed by <a href="https://dribbble.com/shots/10302424-Nintendo-Controllers">Fred Corbin</a>.
<Trans i18nKey="howItWorksDescription2">
<a href="https://discord.gg/F2PKpEj">Discord</a>
</Trans>
</p>
<p className="pNormalWidth">
<Trans i18nKey="howItWorksDescription3">
<a href="https://dribbble.com/shots/10302424-Nintendo-Controllers">Art Credit</a>
</Trans>
</p>
<p style={{marginTop: -40}} className="pNormalWidth creditsContainer" dangerouslySetInnerHTML={{__html: hbasCreditsHTML}}>
</p>
<h3>App Authors</h3>
<p className="pNormalWidth">
Of course, this project wouldn't exist without the developers of the apps themselves. Thank you to all of the developers who have contributed to the homebrew community!
<br/><br/>
<Trans i18nKey="appAuthorsDescription" /><br/><br/>
{authorList}
</p>
<h3>Donations</h3>
<h3><Trans i18nKey="donationsTitle" /></h3>
<p className="pNormalWidth">
Thank you for your interest in supporting this project! We are not accepting donations, but if you would like to support the developers of the apps listed here, please visit their respective Github pages or websites as listed above.
<Trans i18nKey="donationsDescription1" />
</p>
<p className="pNormalWidth">
Otherwise, if you are still interested in supporting the project directly, we can recommend that you consider looking into and donating to one of the following causes instead:
<Trans i18nKey="donationsDescription2" />
<br/><br/>
<table className="donationList">
<tr>
@ -241,12 +258,17 @@ class InfoPage extends Component {
</tr>
</table>
</p>
<h3>Licensing Info</h3>
<h3><Trans i18nKey="licensingTitle" /></h3>
<p className="pNormalWidth">
This website and the console clients are licensed under the <a href="https://www.gnu.org/licenses/gpl-3.0.en.html">GPLv3</a>. The content on the repositories we host is also available to use under a <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC-BY-SA license</a>.
<Trans i18nKey="licensingDescription">
<a href="https://www.gnu.org/licenses/gpl-3.0.en.html">GPLv3 License</a>
<a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC License</a>
</Trans>
</p>
<p className="pNormalWidth">
That's pretty much everything! For other questions, reach out to one of the developers listed above, or join our <a href="https://discord.gg/F2PKpEj">Discord</a> server.
<Trans i18nKey="finalNote">
<a href="https://discord.gg/F2PKpEj">Discord Link</a>
</Trans>
</p>
<br/><br/><br/><br/><br/><br/><br/><br/><br/>
</div>;

View file

@ -7,7 +7,7 @@ import { faGithub } from '@fortawesome/free-brands-svg-icons';
import JSZip from 'jszip';
import { urlToPromise, saveAs } from './LibGet';
import PlatformPicker from './PlatformPicker';
import AppList from './AppList';
import {fetchPackages} from './AppList';
import loader from './img/loader.gif';
import noicon from './img/noicon.png';
import './Quickstore.css';
@ -44,7 +44,7 @@ const QuickStore = (props: { platform: Platform }) => {
useEffect(() => {
const fetchData = async () => {
const allPackages = await AppList.fetchPackages();
const allPackages = await fetchPackages();
setAllApps(allPackages);
}
fetchData();

View file

@ -5,52 +5,54 @@ import { getParams } from './Utils';
import ToolTip from 'react-portal-tooltip';
import './MainDisplay';
import { withTranslation } from 'react-i18next';
const categories = [
{
short: "_search",
name: "Search",
name: "search",
icon: faSearch,
hover: " Search by App title or developer"
}, {
short: "_all",
name: "All Apps",
name: "allApps",
icon: faThLarge,
hover: "All Apps"
}, {
short: "_stats",
name: "Statistics",
name: "statistics",
icon: faChartArea,
hover: " View and compare download stats"
}, {
short: "game",
name: "Games",
name: "games",
icon: faPlay,
hover: " Homebrew games and ports"
}, {
short: "emu",
name: "Emulators",
name: "emulators",
icon: faGamepad,
hover: " Games console emulators"
}, {
short: "tool",
name: "Tools",
name: "tools",
icon: faCog,
hover: " Practical applications"
}, {
short: "advanced",
name: "Advanced",
name: "advanced",
icon: faPuzzlePiece,
hover: " System tools that usually require other apps to run"
}, {
short: "theme",
name: "Themes",
name: "themes",
icon: faSwatchbook,
hover: " Theming tools",
platform: "switch"
},
{
short: "aroma",
name: "Aroma-Ready",
name: "aroma",
icon: faCoffee,
hover: " Applications that have been ported or written specifically for the aroma enviroment",
platform: "wiiu"
@ -62,18 +64,18 @@ const categories = [
// },
{
short: "_misc",
name: "Misc",
name: "misc",
icon: faCubes,
hover: " Apps that have no specific category"
}, {
short: "_quickstore",
name: "QuickStore",
name: "quickstore",
icon: faFastForward,
hover: " Quickly compile a bundle off apps to download in one zipfile"
},
{
short: "legacy",
name: "Legacy",
name: "legacy",
icon: faBriefcase,
hover: " Apps that now have limited functionality and are limited by OS version or CFW version"
},
@ -82,6 +84,14 @@ const categories = [
let selected = "_all";
let choice = "_all";
export function getCurrentCategory() {
return selected;
}
export function getAllCategories() {
return categories;
}
class Sidebar extends Component {
constructor(props) {
super();
@ -121,17 +131,10 @@ class Sidebar extends Component {
isTooltipActive: false
}
static getCurrentCategory() {
return selected;
}
static getAllCategories() {
return categories;
}
render() {
const platInfo = (this.platform && this.platform !== "all") ? `/${this.platform}` : "";
const { t } = this.props;
return (
<div className={`Sidebar _${this.platform}_only`}>
{
@ -161,7 +164,7 @@ class Sidebar extends Component {
onMouseLeave={e => this.setState({ toolTipCat: null })}
>
{cat.name || "All Apps"}
{t(cat.name) || t("allApps")}
</span>
<ToolTip
@ -190,4 +193,4 @@ class Sidebar extends Component {
}
}
export default Sidebar;
export default withTranslation()(Sidebar);

View file

@ -270,4 +270,4 @@ export function init_theme() {
switch_theme_rules();
}
}
}
}

21
src/i18n.js Normal file
View file

@ -0,0 +1,21 @@
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import enTranslation from './locales/en.json';
i18n
.use(initReactI18next)
.init({
resources: {
en: {
translation: enTranslation
}
},
lng: 'en',
fallbackLng: 'en',
interpolation: {
escapeValue: false
}
});
export default i18n;

View file

@ -2,5 +2,6 @@ import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import MainDisplay from './MainDisplay';
import './i18n';
ReactDOM.render(<MainDisplay />, document.getElementById('root'));

55
src/locales/en.json Normal file
View file

@ -0,0 +1,55 @@
{
"- App Listing Page": "-",
"title": "Homebrew App Store",
"titleBy": " by <0>ForTheUsers</0>",
"homebrewDescription": "Homebrew App Store is a free and open-source repository of <0>homebrew apps</0> for the Wii U and Switch consoles. The apps, tools, and games distributed here are all made by independent software developers within the community.",
"submitRequest": "If you would like to list your own open-source app here, or request an existing one to add to this index, please see the <0>Submit</0> page. For other info about the team and project, see our <1>About</1> page.",
"choosePlatform": "Choose a Platform",
"wiiu": "Wii U",
"switch": "Switch",
"both": "Both",
"- App Listing UI": "-",
"allApps": "All Apps",
"adjustSort": "Adjust Sort",
"leaveFeedback": "Leave Feedback",
"license": "GPLv3 License",
"dmca": "DMCA Form",
"changeTheme": "Change Theme",
"disclaimer": "ForTheUsers is NOT affiliated with Nintendo Co. Ltd",
"listing.sort.recent": "by most recent",
"listing.sort.downloads": "by download count",
"listing.sort.alpha": "alphabetically",
"listing.sort.size": "by size (descending)",
"listing.sort.random": "randomly",
"- Sidebar Labels": "-",
"search": "Search",
"statistics": "Statistics",
"games": "Games",
"emulators": "Emulators",
"tools": "Tools",
"advanced": "Advanced",
"themes": "Themes",
"aroma": "Aroma",
"misc": "Misc",
"quickstore": "QuickStore",
"legacy": "Legacy",
"- About Page": "-",
"aboutTitle": "About hb-appstore",
"aboutDescription1": "Homebrew App Store is a free and open-source repository of <0>homebrew apps</0> for the Wii U and Switch consoles. This listing is maintained by the <2>ForTheUsers team</2>, with the goal of making accessible and preserving the efforts of independent developers and hobbyists to end users.",
"aboutDescription2": "If you would like to list your own open-source app here, or request an existing one to add to this index, please see the <0>Submit</0> page. For already listed apps, an <2>API</2> is available.",
"aboutDescription3": "If you are a copyright holder and are concerned some of your work is being infringed upon, please fill out this <0>DMCA Form</0> to submit a takedown request. This also applies if you are an open-source developer and don't want us to distribute your project here.",
"howItWorksTitle": "How It Works",
"howItWorksDescription1": "The content in our repositories is available both as a website and as a <0>native homebrew app</0> for the Wii U and Switch consoles. These console apps try to provide a similar experience to using a web browser, and can be downloaded <1>here</1>.",
"howItWorksDescription2": "The individual hosted packages are updated regularly with new apps and updates. These are maintained by ForTheUsers staff and volunteers from the community. If you would like to help or report and outdated package, please contact us on <0>Discord</0>.",
"howItWorksDescription3": "The Switch and Wii U platform icons were designed by <0>Fred Corbin</0>.",
"appAuthorsDescription": "Of course, this project wouldn't exist without the developers of the apps themselves. Thank you to all of the developers who have contributed to the homebrew community!",
"donationsTitle": "Donations",
"donationsDescription1": "Thank you for your interest in supporting this project! We are not accepting donations, but if you would like to support the developers of the apps listed here, please visit their respective Github pages or websites as listed above.",
"donationsDescription2": "Otherwise, if you are still interested in supporting the project directly, we can recommend that you consider looking into and donating to one of the following causes instead:",
"licensingTitle": "Licensing Info",
"licensingDescription": "This website and the console clients are licensed under the <0>GPLv3</0>. The content on the repositories we host is also available to use under a <1>CC-BY-SA license</1>.",
"finalNote": "That's pretty much everything! For other questions, reach out to one of the developers listed above, or join our <0>Discord</0> server."
}

View file

@ -1038,6 +1038,13 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57"
integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==
dependencies:
regenerator-runtime "^0.14.0"
"@babel/template@^7.18.10", "@babel/template@^7.3.3":
version "7.18.10"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
@ -4886,6 +4893,13 @@ html-minifier-terser@^6.0.2:
relateurl "^0.2.7"
terser "^5.10.0"
html-parse-stringify@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2"
integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==
dependencies:
void-elements "3.1.0"
html-webpack-plugin@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50"
@ -4980,6 +4994,13 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
i18next@^23.10.1:
version "23.10.1"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.10.1.tgz#217ce93b75edbe559ac42be00a20566b53937df6"
integrity sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==
dependencies:
"@babel/runtime" "^7.23.2"
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@ -7492,6 +7513,14 @@ react-fontawesome@^1.6.1:
dependencies:
prop-types "^15.5.6"
react-i18next@^14.1.0:
version "14.1.0"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.0.tgz#44da74fbffd416f5d0c5307ef31735cf10cc91d9"
integrity sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==
dependencies:
"@babel/runtime" "^7.23.9"
html-parse-stringify "^3.0.1"
react-input-autosize@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-3.0.0.tgz#6b5898c790d4478d69420b55441fcc31d5c50a85"
@ -7787,6 +7816,11 @@ regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
regenerator-runtime@^0.14.0:
version "0.14.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
regenerator-transform@^0.15.0:
version "0.15.0"
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
@ -8927,6 +8961,11 @@ vary@~1.1.2:
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
void-elements@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==
w3c-hr-time@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"