Add translations

This commit is contained in:
Nicola Benaglia 2025-05-19 23:53:43 +02:00
parent d00265d878
commit ab1e36fd4e
16 changed files with 72 additions and 60 deletions

View File

@ -138,6 +138,7 @@ export const BlockedUsersModal = () => {
} catch (error) { } catch (error) {
setOpenSnackGlobal(true); setOpenSnackGlobal(true);
setInfoSnackCustom({ setInfoSnackCustom({
//TODO translate
type: 'error', type: 'error',
message: error?.message || 'Unable to block user', message: error?.message || 'Unable to block user',
}); });

View File

@ -2388,6 +2388,7 @@ export const Group = ({
: 'flex', : 'flex',
}} }}
></AuthenticatedContainerInnerRight> ></AuthenticatedContainerInnerRight>
<LoadingSnackbar <LoadingSnackbar
open={isLoadingGroup} open={isLoadingGroup}
info={{ info={{

View File

@ -17,8 +17,9 @@ import { useTranslation } from 'react-i18next';
export const GroupInvites = ({ myAddress, setOpenAddGroup }) => { export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
const [groupsWithJoinRequests, setGroupsWithJoinRequests] = useState([]); const [groupsWithJoinRequests, setGroupsWithJoinRequests] = useState([]);
const [isExpanded, setIsExpanded] = useState(false); const [isExpanded, setIsExpanded] = useState(false);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const { t } = useTranslation(['auth', 'core', 'group']);
const theme = useTheme();
const getJoinRequests = async () => { const getJoinRequests = async () => {
try { try {
@ -37,9 +38,6 @@ export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
} }
}; };
const { t } = useTranslation(['auth', 'core', 'group']);
const theme = useTheme();
useEffect(() => { useEffect(() => {
if (myAddress) { if (myAddress) {
getJoinRequests(); getJoinRequests();
@ -75,6 +73,7 @@ export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
{groupsWithJoinRequests?.length > 0 && {groupsWithJoinRequests?.length > 0 &&
` (${groupsWithJoinRequests?.length})`} ` (${groupsWithJoinRequests?.length})`}
</Typography> </Typography>
{isExpanded ? ( {isExpanded ? (
<ExpandLessIcon <ExpandLessIcon
sx={{ sx={{
@ -113,6 +112,7 @@ export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
<CustomLoader /> <CustomLoader />
</Box> </Box>
)} )}
{!loading && groupsWithJoinRequests.length === 0 && ( {!loading && groupsWithJoinRequests.length === 0 && (
<Box <Box
sx={{ sx={{
@ -136,6 +136,7 @@ export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
</Typography> </Typography>
</Box> </Box>
)} )}
<List <List
sx={{ sx={{
width: '100%', width: '100%',

View File

@ -149,6 +149,7 @@ export const GroupJoinRequests = ({
?.length > 0 && ?.length > 0 &&
` (${filteredJoinRequests?.filter((group) => group?.data?.length > 0)?.length})`} ` (${filteredJoinRequests?.filter((group) => group?.data?.length > 0)?.length})`}
</Typography> </Typography>
{isExpanded ? ( {isExpanded ? (
<ExpandLessIcon <ExpandLessIcon
sx={{ sx={{
@ -163,6 +164,7 @@ export const GroupJoinRequests = ({
/> />
)} )}
</ButtonBase> </ButtonBase>
<Collapse in={isExpanded} timeout="auto" unmountOnExit> <Collapse in={isExpanded} timeout="auto" unmountOnExit>
<Box <Box
sx={{ sx={{
@ -186,6 +188,7 @@ export const GroupJoinRequests = ({
<CustomLoader /> <CustomLoader />
</Box> </Box>
)} )}
{!loading && {!loading &&
(filteredJoinRequests.length === 0 || (filteredJoinRequests.length === 0 ||
filteredJoinRequests?.filter((group) => group?.data?.length > 0) filteredJoinRequests?.filter((group) => group?.data?.length > 0)
@ -212,6 +215,7 @@ export const GroupJoinRequests = ({
</Typography> </Typography>
</Box> </Box>
)} )}
<List <List
className="scrollable-container" className="scrollable-container"
sx={{ sx={{
@ -267,7 +271,7 @@ export const GroupJoinRequests = ({
fontSize: '13px', fontSize: '13px',
fontWeight: 400, fontWeight: 400,
}, },
}} }} // TODO translate
primary={`${group?.group?.groupName} has ${group?.data?.length} pending join requests.`} primary={`${group?.group?.groupName} has ${group?.data?.length} pending join requests.`}
/> />
</ListItemButton> </ListItemButton>

View File

@ -29,7 +29,6 @@ import {
isRunningPublicNodeAtom, isRunningPublicNodeAtom,
timestampEnterDataSelector, timestampEnterDataSelector,
} from '../../atoms/global'; } from '../../atoms/global';
import { timeDifferenceForNotificationChats } from './Group'; import { timeDifferenceForNotificationChats } from './Group';
import { useAtom, useAtomValue } from 'jotai'; import { useAtom, useAtomValue } from 'jotai';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -56,23 +55,23 @@ export const GroupList = ({
return ( return (
<div <div
style={{ style={{
display: 'flex',
width: '380px',
flexDirection: 'column',
alignItems: 'flex-start', alignItems: 'flex-start',
height: '100%',
background: theme.palette.background.surface, background: theme.palette.background.surface,
borderRadius: '0px 15px 15px 0px', borderRadius: '0px 15px 15px 0px',
display: 'flex',
flexDirection: 'column',
height: '100%',
padding: '0px 2px', padding: '0px 2px',
width: '380px',
}} }}
> >
<Box <Box
sx={{ sx={{
width: '100%',
alignItems: 'center', alignItems: 'center',
justifyContent: 'center',
display: 'flex', display: 'flex',
gap: '10px', gap: '10px',
justifyContent: 'center',
width: '100%',
}} }}
> >
<ButtonBase <ButtonBase
@ -252,7 +251,7 @@ const GroupItem = React.memo(
padding: '10px', padding: '10px',
width: '100%', width: '100%',
'&:hover': { '&:hover': {
backgroundColor: 'action.hover', // background on hover backgroundColor: 'action.hover',
}, },
}} }}
> >
@ -296,7 +295,7 @@ const GroupItem = React.memo(
theme.palette.text.primary, theme.palette.text.primary,
fontSize: '16px', fontSize: '16px',
}, },
}} // Change the color of the primary text }}
secondaryTypographyProps={{ secondaryTypographyProps={{
style: { style: {
color: color:

View File

@ -1,5 +1,5 @@
import { Box, Divider, Typography, useTheme } from '@mui/material'; import { Box, Divider, Typography, useTheme } from '@mui/material';
import React from 'react'; import { useEffect, useMemo, useState } from 'react';
import { Spacer } from '../../common/Spacer'; import { Spacer } from '../../common/Spacer';
import { ThingsToDoInitial } from './ThingsToDoInitial'; import { ThingsToDoInitial } from './ThingsToDoInitial';
import { GroupJoinRequests } from './GroupJoinRequests'; import { GroupJoinRequests } from './GroupJoinRequests';
@ -28,28 +28,28 @@ export const HomeDesktop = ({
setDesktopViewMode, setDesktopViewMode,
desktopViewMode, desktopViewMode,
}) => { }) => {
const [checked1, setChecked1] = React.useState(false); const [checked1, setChecked1] = useState(false);
const [checked2, setChecked2] = React.useState(false); const [checked2, setChecked2] = useState(false);
const { t } = useTranslation(['auth', 'core', 'group']); const { t } = useTranslation(['auth', 'core', 'group']);
const theme = useTheme(); const theme = useTheme();
React.useEffect(() => { useEffect(() => {
if (balance && +balance >= 6) { if (balance && +balance >= 6) {
setChecked1(true); setChecked1(true);
} }
}, [balance]); }, [balance]);
React.useEffect(() => { useEffect(() => {
if (name) setChecked2(true); if (name) setChecked2(true);
}, [name]); }, [name]);
const isLoaded = React.useMemo(() => { const isLoaded = useMemo(() => {
if (userInfo !== null) return true; if (userInfo !== null) return true;
return false; return false;
}, [userInfo]); }, [userInfo]);
const hasDoneNameAndBalanceAndIsLoaded = React.useMemo(() => { const hasDoneNameAndBalanceAndIsLoaded = useMemo(() => {
if (isLoaded && checked1 && checked2) return true; if (isLoaded && checked1 && checked2) return true;
return false; return false;
}, [checked1, isLoaded, checked2]); }, [checked1, isLoaded, checked2]);
@ -136,14 +136,6 @@ export const HomeDesktop = ({
{desktopViewMode === 'home' && ( {desktopViewMode === 'home' && (
<> <>
{/* <Box sx={{
width: '330px',
display: 'flex',
alignItems: 'center',
justifyContent: 'center'
}}>
<ListOfThreadPostsWatched />
</Box> */}
{hasDoneNameAndBalanceAndIsLoaded && ( {hasDoneNameAndBalanceAndIsLoaded && (
<> <>
<Box <Box

View File

@ -87,6 +87,7 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
const handleCancelBan = async (address) => { const handleCancelBan = async (address) => {
try { try {
const fee = await getFee('CANCEL_GROUP_BAN'); const fee = await getFee('CANCEL_GROUP_BAN');
await show({ await show({
message: t('core:message.question.perform_transaction', { message: t('core:message.question.perform_transaction', {
action: 'CANCEL_GROUP_BAN', action: 'CANCEL_GROUP_BAN',
@ -94,6 +95,7 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
}), }),
publishFee: fee.fee + ' QORT', publishFee: fee.fee + ' QORT',
}); });
setIsLoadingUnban(true); setIsLoadingUnban(true);
new Promise((res, rej) => { new Promise((res, rej) => {
window window
@ -125,7 +127,11 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
.catch((error) => { .catch((error) => {
setInfoSnack({ setInfoSnack({
type: 'error', type: 'error',
message: error.message || 'An error occurred', message:
error.message ||
t('core:message.error.generic', {
postProcess: 'capitalizeFirst',
}),
}); });
setOpenSnack(true); setOpenSnack(true);
rej(error); rej(error);

View File

@ -1,10 +1,4 @@
import React, { import { useCallback, useContext, useEffect, useRef, useState } from 'react';
useCallback,
useContext,
useEffect,
useRef,
useState,
} from 'react';
import { import {
Avatar, Avatar,
Box, Box,
@ -88,7 +82,7 @@ export const ListOfGroupPromotions = () => {
const [promotionTimeInterval, setPromotionTimeInterval] = useAtom( const [promotionTimeInterval, setPromotionTimeInterval] = useAtom(
promotionTimeIntervalAtom promotionTimeIntervalAtom
); );
const [isExpanded, setIsExpanded] = React.useState(false); const [isExpanded, setIsExpanded] = useState(false);
const [openSnack, setOpenSnack] = useState(false); const [openSnack, setOpenSnack] = useState(false);
const [infoSnack, setInfoSnack] = useState(null); const [infoSnack, setInfoSnack] = useState(null);
const [fee, setFee] = useState(null); const [fee, setFee] = useState(null);
@ -101,7 +95,7 @@ export const ListOfGroupPromotions = () => {
const listRef = useRef(null); const listRef = useRef(null);
const rowVirtualizer = useVirtualizer({ const rowVirtualizer = useVirtualizer({
count: promotions.length, count: promotions.length,
getItemKey: React.useCallback( getItemKey: useCallback(
(index) => promotions[index]?.identifier, (index) => promotions[index]?.identifier,
[promotions] [promotions]
), ),
@ -495,6 +489,7 @@ export const ListOfGroupPromotions = () => {
<CustomLoader /> <CustomLoader />
</Box> </Box>
)} )}
{!loading && promotions.length === 0 && ( {!loading && promotions.length === 0 && (
<Box <Box
sx={{ sx={{
@ -518,6 +513,7 @@ export const ListOfGroupPromotions = () => {
</Typography> </Typography>
</Box> </Box>
)} )}
<div <div
style={{ style={{
height: '600px', height: '600px',
@ -776,6 +772,7 @@ export const ListOfGroupPromotions = () => {
}} }}
/> />
)} )}
{promotion?.isOpen === true && ( {promotion?.isOpen === true && (
<NoEncryptionGmailerrorredIcon <NoEncryptionGmailerrorredIcon
sx={{ sx={{
@ -783,6 +780,7 @@ export const ListOfGroupPromotions = () => {
}} }}
/> />
)} )}
<Typography <Typography
sx={{ sx={{
fontSize: '15px', fontSize: '15px',

View File

@ -210,13 +210,13 @@ export const ListOfJoinRequests = ({
> >
<Box <Box
sx={{ sx={{
width: '325px', alignItems: 'center',
height: '250px',
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
alignItems: 'center',
gap: '10px', gap: '10px',
height: '250px',
padding: '10px', padding: '10px',
width: '325px',
}} }}
> >
<LoadingButton <LoadingButton
@ -261,12 +261,12 @@ export const ListOfJoinRequests = ({
</p> </p>
<div <div
style={{ style={{
position: 'relative',
height: '500px',
width: '100%',
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
flexShrink: 1, flexShrink: 1,
height: '500px',
position: 'relative',
width: '100%',
}} }}
> >
<AutoSizer> <AutoSizer>

View File

@ -117,6 +117,7 @@ export const ListOfThreadPostsWatched = () => {
<CustomLoader /> <CustomLoader />
</Box> </Box>
)} )}
{!loading && posts.length === 0 && ( {!loading && posts.length === 0 && (
<Box <Box
sx={{ sx={{
@ -140,6 +141,7 @@ export const ListOfThreadPostsWatched = () => {
</Typography> </Typography>
</Box> </Box>
)} )}
{posts?.length > 0 && ( {posts?.length > 0 && (
<List <List
className="scrollable-container" className="scrollable-container"
@ -172,7 +174,7 @@ export const ListOfThreadPostsWatched = () => {
} }
> >
<ListItemButton disableRipple role={undefined} dense> <ListItemButton disableRipple role={undefined} dense>
<ListItemText <ListItemText //TODO translate
primary={`New post in ${post?.thread?.threadData?.title}`} primary={`New post in ${post?.thread?.threadData?.title}`}
/> />
</ListItemButton> </ListItemButton>

View File

@ -367,9 +367,9 @@ export const ManageMembers = ({
{value === 0 && ( {value === 0 && (
<Box <Box
sx={{ sx={{
width: '100%',
padding: '25px',
maxWidth: '750px', maxWidth: '750px',
padding: '25px',
width: '100%',
}} }}
> >
<Button <Button
@ -398,9 +398,9 @@ export const ManageMembers = ({
{value === 1 && ( {value === 1 && (
<Box <Box
sx={{ sx={{
width: '100%',
padding: '25px',
maxWidth: '750px', maxWidth: '750px',
padding: '25px',
width: '100%',
}} }}
> >
<InviteMember <InviteMember
@ -415,9 +415,9 @@ export const ManageMembers = ({
{value === 2 && ( {value === 2 && (
<Box <Box
sx={{ sx={{
width: '100%',
padding: '25px',
maxWidth: '750px', maxWidth: '750px',
padding: '25px',
width: '100%',
}} }}
> >
<ListOfInvites <ListOfInvites
@ -432,8 +432,8 @@ export const ManageMembers = ({
{value === 3 && ( {value === 3 && (
<Box <Box
sx={{ sx={{
width: '100%',
padding: '25px', padding: '25px',
width: '100%',
maxWidth: '750px', maxWidth: '750px',
}} }}
> >
@ -449,9 +449,9 @@ export const ManageMembers = ({
{value === 4 && ( {value === 4 && (
<Box <Box
sx={{ sx={{
width: '100%',
padding: '25px',
maxWidth: '750px', maxWidth: '750px',
padding: '25px',
width: '100%',
}} }}
> >
<ListOfJoinRequests <ListOfJoinRequests

View File

@ -210,6 +210,7 @@ export const QMailMessages = ({ userName, userAddress }) => {
<CustomLoader /> <CustomLoader />
</Box> </Box>
)} )}
{!loading && mails.length === 0 && ( {!loading && mails.length === 0 && (
<Box <Box
sx={{ sx={{

View File

@ -199,6 +199,7 @@ export const Settings = ({ open, setOpen, rawWallet }) => {
postProcess: 'capitalizeFirstChar', postProcess: 'capitalizeFirstChar',
})} })}
/> />
{window?.electronAPI && ( {window?.electronAPI && (
<FormControlLabel <FormControlLabel
control={ control={
@ -320,6 +321,7 @@ const ExportPrivateKey = ({ rawWallet }) => {
autoComplete="off" autoComplete="off"
onChange={(e) => setPassword(e.target.value)} onChange={(e) => setPassword(e.target.value)}
/> />
{privateKey && ( {privateKey && (
<Button <Button
variant="outlined" variant="outlined"

View File

@ -12,8 +12,10 @@ import { AppsNavBarLeft, AppsNavBarParent } from '../Apps/Apps-styles';
import { NavBack } from '../../assets/Icons/NavBack.tsx'; import { NavBack } from '../../assets/Icons/NavBack.tsx';
import RefreshIcon from '@mui/icons-material/Refresh'; import RefreshIcon from '@mui/icons-material/Refresh';
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';
import { useTranslation } from 'react-i18next';
export const WalletsAppWrapper = () => { export const WalletsAppWrapper = () => {
const { t } = useTranslation(['auth', 'core', 'group']);
const iframeRef = useRef(null); const iframeRef = useRef(null);
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
const [navigationController, setNavigationController] = useAtom( const [navigationController, setNavigationController] = useAtom(
@ -87,7 +89,9 @@ export const WalletsAppWrapper = () => {
justifyContent: 'space-between', justifyContent: 'space-between',
}} }}
> >
<Typography>Q-Wallets</Typography> <Typography>
{t('core:q_apps.q_wallets', { postProcess: 'capitalizeFirst' })}
</Typography>
<ButtonBase onClick={handleClose}> <ButtonBase onClick={handleClose}>
<CloseIcon <CloseIcon

View File

@ -513,7 +513,7 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
{t('core:amount', { postProcess: 'capitalizeFirst' })} {t('core:amount', { postProcess: 'capitalizeFirst' })}
</TableCell> </TableCell>
<TableCell> <TableCell>
{t('core:time', { postProcess: 'capitalizeFirst' })} {t('core:time.time', { postProcess: 'capitalizeFirst' })}
</TableCell> </TableCell>
</TableRow> </TableRow>
</TableHead> </TableHead>

View File

@ -296,7 +296,8 @@
"about": "about this Q-App", "about": "about this Q-App",
"q_mail": "q-mail", "q_mail": "q-mail",
"q_manager": "q-manager", "q_manager": "q-manager",
"q_sandbox": "q-Sandbox" "q_sandbox": "q-Sandbox",
"q_wallets": "q-Wallets"
}, },
"receiver": "receiver", "receiver": "receiver",
"sender": "sender", "sender": "sender",
@ -319,9 +320,9 @@
"hour_one": "{{count}} hour", "hour_one": "{{count}} hour",
"hour_other": "{{count}} hours", "hour_other": "{{count}} hours",
"minute_one": "{{count}} minute", "minute_one": "{{count}} minute",
"minute_other": "{{count}} minutes" "minute_other": "{{count}} minutes",
"time": "time"
}, },
"time": "time",
"title": "title", "title": "title",
"tutorial": "tutorial", "tutorial": "tutorial",
"user_lookup": "user lookup", "user_lookup": "user lookup",