summaryrefslogtreecommitdiff
path: root/frontend/src/components/store
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/components/store')
-rw-r--r--frontend/src/components/store/PluginCard.tsx16
-rw-r--r--frontend/src/components/store/Store.tsx54
2 files changed, 42 insertions, 28 deletions
diff --git a/frontend/src/components/store/PluginCard.tsx b/frontend/src/components/store/PluginCard.tsx
index 828d3ae9..b8c622db 100644
--- a/frontend/src/components/store/PluginCard.tsx
+++ b/frontend/src/components/store/PluginCard.tsx
@@ -7,7 +7,9 @@ import {
SuspensefulImage,
} from 'decky-frontend-lib';
import { FC, useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { InstallType } from '../../plugin';
import { StorePlugin, StorePluginVersion, requestPluginInstall } from '../../store';
interface PluginCardProps {
@@ -18,6 +20,8 @@ const PluginCard: FC<PluginCardProps> = ({ plugin }) => {
const [selectedOption, setSelectedOption] = useState<number>(0);
const root: boolean = plugin.tags.some((tag) => tag === 'root');
+ const { t } = useTranslation();
+
return (
<div
className="deckyStoreCard"
@@ -97,7 +101,7 @@ const PluginCard: FC<PluginCardProps> = ({ plugin }) => {
plugin.description
) : (
<span>
- <i style={{ color: '#666' }}>No description provided.</i>
+ <i style={{ color: '#666' }}>{t('PluginCard.plugin_no_desc')}</i>
</span>
)}
</span>
@@ -109,7 +113,7 @@ const PluginCard: FC<PluginCardProps> = ({ plugin }) => {
color: '#fee75c',
}}
>
- <i>This plugin has full access to your Steam Deck.</i>{' '}
+ <i>{t('PluginCard.plugin_full_access')}</i>{' '}
<a
className="deckyStoreCardDescriptionRootLink"
href="https://deckbrew.xyz/root"
@@ -144,9 +148,11 @@ const PluginCard: FC<PluginCardProps> = ({ plugin }) => {
<ButtonItem
bottomSeparator="none"
layout="below"
- onClick={() => requestPluginInstall(plugin.name, plugin.versions[selectedOption])}
+ onClick={() =>
+ requestPluginInstall(plugin.name, plugin.versions[selectedOption], InstallType.INSTALL)
+ }
>
- <span className="deckyStoreCardInstallText">Install</span>
+ <span className="deckyStoreCardInstallText">{t('PluginCard.plugin_install')}</span>
</ButtonItem>
</div>
<div
@@ -163,7 +169,7 @@ const PluginCard: FC<PluginCardProps> = ({ plugin }) => {
label: version.name,
})) as SingleDropdownOption[]
}
- menuLabel="Plugin Version"
+ menuLabel={t('PluginCard.plugin_version_label') as string}
selectedOption={selectedOption}
onChange={({ data }) => setSelectedOption(data)}
/>
diff --git a/frontend/src/components/store/Store.tsx b/frontend/src/components/store/Store.tsx
index 68f6c077..f2d941cd 100644
--- a/frontend/src/components/store/Store.tsx
+++ b/frontend/src/components/store/Store.tsx
@@ -9,6 +9,7 @@ import {
findModule,
} from 'decky-frontend-lib';
import { FC, useEffect, useMemo, useState } from 'react';
+import { useTranslation } from 'react-i18next';
import logo from '../../../assets/plugin_store.png';
import Logger from '../../logger';
@@ -25,6 +26,8 @@ const StorePage: FC<{}> = () => {
return false;
});
+ const { t } = useTranslation();
+
useEffect(() => {
(async () => {
const res = await getPluginList();
@@ -54,13 +57,13 @@ const StorePage: FC<{}> = () => {
}}
tabs={[
{
- title: 'Browse',
+ title: t('Store.store_tabs.title'),
content: <BrowseTab children={{ data: data }} />,
id: 'browse',
renderTabAddon: () => <span className={TabCount}>{data.length}</span>,
},
{
- title: 'About',
+ title: t('Store.store_tabs.about'),
content: <AboutTab />,
id: 'about',
},
@@ -73,10 +76,12 @@ const StorePage: FC<{}> = () => {
};
const BrowseTab: FC<{ children: { data: StorePlugin[] } }> = (data) => {
+ const { t } = useTranslation();
+
const sortOptions = useMemo(
(): DropdownOption[] => [
- { data: 1, label: 'Alphabetical (A to Z)' },
- { data: 2, label: 'Alphabetical (Z to A)' },
+ { data: 1, label: t('Store.store_tabs.alph_desc') },
+ { data: 2, label: t('Store.store_tabs.alph_asce') },
],
[],
);
@@ -105,11 +110,11 @@ const BrowseTab: FC<{ children: { data: StorePlugin[] } }> = (data) => {
width: '47.5%',
}}
>
- <span className="DialogLabel">Sort</span>
+ <span className="DialogLabel">{t("Store.store_sort.label")}</span>
<Dropdown
- menuLabel="Sort"
+ menuLabel={t("Store.store_sort.label") as string}
rgOptions={sortOptions}
- strDefaultLabel="Last Updated (Newest)"
+ strDefaultLabel={t("Store.store_sort.label_def") as string}
selectedOption={selectedSort}
onChange={(e) => setSort(e.data)}
/>
@@ -122,11 +127,11 @@ const BrowseTab: FC<{ children: { data: StorePlugin[] } }> = (data) => {
marginLeft: 'auto',
}}
>
- <span className="DialogLabel">Filter</span>
+ <span className="DialogLabel">{t("Store.store_filter.label")}</span>
<Dropdown
- menuLabel="Filter"
+ menuLabel={t("Store.store_filter.label")}
rgOptions={filterOptions}
- strDefaultLabel="All"
+ strDefaultLabel={t("Store.store_filter.label_def")}
selectedOption={selectedFilter}
onChange={(e) => setFilter(e.data)}
/>
@@ -136,7 +141,7 @@ const BrowseTab: FC<{ children: { data: StorePlugin[] } }> = (data) => {
<div style={{ justifyContent: 'center', display: 'flex' }}>
<Focusable style={{ display: 'flex', alignItems: 'center', width: '96%' }}>
<div style={{ width: '100%' }}>
- <TextField label="Search" value={searchFieldValue} onChange={(e) => setSearchValue(e.target.value)} />
+ <TextField label={t("Store.store_search.label")} value={searchFieldValue} onChange={(e) => setSearchValue(e.target.value)} />
</div>
</Focusable>
</div>
@@ -151,11 +156,11 @@ const BrowseTab: FC<{ children: { data: StorePlugin[] } }> = (data) => {
maxWidth: '100%',
}}
>
- <span className="DialogLabel">Sort</span>
+ <span className="DialogLabel">{t('Store.store_sort.label')}</span>
<Dropdown
- menuLabel="Sort"
+ menuLabel={t('Store.store_sort.label') as string}
rgOptions={sortOptions}
- strDefaultLabel="Last Updated (Newest)"
+ strDefaultLabel={t('Store.store_sort.label_def') as string}
selectedOption={selectedSort}
onChange={(e) => setSort(e.data)}
/>
@@ -165,7 +170,11 @@ const BrowseTab: FC<{ children: { data: StorePlugin[] } }> = (data) => {
<div style={{ justifyContent: 'center', display: 'flex' }}>
<Focusable style={{ display: 'flex', alignItems: 'center', width: '96%' }}>
<div style={{ width: '100%' }}>
- <TextField label="Search" value={searchFieldValue} onChange={(e) => setSearchValue(e.target.value)} />
+ <TextField
+ label={t('Store.store_search.label')}
+ value={searchFieldValue}
+ onChange={(e) => setSearchValue(e.target.value)}
+ />
</div>
</Focusable>
</div>
@@ -192,6 +201,8 @@ const BrowseTab: FC<{ children: { data: StorePlugin[] } }> = (data) => {
};
const AboutTab: FC<{}> = () => {
+ const { t } = useTranslation();
+
return (
<div
style={{
@@ -216,7 +227,7 @@ const AboutTab: FC<{}> = () => {
/>
<span className="deckyStoreAboutHeader">Testing</span>
<span>
- Please consider testing new plugins to help the Decky Loader team!{' '}
+ {t('Store.store_testing_cta')}{' '}
<a
href="https://deckbrew.xyz/testing"
target="_blank"
@@ -227,13 +238,10 @@ const AboutTab: FC<{}> = () => {
deckbrew.xyz/testing
</a>
</span>
- <span className="deckyStoreAboutHeader">Contributing</span>
- <span>
- If you would like to contribute to the Decky Plugin Store, check the SteamDeckHomebrew/decky-plugin-template
- repository on GitHub. Information on development and distribution is available in the README.
- </span>
- <span className="deckyStoreAboutHeader">Source Code</span>
- <span>All plugin source code is available on SteamDeckHomebrew/decky-plugin-database repository on GitHub.</span>
+ <span className="deckyStoreAboutHeader">{t('Store.store_contrib.label')}</span>
+ <span>{t('Store.store_contrib.desc')}</span>
+ <span className="deckyStoreAboutHeader">{t('Store.store_source.label')}</span>
+ <span>{t('Store.store_source.desc')}</span>
</div>
);
};