diff --git a/docs/i18n_languages.md b/docs/i18n_languages.md index 90330ca..d98bfd5 100644 --- a/docs/i18n_languages.md +++ b/docs/i18n_languages.md @@ -20,7 +20,7 @@ Translation in GUI: - For all translation in uppercase `{ postProcess: 'capitalizeAll' }` - See `.src/i18n/i18n.ts` for processor definition -## Namespace +## Namespaces These are the current namespaces, in which all translations are organized: diff --git a/src/App.tsx b/src/App.tsx index fb60be6..1c6b23b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -307,7 +307,7 @@ function App() { const [sendqortState, setSendqortState] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isLoadingSendCoin, setIsLoadingSendCoin] = useState(false); - + const isAuthenticated = extState === 'authenticated'; const { t } = useTranslation([ 'auth', 'core', @@ -1353,6 +1353,7 @@ function App() { /> )} + {authenticatedMode === 'ltc' && ( )} + {extState === 'authenticated' && isMainWindow && ( + )} + + + + )} - - + {!isAuthenticated && ( + + + + + + + + + + )} ); } diff --git a/src/components/Apps/AppsDesktop.tsx b/src/components/Apps/AppsDesktop.tsx index b0fdf90..d5626f8 100644 --- a/src/components/Apps/AppsDesktop.tsx +++ b/src/components/Apps/AppsDesktop.tsx @@ -25,6 +25,8 @@ import { CoreSyncStatus } from '../CoreSyncStatus'; import { MessagingIconFilled } from '../../assets/Icons/MessagingIconFilled'; import { useAtom } from 'jotai'; import { useTranslation } from 'react-i18next'; +import LanguageSelector from '../Language/LanguageSelector'; +import ThemeSelector from '../Theme/ThemeSelector'; const uid = new ShortUniqueId({ length: 8 }); @@ -358,7 +360,7 @@ export const AppsDesktop = ({ flexDirection: 'column', gap: '25px', height: '100vh', - width: '60px', + width: 'auto', // must adapt to the choosen language }} > )} + {mode !== 'home' && ( )} + {mode === 'appInfo-from-category' && !selectedTab && ( )} @@ -560,6 +564,26 @@ export const AppsDesktop = ({ )} + + + + + + + + + + ); }; diff --git a/src/components/Apps/AppsDevMode.tsx b/src/components/Apps/AppsDevMode.tsx index 7d90e0b..52680cd 100644 --- a/src/components/Apps/AppsDevMode.tsx +++ b/src/components/Apps/AppsDevMode.tsx @@ -18,6 +18,8 @@ import { IconWrapper } from '../Desktop/DesktopFooter'; import { CoreSyncStatus } from '../CoreSyncStatus'; import { MessagingIconFilled } from '../../assets/Icons/MessagingIconFilled'; import { useTranslation } from 'react-i18next'; +import LanguageSelector from '../Language/LanguageSelector'; +import ThemeSelector from '../Theme/ThemeSelector'; const uid = new ShortUniqueId({ length: 8 }); @@ -229,11 +231,12 @@ export const AppsDevMode = ({ {mode !== 'home' && } + + + + + + + + + {mode === 'home' && ( @@ -360,7 +381,7 @@ export const AppsDevMode = ({ flexDirection: 'column', height: '100vh', overflow: 'auto', - width: '100%', + width: 'auto', }} > @@ -399,7 +420,7 @@ export const AppsDevMode = ({ flexDirection: 'column', height: '100vh', overflow: 'auto', - width: '100%', + width: 'auto', }} > diff --git a/src/components/Apps/AppsDevModeHome.tsx b/src/components/Apps/AppsDevModeHome.tsx index f1225df..9e56d93 100644 --- a/src/components/Apps/AppsDevModeHome.tsx +++ b/src/components/Apps/AppsDevModeHome.tsx @@ -319,6 +319,7 @@ export const AppsDevModeHome = ({ + + {t('core:server', { postProcess: 'capitalizeFirstChar' })} @@ -358,6 +359,7 @@ export const AppsDevModeHome = ({ + + {t('core:directory', { postProcess: 'capitalizeFirstChar' })} @@ -499,6 +501,7 @@ export const AppsDevModeHome = ({ postProcess: 'capitalizeFirstChar', })} + + { const [navigationController, setNavigationController] = useAtom( navigationControllerAtom ); + const { t } = useTranslation([ + 'auth', + 'core', + 'group', + 'question', + 'tutorial', + ]); const theme = useTheme(); - const { t } = useTranslation(['auth', 'core', 'group', 'question', 'tutorial']); + const { t } = useTranslation([ + 'auth', + 'core', + 'group', + 'question', + 'tutorial', + ]); const [isNewTabWindow, setIsNewTabWindow] = useState(false); const tabsRef = useRef(null); - const [anchorEl, setAnchorEl] = useState(null); - const open = Boolean(anchorEl); - - const handleClick = (event) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; useEffect(() => { // Scroll to the last tab whenever the tabs array changes (e.g., when a new tab is added) diff --git a/src/components/Apps/AppsHomeDesktop.tsx b/src/components/Apps/AppsHomeDesktop.tsx index d75196a..428b0cf 100644 --- a/src/components/Apps/AppsHomeDesktop.tsx +++ b/src/components/Apps/AppsHomeDesktop.tsx @@ -14,8 +14,6 @@ import { SortablePinnedApps } from './SortablePinnedApps'; import { extractComponents } from '../Chat/MessageDisplay'; import ArrowOutwardIcon from '@mui/icons-material/ArrowOutward'; import { AppsPrivate } from './AppsPrivate'; -import ThemeSelector from '../Theme/ThemeSelector'; -import LanguageSelector from '../Language/LanguageSelector'; import { useTranslation } from 'react-i18next'; export const AppsHomeDesktop = ({ @@ -77,7 +75,7 @@ export const AppsHomeDesktop = ({ - - - ); }; diff --git a/src/components/Apps/AppsLibraryDesktop.tsx b/src/components/Apps/AppsLibraryDesktop.tsx index d844dbf..910401b 100644 --- a/src/components/Apps/AppsLibraryDesktop.tsx +++ b/src/components/Apps/AppsLibraryDesktop.tsx @@ -347,6 +347,7 @@ export const AppsLibraryDesktop = ({ {officialApps?.map((qapp) => { return ( { > + { anchorEl={anchorEl} open={open} onClose={handleClose} - MenuListProps={{ - 'aria-labelledby': 'basic-button', - }} anchorOrigin={{ vertical: 'bottom', horizontal: 'center', @@ -281,6 +279,9 @@ export const AppsNavBarDesktop = ({ disableBack }) => { horizontal: 'center', }} slotProps={{ + list: { + 'aria-labelledby': 'basic-button', + }, paper: { sx: { backgroundColor: theme.palette.background.default, diff --git a/src/components/Apps/AppsPrivate.tsx b/src/components/Apps/AppsPrivate.tsx index 143ad0e..933e5e1 100644 --- a/src/components/Apps/AppsPrivate.tsx +++ b/src/components/Apps/AppsPrivate.tsx @@ -311,7 +311,11 @@ export const AppsPrivate = ({ myName, myAddress }) => { - Private + + {t('core:app_private', { + postProcess: 'capitalizeFirstChar', + })} + @@ -336,10 +340,12 @@ export const AppsPrivate = ({ myName, myAddress }) => { }} maxWidth="md" fullWidth={true} - PaperProps={{ - style: { - backgroundColor: theme.palette.background.paper, - boxShadow: 'none', + slotProps={{ + paper: { + style: { + backgroundColor: theme.palette.background.paper, + boxShadow: 'none', + }, }, }} > @@ -384,6 +390,7 @@ export const AppsPrivate = ({ myName, myAddress }) => { /> + {valueTabPrivateApp === 0 && ( <> @@ -399,6 +406,7 @@ export const AppsPrivate = ({ myName, myAddress }) => { postProcess: 'capitalizeFirstChar', })} + ); }; diff --git a/src/components/Minting/Minting.tsx b/src/components/Minting/Minting.tsx index 8ac5e55..198b5e1 100644 --- a/src/components/Minting/Minting.tsx +++ b/src/components/Minting/Minting.tsx @@ -1,5 +1,6 @@ import { Alert, + AppBar, Box, Button, Card, @@ -10,6 +11,7 @@ import { Divider, IconButton, Snackbar, + Toolbar, Typography, useTheme, } from '@mui/material'; @@ -573,34 +575,26 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { }, }} > - - {t('group:message.generic.manage_minting', { - postProcess: 'capitalizeAll', - })} - + + + + {t('group:message.generic.manage_minting', { + postProcess: 'capitalizeFirstChar', + })} + - setIsOpenMinting(false)} - aria-label={t('core:action.close', { - postProcess: 'capitalizeFirstChar', - })} - > - - + setIsOpenMinting(false)} + aria-label={t('core:action.close', { + postProcess: 'capitalizeFirstChar', + })} + > + + + + { )} - - - - -
-
+
@@ -513,6 +512,7 @@ export const NotAuthenticated = ({ + + + {t('auth:advanced_users', { postProcess: 'capitalizeFirstChar' })} + + )} + + + {show && ( + http://127.0.0.1:12391 + { return ( {t('auth:apikey.enter', { postProcess: 'capitalizeFirstChar' })} + - - - - ); }; diff --git a/src/components/Theme/ThemeManager.tsx b/src/components/Theme/ThemeManager.tsx index 1bfee78..d5e3087 100644 --- a/src/components/Theme/ThemeManager.tsx +++ b/src/components/Theme/ThemeManager.tsx @@ -10,12 +10,12 @@ import { DialogActions, List, ListItemText, - ListItemSecondaryAction, TextField, Tabs, Tab, ListItemButton, useTheme, + ListItem, } from '@mui/material'; import { Sketch } from '@uiw/react-color'; import DeleteIcon from '@mui/icons-material/Delete'; @@ -31,6 +31,7 @@ import FileDownloadIcon from '@mui/icons-material/FileDownload'; import { saveFileToDiskGeneric } from '../../utils/generateWallet/generateWallet'; import { handleImportClick } from '../../utils/fileReading'; import { useTranslation } from 'react-i18next'; +import '../../styles/themeManager.css'; const uid = new ShortUniqueId({ length: 8 }); @@ -189,6 +190,7 @@ export default function ThemeManager() { {label} + - - {theme.id !== 'default' && ( - <> - exportTheme(theme)}> - + + {theme.id !== 'default' && ( + <> + exportTheme(theme)}> + + + handleEditTheme(theme.id)}> + + + handleDeleteTheme(theme.id)}> + + + + )} + handleApplyTheme(theme)}> + - handleEditTheme(theme.id)}> - - - handleDeleteTheme(theme.id)}> - - - - )} - handleApplyTheme(theme)}> - - - + + } + > ))} diff --git a/src/components/Theme/ThemeSelector.tsx b/src/components/Theme/ThemeSelector.tsx index 6c25e3c..1d269a7 100644 --- a/src/components/Theme/ThemeSelector.tsx +++ b/src/components/Theme/ThemeSelector.tsx @@ -1,8 +1,9 @@ import { useThemeContext } from './ThemeContext'; -import { IconButton, Tooltip } from '@mui/material'; +import { Box, IconButton, Tooltip } from '@mui/material'; import LightModeIcon from '@mui/icons-material/LightMode'; import DarkModeIcon from '@mui/icons-material/DarkMode'; import { useTranslation } from 'react-i18next'; +import { useRef } from 'react'; const ThemeSelector = () => { const { t } = useTranslation([ @@ -13,17 +14,10 @@ const ThemeSelector = () => { 'tutorial', ]); const { themeMode, toggleTheme } = useThemeContext(); + const selectorRef = useRef(null); return ( -
+ { {themeMode === 'dark' ? : } -
+
); }; diff --git a/src/components/Tutorials/Tutorials.tsx b/src/components/Tutorials/Tutorials.tsx index 068c3ad..4075b67 100644 --- a/src/components/Tutorials/Tutorials.tsx +++ b/src/components/Tutorials/Tutorials.tsx @@ -54,6 +54,7 @@ export const Tutorials = () => { {openTutorialModal?.multi?.map((item, index) => { return ( { const [isLoadingUser, setIsLoadingUser] = useState(false); const [isLoadingPayments, setIsLoadingPayments] = useState(false); const [payments, setPayments] = useState([]); + const lookupFunc = useCallback( async (messageAddressOrName) => { try { @@ -481,6 +481,7 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => { />
)} + {!isLoadingPayments && addressInfo && ( {{hostname}}
sta effettuando {{count}} ordine d'acquisto", - "buy_order_request_other": "l'applicazione
{{hostname}}
sta effettuando {{count}} ordini d'acquisto", + "buy_order_request": "l'applicazione
{{hostname}}
sta effettuando {{count}} ordine d'acquisto.", + "buy_order_request_other": "l'applicazione
{{hostname}}
sta effettuando {{count}} ordini d'acquisto.", "devmode_local_node": "si prega di utilizzare il tuo nodo locale per la modalità Dev! Logout e usa il nodo locale.", "downloading": "download", "downloading_decrypting_app": "download e decritting di app private.", @@ -232,7 +232,7 @@ "fee_qort": "commissione: {{ message }} QORT", "fetching_data": "recupero dei dati dell'app", "foreign_fee": "commissione esterna: {{ message }}", - "get_qort_trade_portal": "ottieni Qort con il portale di trade crosschain di Qortal", + "get_qort_trade_portal": "ottieni QORT con il portale di trade crosschain di Qortal", "minimal_qort_balance": "avere almeno {{ quantity }} QORT a bilancio (4 qort per la chat, 1.25 per il nome, 0.75 per alcune transazioni)", "mentioned": "menzionato", "message_with_image": "questo messaggio ha già un'immagine", @@ -258,26 +258,26 @@ "overwrite_qdn": "sovrascrivi a QDN", "password_confirm": "si prega di confermare una password", "password_enter": "inserisci una password", - "payment_request": "the Application
{{hostname}}
is requesting a payment", + "payment_request": "l'applicazione
{{hostname}}
sta richiedendo un pagamento", "people_reaction": "persone che hanno reagito con {{ reaction }}", "processing_transaction": "elaborazione della transazione, per favore aspetta ...", "publish_data": "pubblica dati su Qortal: qualsiasi cosa, dalle app ai video. Completamente decentralizzato!", - "publishing": "publishing. Attendere, per favore.", + "publishing": "in pubblicazione. Attendere, per favore.", "qdn": "usa il salvataggio QDN", - "rating": "rating for {{ service }} {{ name }}", + "rating": "valutazione di {{ service }} {{ name }}", "register_name": "hai bisogno di un nome Qortal registrato per salvare in QDN le app bloccate.", - "replied_to": "replied to {{ person }}", + "replied_to": "risposta a {{ person }}", "revert_default": "ritorna a predefinito", "revert_qdn": "ritorna a QDN", "save_qdn": "salva su QDN", - "secure_ownership": "proprietà sicura dei dati pubblicati con il tuo nome. Puoi anche vendere il tuo nome, insieme ai tuoi dati a una terza parte.", + "secure_ownership": "sicura proprietà dei dati pubblicati con il tuo nome. Puoi anche vendere il tuo nome, insieme ai tuoi dati a una terza parte.", "select_file": "seleziona un file", "select_image": "seleziona un'immagine per un logo", "select_zip": "seleziona il file .zip contenente contenuto statico:", "sending": "invio ...", "settings": "si utilizza il modo di esportazione/importazione per salvare le impostazioni.", "space_for_admins": "mi dispiace, questo spazio è solo per gli amministratori.", - "unread_messages": "messaggi non letto di seguito", + "unread_messages": "messaggi non letti qua sotto", "unsaved_changes": "hai cambiato modifiche alle app bloccate. Salvali su QDN.", "updating": "aggiornamento" }, @@ -316,7 +316,7 @@ "voted": "votato con successo. Si prega di attendere un paio di minuti affinché la rete propaghi le modifiche." } }, - "minting_status": "stato di minting", + "minting_status": "stato minting", "name": "nome", "name_app": "nome/app", "new_post_in": "nuovo post in {{ title }}", @@ -339,10 +339,10 @@ "publish": "pubblicazione", "q_apps": { "about": "su questo Q-app", - "q_mail": "Q-mail", - "q_manager": "Q-manager", - "q_sandbox": "Q-sandbox", - "q_wallets": "Q-wallet" + "q_mail": "Q-Mail", + "q_manager": "Q-Manager", + "q_sandbox": "Q-Sandbox", + "q_wallets": "Q-Wallets" }, "receiver": "ricevitore", "sender": "mittente", @@ -358,7 +358,7 @@ "dark": "scuro", "dark_mode": "modalità scura", "default": "tema di default", - "light": "chiara", + "light": "chiaro", "light_mode": "modalità chiara", "manager": "manager tema", "name": "nome tema" diff --git a/src/i18n/locales/it/group.json b/src/i18n/locales/it/group.json index fe345c4..1b4aeb4 100644 --- a/src/i18n/locales/it/group.json +++ b/src/i18n/locales/it/group.json @@ -65,26 +65,26 @@ "generic": { "avatar_publish_fee": "la pubblicazione di un Avatar richiede {{ fee }}", "avatar_registered_name": "È necessario un nome registrato per impostare un avatar", - "admin_only": "verranno mostrati solo gruppi in cui sei un amministratore", + "admin_only": "verranno mostrati solo i gruppi in cui sei un amministratore", "already_in_group": "sei già in questo gruppo!", "block_delay_minimum": "ritardo minimo del blocco per le approvazioni delle transazioni di gruppo", "block_delay_maximum": "ritardo massimo del blocco per le approvazioni delle transazioni di gruppo", "closed_group": "questo è un gruppo chiuso/privato, quindi dovrai attendere fino a quando un amministratore accetta la tua richiesta", "descrypt_wallet": "decrittazione del wallet ...", - "encryption_key": "la prima chiave di crittografia comune del gruppo è in procinto di creare. Si prega di attendere qualche minuto per essere recuperato dalla rete. Controllo ogni 2 minuti ...", + "encryption_key": "la prima chiave di crittografia comune del gruppo è in fase di creazione. Si prega di attendere qualche minuto per essere recuperato dalla rete. Controllo ogni 2 minuti ...", "group_announcement": "annunci di gruppo", "group_approval_threshold": "soglia di approvazione del gruppo (numero / percentuale di amministratori che devono approvare una transazione)", "group_encrypted": "gruppo crittografato", "group_invited_you": "{{group}} has invited you", "group_key_created": "primo tasto di gruppo creato.", "group_member_list_changed": "l'elenco dei membri del gruppo è cambiato. Si prega di rivivere nuovamente la chiave segreta.", - "group_no_secret_key": "non esiste una chiave segreta di gruppo. Sii il primo amministratore a pubblicarne uno!", - "group_secret_key_no_owner": "l'ultima chiave segreta del gruppo è stata pubblicata da un non proprietario. Come proprietario del gruppo si prega di rivivere la chiave come salvaguardia.", + "group_no_secret_key": "non esiste una chiave segreta di gruppo. Potresti essere il primo amministratore a pubblicarne una!", + "group_secret_key_no_owner": "l'ultima chiave segreta del gruppo è stata pubblicata da un non proprietario. Come proprietario del gruppo si prega di ricriptare la chiave per sicurezza.", "invalid_content": "contenuto non valido, mittente o timestamp nei dati di reazione", "invalid_data": "contenuto di caricamento degli errori: dati non validi", "latest_promotion": "verrà mostrata solo l'ultima promozione della settimana per il tuo gruppo.", "loading_members": "caricamento dell'elenco dei membri con nomi ... Attendi.", - "max_chars": "max 200 caratteri. Pubblica tassa", + "max_chars": "max 200 caratteri. Commissione", "manage_minting": "gestisci il minting", "minter_group": "al momento non fai parte del gruppo Minter", "mintership_app": "visita l'app Q-Mintership per chiedere di diventare un minter", diff --git a/src/i18n/locales/ru/core.json b/src/i18n/locales/ru/core.json index d5e4f61..927cec1 100644 --- a/src/i18n/locales/ru/core.json +++ b/src/i18n/locales/ru/core.json @@ -339,8 +339,8 @@ "about": "об этом Q-App", "q_mail": "Q-Mail", "q_manager": "Q-Manager", - "q_sandbox": "Q-SANDBOX", - "q_wallets": "Q-Wallet" + "q_sandbox": "Q-Sandbox", + "q_wallets": "Q-Wallets" }, "receiver": "приемник", "sender": "отправитель", diff --git a/src/i18n/locales/zh/core.json b/src/i18n/locales/zh/core.json index 58ac531..51168b8 100644 --- a/src/i18n/locales/zh/core.json +++ b/src/i18n/locales/zh/core.json @@ -337,9 +337,9 @@ "q_apps": { "about": "关于这个Q-App", "q_mail": "Q邮件", - "q_manager": "Q-Manager", - "q_sandbox": "Q-Sandbox", - "q_wallets": "Q-Wallet" + "q_manager": "Q-经理", + "q_sandbox": "Q-沙箱", + "q_wallets": "Q-钱包" }, "receiver": "接收者", "sender": "发件人", diff --git a/src/styles/theme-dark.ts b/src/styles/theme-dark.ts index cfa5952..a519cd6 100644 --- a/src/styles/theme-dark.ts +++ b/src/styles/theme-dark.ts @@ -6,7 +6,7 @@ export const darkThemeOptions: ThemeOptions = { palette: { mode: 'dark', primary: { - main: 'rgba(0, 133, 255, 1)', + main: 'rgb(100, 155, 240)', dark: 'rgb(45, 92, 201)', light: 'rgb(130, 185, 255)', }, @@ -14,9 +14,9 @@ export const darkThemeOptions: ThemeOptions = { main: 'rgb(69, 173, 255)', }, background: { - default: 'rgba(6, 10, 30, 1)', + default: 'rgb(49, 51, 56)', + surface: 'rgb(58, 60, 65)', paper: 'rgb(62, 64, 68)', - surface: 'rgb(113, 113, 114)', }, text: { primary: 'rgb(255, 255, 255)', diff --git a/src/styles/theme-light.ts b/src/styles/theme-light.ts index 4f6a1b1..3cfbdae 100644 --- a/src/styles/theme-light.ts +++ b/src/styles/theme-light.ts @@ -15,8 +15,8 @@ export const lightThemeOptions: ThemeOptions = { }, background: { default: 'rgba(250, 250, 250, 1)', - paper: 'rgb(220, 220, 220)', // darker card background surface: 'rgb(240, 240, 240)', // optional middle gray for replies, side panels + paper: 'rgb(220, 220, 220)', // darker card background }, text: { primary: 'rgba(0, 0, 0, 0.87)', // 87% black (slightly softened) diff --git a/src/components/Theme/themeManager.css b/src/styles/themeManager.css similarity index 100% rename from src/components/Theme/themeManager.css rename to src/styles/themeManager.css