Add translations

This commit is contained in:
Nicola Benaglia 2025-05-10 18:49:59 +02:00
parent 99aa214a0f
commit b946e19236
11 changed files with 224 additions and 144 deletions

View File

@ -322,7 +322,7 @@ export const Wallets = ({ setExtState, setRawWallet, rawWallet }) => {
sx={{ sx={{
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
}} }} // TODO translate
> >
<Label>Name</Label> <Label>Name</Label>
<Input <Input

View File

@ -446,7 +446,7 @@ export const AppsDevModeHome = ({
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
gap: '5px', gap: '5px',
}} }} // TODO translate
> >
<Label>Domain</Label> <Label>Domain</Label>
<Input <Input

View File

@ -152,7 +152,6 @@ export const AppsPrivate = ({ myName }) => {
const object64 = await objectToBase64(objectToSave); const object64 = await objectToBase64(objectToSave);
const decryptedData = await window.sendMessage( const decryptedData = await window.sendMessage(
'ENCRYPT_QORTAL_GROUP_DATA', 'ENCRYPT_QORTAL_GROUP_DATA',
{ {
base64: object64, base64: object64,
groupId: selectedGroup, groupId: selectedGroup,
@ -313,7 +312,7 @@ export const AppsPrivate = ({ myName }) => {
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
gap: '5px', gap: '5px',
}} }} // TODO translate
> >
<Label>Select a group</Label> <Label>Select a group</Label>
<Label>Only private groups will be shown</Label> <Label>Only private groups will be shown</Label>

View File

@ -371,7 +371,6 @@ export const AddGroup = ({ address, open, setOpen }) => {
}} }}
> >
<Label> <Label>
{' '}
{t('group:group.type', { {t('group:group.type', {
postProcess: 'capitalize', postProcess: 'capitalize',
})} })}
@ -428,6 +427,7 @@ export const AddGroup = ({ address, open, setOpen }) => {
postProcess: 'capitalize', postProcess: 'capitalize',
})} })}
</Label> </Label>
<Select <Select
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"

View File

@ -15,6 +15,7 @@ export const InviteMember = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
const inviteMember = async () => { const inviteMember = async () => {
try { try {
const fee = await getFee('GROUP_INVITE'); const fee = await getFee('GROUP_INVITE');
await show({ await show({
message: t('group:question.perform_transaction', { message: t('group:question.perform_transaction', {
action: 'GROUP_INVITE', action: 'GROUP_INVITE',
@ -22,7 +23,9 @@ export const InviteMember = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
}), }),
publishFee: fee.fee + ' QORT', publishFee: fee.fee + ' QORT',
}); });
setIsLoadingInvite(true); setIsLoadingInvite(true);
if (!expiryTime || !value) return; if (!expiryTime || !value) return;
new Promise((res, rej) => { new Promise((res, rej) => {
window window
@ -42,7 +45,6 @@ export const InviteMember = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
}); });
setOpenSnack(true); setOpenSnack(true);
res(response); res(response);
setValue(''); setValue('');
return; return;
} }
@ -56,7 +58,11 @@ export const InviteMember = ({ 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: 'capitalize',
}),
}); });
setOpenSnack(true); setOpenSnack(true);
rej(error); rej(error);
@ -81,16 +87,21 @@ export const InviteMember = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
}} }}
> >
{t('group:action.invite_member', { postProcess: 'capitalize' })} {t('group:action.invite_member', { postProcess: 'capitalize' })}
<Spacer height="20px" /> <Spacer height="20px" />
<Input <Input
value={value} value={value}
placeholder="Name or address" placeholder="Name or address"
onChange={(e) => setValue(e.target.value)} onChange={(e) => setValue(e.target.value)}
/> />
<Spacer height="20px" /> <Spacer height="20px" />
<Label> <Label>
{t('group:invitation_expiry', { postProcess: 'capitalize' })} {t('group:invitation_expiry', { postProcess: 'capitalize' })}
</Label> </Label>
<Select <Select
labelId="demo-simple-select-label" labelId="demo-simple-select-label"
id="demo-simple-select" id="demo-simple-select"
@ -109,7 +120,9 @@ export const InviteMember = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
<MenuItem value={1296000}>{t('core:time.day', { count: 15 })}</MenuItem> <MenuItem value={1296000}>{t('core:time.day', { count: 15 })}</MenuItem>
<MenuItem value={2592000}>{t('core:time.day', { count: 30 })}</MenuItem> <MenuItem value={2592000}>{t('core:time.day', { count: 30 })}</MenuItem>
</Select> </Select>
<Spacer height="20px" /> <Spacer height="20px" />
<LoadingButton <LoadingButton
variant="contained" variant="contained"
loadingPosition="start" loadingPosition="start"

View File

@ -34,7 +34,6 @@ import {
import { Spacer } from '../../common/Spacer'; import { Spacer } from '../../common/Spacer';
import { CustomLoader } from '../../common/CustomLoader'; import { CustomLoader } from '../../common/CustomLoader';
import { RequestQueueWithPromise } from '../../utils/queue/queue'; import { RequestQueueWithPromise } from '../../utils/queue/queue';
import { import {
myGroupsWhereIAmAdminAtom, myGroupsWhereIAmAdminAtom,
promotionTimeIntervalAtom, promotionTimeIntervalAtom,
@ -89,9 +88,7 @@ export const ListOfGroupPromotions = () => {
const [promotionTimeInterval, setPromotionTimeInterval] = useAtom( const [promotionTimeInterval, setPromotionTimeInterval] = useAtom(
promotionTimeIntervalAtom promotionTimeIntervalAtom
); );
const [isExpanded, setIsExpanded] = React.useState(false); const [isExpanded, setIsExpanded] = React.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);
@ -99,7 +96,6 @@ export const ListOfGroupPromotions = () => {
const [isLoadingPublish, setIsLoadingPublish] = useState(false); const [isLoadingPublish, setIsLoadingPublish] = useState(false);
const { show } = useContext(MyContext); const { show } = useContext(MyContext);
const setTxList = useSetAtom(txListAtom); const setTxList = useSetAtom(txListAtom);
const theme = useTheme(); const theme = useTheme();
const { t } = useTranslation(['core', 'group']); const { t } = useTranslation(['core', 'group']);
const listRef = useRef(null); const listRef = useRef(null);
@ -250,8 +246,9 @@ export const ListOfGroupPromotions = () => {
}); });
setInfoSnack({ setInfoSnack({
type: 'success', type: 'success',
message: message: t('group:message.success.group_promotion', {
'Successfully published promotion. It may take a couple of minutes for the promotion to appear', postProcess: 'capitalize',
}),
}); });
setOpenSnack(true); setOpenSnack(true);
setText(''); setText('');
@ -261,7 +258,10 @@ export const ListOfGroupPromotions = () => {
setInfoSnack({ setInfoSnack({
type: 'error', type: 'error',
message: message:
error?.message || 'Error publishing the promotion. Please try again', error?.message ||
t('group:message.error.group_promotion', {
postProcess: 'capitalize',
}),
}); });
setOpenSnack(true); setOpenSnack(true);
} finally { } finally {
@ -290,8 +290,9 @@ export const ListOfGroupPromotions = () => {
if (!response?.error) { if (!response?.error) {
setInfoSnack({ setInfoSnack({
type: 'success', type: 'success',
message: message: t('group:message.success.group_join', {
'Successfully requested to join group. It may take a couple of minutes for the changes to propagate', postProcess: 'capitalize',
}),
}); });
if (isOpen) { if (isOpen) {
@ -299,8 +300,14 @@ export const ListOfGroupPromotions = () => {
{ {
...response, ...response,
type: 'joined-group', type: 'joined-group',
label: `Joined Group ${group?.groupName}: awaiting confirmation`, label: t('group:message.success.group_join_label', {
labelDone: `Joined Group ${group?.groupName}: success!`, group_name: group?.groupName,
postProcess: 'capitalize',
}),
labelDone: t('group:message.success.group_join_label', {
group_name: group?.groupName,
postProcess: 'capitalize',
}),
done: false, done: false,
groupId, groupId,
}, },
@ -311,15 +318,20 @@ export const ListOfGroupPromotions = () => {
{ {
...response, ...response,
type: 'joined-group-request', type: 'joined-group-request',
label: `Requested to join Group ${group?.groupName}: awaiting confirmation`, label: t('group:message.success.group_join_request', {
labelDone: `Requested to join Group ${group?.groupName}: success!`, group_name: group?.groupName,
postProcess: 'capitalize',
}),
labelDone: t('group:message.success.group_join_outcome', {
group_name: group?.groupName,
postProcess: 'capitalize',
}),
done: false, done: false,
groupId, groupId,
}, },
...prev, ...prev,
]); ]);
} }
setOpenSnack(true); setOpenSnack(true);
handlePopoverClose(); handlePopoverClose();
res(response); res(response);
@ -336,7 +348,9 @@ export const ListOfGroupPromotions = () => {
.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: 'capitalize' }),
}); });
setOpenSnack(true); setOpenSnack(true);
rej(error); rej(error);
@ -385,7 +399,7 @@ export const ListOfGroupPromotions = () => {
fontSize: '1rem', fontSize: '1rem',
}} }}
> >
Group promotions{' '} {t('group:group.promotions', { postProcess: 'capitalize' })}{' '}
{promotions.length > 0 && ` (${promotions.length})`} {promotions.length > 0 && ` (${promotions.length})`}
</Typography> </Typography>
@ -444,7 +458,7 @@ export const ListOfGroupPromotions = () => {
fontSize: '12px', fontSize: '12px',
}} }}
> >
Add Promotion {t('group.action.add_promotion', { postProcess: 'capitalize' })}
</Button> </Button>
</Box> </Box>
@ -490,7 +504,9 @@ export const ListOfGroupPromotions = () => {
color: 'rgba(255, 255, 255, 0.2)', color: 'rgba(255, 255, 255, 0.2)',
}} }}
> >
Nothing to display {t('group.message.generic.no_display', {
postProcess: 'capitalize',
})}
</Typography> </Typography>
</Box> </Box>
)} )}
@ -537,23 +553,25 @@ export const ListOfGroupPromotions = () => {
ref={rowVirtualizer.measureElement} //measure dynamic row height ref={rowVirtualizer.measureElement} //measure dynamic row height
key={promotion?.identifier} key={promotion?.identifier}
style={{ style={{
position: 'absolute',
top: 0,
left: '50%', // Move to the center horizontally
transform: `translateY(${virtualRow.start}px) translateX(-50%)`, // Adjust for centering
width: '100%', // Control width (90% of the parent)
padding: '10px 0',
display: 'flex',
alignItems: 'center', alignItems: 'center',
overscrollBehavior: 'none', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
gap: '5px', gap: '5px',
left: '50%', // Move to the center horizontally
overscrollBehavior: 'none',
padding: '10px 0',
position: 'absolute',
top: 0,
transform: `translateY(${virtualRow.start}px) translateX(-50%)`, // Adjust for centering
width: '100%', // Control width (90% of the parent)
}} }}
> >
<ErrorBoundary <ErrorBoundary
fallback={ fallback={
<Typography> <Typography>
Error loading content: Invalid Data {t('group.message.generic.invalid_data', {
postProcess: 'capitalize',
})}
</Typography> </Typography>
} }
> >
@ -568,7 +586,7 @@ export const ListOfGroupPromotions = () => {
<Popover <Popover
open={openPopoverIndex === promotion?.groupId} open={openPopoverIndex === promotion?.groupId}
anchorEl={popoverAnchor} anchorEl={popoverAnchor}
onClose={(event, reason) => { onClose={(reason) => {
if (reason === 'backdropClick') { if (reason === 'backdropClick') {
// Prevent closing on backdrop click // Prevent closing on backdrop click
return; return;
@ -603,7 +621,10 @@ export const ListOfGroupPromotions = () => {
fontWeight: 600, fontWeight: 600,
}} }}
> >
Group name: {` ${promotion?.groupName}`} {t('group:group.name', {
postProcess: 'capitalize',
})}
: {` ${promotion?.groupName}`}
</Typography> </Typography>
<Typography <Typography
@ -612,8 +633,10 @@ export const ListOfGroupPromotions = () => {
fontWeight: 600, fontWeight: 600,
}} }}
> >
Number of members:{' '} {t('group:group.member_number', {
{` ${promotion?.memberCount}`} postProcess: 'capitalize',
})}
: {` ${promotion?.memberCount}`}
</Typography> </Typography>
{promotion?.description && ( {promotion?.description && (
@ -634,9 +657,9 @@ export const ListOfGroupPromotions = () => {
fontWeight: 600, fontWeight: 600,
}} }}
> >
*This is a closed/private group, so you {t('group:message.generic.closed_group', {
will need to wait until an admin accepts postProcess: 'capitalize',
your request })}
</Typography> </Typography>
)} )}
@ -657,7 +680,9 @@ export const ListOfGroupPromotions = () => {
variant="contained" variant="contained"
onClick={handlePopoverClose} onClick={handlePopoverClose}
> >
Close {t('core:action.close', {
postProcess: 'capitalize',
})}
</LoadingButton> </LoadingButton>
<LoadingButton <LoadingButton
@ -671,7 +696,9 @@ export const ListOfGroupPromotions = () => {
) )
} }
> >
Join {t('core:action.join', {
postProcess: 'capitalize',
})}
</LoadingButton> </LoadingButton>
</Box> </Box>
</Box> </Box>
@ -755,8 +782,12 @@ export const ListOfGroupPromotions = () => {
}} }}
> >
{promotion?.isOpen {promotion?.isOpen
? 'Public group' ? t('group:group.public', {
: 'Private group'} postProcess: 'capitalize',
})
: t('group:group.private', {
postProcess: 'capitalize',
})}
</Typography> </Typography>
</Box> </Box>
@ -790,7 +821,10 @@ export const ListOfGroupPromotions = () => {
color: theme.palette.text.primary, color: theme.palette.text.primary,
}} }}
> >
Join Group: {` ${promotion?.groupName}`} {t('group:action.join_group', {
postProcess: 'capitalize',
})}
: {` ${promotion?.groupName}`}
</Button> </Button>
</Box> </Box>
</Box> </Box>
@ -810,90 +844,114 @@ export const ListOfGroupPromotions = () => {
<Spacer height="20px" /> <Spacer height="20px" />
{isShowModal && ( <Dialog
<Dialog open={isShowModal}
open={isShowModal} aria-labelledby="alert-dialog-title"
aria-labelledby="alert-dialog-title" aria-describedby="alert-dialog-description"
aria-describedby="alert-dialog-description" >
> <DialogTitle id="alert-dialog-title">
<DialogTitle id="alert-dialog-title"> {t('group:action.promote_group', { postProcess: 'capitalize' })}
{'Promote your group to non-members'} </DialogTitle>
</DialogTitle>
<DialogContent> <DialogContent>
<DialogContentText id="alert-dialog-description"> <DialogContentText id="alert-dialog-description">
Only the latest promotion from the week will be shown for your {t('group:message.generic.latest_promotion', {
group. postProcess: 'capitalize',
</DialogContentText> })}
<DialogContentText id="alert-dialog-description2"> </DialogContentText>
Max 200 characters. Publish Fee: {fee && fee} {' QORT'}
</DialogContentText> <DialogContentText id="alert-dialog-description2">
<Spacer height="20px" /> {t('group:message.generic.max_chars', {
<Box postProcess: 'capitalize',
sx={{ })}
display: 'flex', : {fee && fee} {' QORT'}
flexDirection: 'column', </DialogContentText>
gap: '5px',
}} <Spacer height="20px" />
<Box
sx={{
display: 'flex',
flexDirection: 'column',
gap: '5px',
}}
>
<Label>
{t('group:action.select_group', {
postProcess: 'capitalize',
})}
</Label>
<Label>
{t('group:message.generic.admin_only', {
postProcess: 'capitalize',
})}
</Label>
<Select
labelId="demo-simple-select-label"
id="demo-simple-select"
value={selectedGroup}
label="Groups where you are an admin"
onChange={(e) => setSelectedGroup(e.target.value)}
variant="outlined"
> >
<Label>Select a group</Label> {myGroupsWhereIAmAdmin?.map((group) => {
<Label>Only groups where you are an admin will be shown</Label> return (
<Select <MenuItem key={group?.groupId} value={group?.groupId}>
labelId="demo-simple-select-label" {group?.groupName}
id="demo-simple-select" </MenuItem>
value={selectedGroup} );
label="Groups where you are an admin" })}
onChange={(e) => setSelectedGroup(e.target.value)} </Select>
variant="outlined" </Box>
>
{myGroupsWhereIAmAdmin?.map((group) => { <Spacer height="20px" />
return (
<MenuItem key={group?.groupId} value={group?.groupId}> <TextField
{group?.groupName} label="Promotion text"
</MenuItem> variant="filled"
); fullWidth
})} value={text}
</Select> onChange={(e) => setText(e.target.value)}
</Box> inputProps={{
<Spacer height="20px" /> maxLength: 200,
<TextField }}
label="Promotion text" multiline={true}
variant="filled" sx={{
fullWidth '& .MuiFormLabel-root': {
value={text} color: theme.palette.text.primary,
onChange={(e) => setText(e.target.value)} },
inputProps={{ '& .MuiFormLabel-root.Mui-focused': {
maxLength: 200, color: theme.palette.text.primary,
}} },
multiline={true} }}
sx={{ />
'& .MuiFormLabel-root': { </DialogContent>
color: theme.palette.text.primary,
}, <DialogActions>
'& .MuiFormLabel-root.Mui-focused': { <Button
color: theme.palette.text.primary, disabled={isLoadingPublish}
}, variant="contained"
}} onClick={() => setIsShowModal(false)}
/> >
</DialogContent> {t('core:action.close', {
<DialogActions> postProcess: 'capitalize',
<Button })}
disabled={isLoadingPublish} </Button>
variant="contained" <Button
onClick={() => setIsShowModal(false)} disabled={!text.trim() || !selectedGroup || isLoadingPublish}
> variant="contained"
Close onClick={publishPromo}
</Button> autoFocus
<Button >
disabled={!text.trim() || !selectedGroup || isLoadingPublish} {t('core:action.publish', {
variant="contained" postProcess: 'capitalize',
onClick={publishPromo} })}
autoFocus </Button>
> </DialogActions>
Publish </Dialog>
</Button>
</DialogActions>
</Dialog>
)}
<CustomizedSnackbars <CustomizedSnackbars
open={openSnack} open={openSnack}
setOpen={setOpenSnack} setOpen={setOpenSnack}

View File

@ -1,21 +1,17 @@
import * as React from 'react'; import Snackbar from '@mui/material/Snackbar';
import Button from '@mui/material/Button';
import Snackbar, { SnackbarCloseReason } from '@mui/material/Snackbar';
import Alert from '@mui/material/Alert'; import Alert from '@mui/material/Alert';
export const LoadingSnackbar = ({open, info}) => { export const LoadingSnackbar = ({ open, info }) => {
return ( return (
<div> <div>
<Snackbar anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} open={open}> <Snackbar
<Alert anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
severity="info" open={open}
variant="filled" >
sx={{ width: '100%' }} <Alert severity="info" variant="filled" sx={{ width: '100%' }}>
>
{info?.message} {info?.message}
</Alert> </Alert>
</Snackbar> </Snackbar>
</div> </div>
); );
} };

View File

@ -1,4 +1,3 @@
import * as React from 'react';
import Snackbar, { SnackbarCloseReason } from '@mui/material/Snackbar'; import Snackbar, { SnackbarCloseReason } from '@mui/material/Snackbar';
import Alert from '@mui/material/Alert'; import Alert from '@mui/material/Alert';

View File

@ -198,9 +198,11 @@ export const TaskManager = ({ getUserInfo }) => {
/> />
)} )}
</ListItemIcon> </ListItemIcon>
<ListItemText primary="Ongoing Transactions" /> <ListItemText primary="Ongoing Transactions" />
{open ? <ExpandLess /> : <ExpandMore />} {open ? <ExpandLess /> : <ExpandMore />}
</ListItemButton> </ListItemButton>
<Collapse in={open} timeout="auto" unmountOnExit> <Collapse in={open} timeout="auto" unmountOnExit>
<List component="div" disablePadding> <List component="div" disablePadding>
{txList.map((item) => ( {txList.map((item) => (

View File

@ -27,7 +27,8 @@
}, },
"notify": "notify", "notify": "notify",
"post": "post", "post": "post",
"post_message": "post message" "post_message": "post message",
"publish": "publish"
}, },
"admin": "admin", "admin": "admin",
"core": { "core": {

View File

@ -1,5 +1,6 @@
{ {
"action": { "action": {
"add_promotion": "add promotion",
"ban": "ban member from group", "ban": "ban member from group",
"cancel_ban": "cancel ban", "cancel_ban": "cancel ban",
"copy_private_key": "copy private key", "copy_private_key": "copy private key",
@ -16,9 +17,11 @@
"load_members": "load members with names", "load_members": "load members with names",
"make_admin": "make an admin", "make_admin": "make an admin",
"manage_members": "manage members", "manage_members": "manage members",
"promote_group": "promote your group to non-members",
"refetch_page": "refetch page", "refetch_page": "refetch page",
"remove_admin": "remove as admin", "remove_admin": "remove as admin",
"return_to_thread": "return to threads" "return_to_thread": "return to threads",
"select_group": "select a group"
}, },
"advanced_options": "advanced options", "advanced_options": "advanced options",
"approval_threshold": "group Approval Threshold (number / percentage of Admins that must approve a transaction)", "approval_threshold": "group Approval Threshold (number / percentage of Admins that must approve a transaction)",
@ -36,6 +39,9 @@
"member_number": "number of members", "member_number": "number of members",
"name": "group name", "name": "group name",
"open": "open (public)", "open": "open (public)",
"private": "private group",
"promotions": "group promotions",
"public": "public group",
"type": "group type" "type": "group type"
}, },
"invitation_expiry": "invitation Expiry Time", "invitation_expiry": "invitation Expiry Time",
@ -46,12 +52,16 @@
"latest_mails": "latest Q-Mails", "latest_mails": "latest Q-Mails",
"message": { "message": {
"generic": { "generic": {
"admin_only": "only groups where you are an admin will be shown",
"already_in_group": "you are already in this group!", "already_in_group": "you are already in this group!",
"closed_group": "this is a closed/private group, so you will need to wait until an admin accepts your request", "closed_group": "this is a closed/private group, so you will need to wait until an admin accepts your request",
"descrypt_wallet": "decrypting wallet...", "descrypt_wallet": "decrypting wallet...",
"encryption_key": "the group's first common encryption key is in the process of creation. Please wait a few minutes for it to be retrieved by the network. Checking every 2 minutes...", "encryption_key": "the group's first common encryption key is in the process of creation. Please wait a few minutes for it to be retrieved by the network. Checking every 2 minutes...",
"group_invited_you": "{{group}} has invited you", "group_invited_you": "{{group}} has invited you",
"invalid_data": "error loading content: Invalid Data",
"latest_promotion": "only the latest promotion from the week will be shown for your group.",
"loading_members": "loading member list with names... please wait.", "loading_members": "loading member list with names... please wait.",
"max_chars": " Max 200 characters. Publish Fee",
"no_display": "nothing to display", "no_display": "nothing to display",
"no_selection": "no group selected", "no_selection": "no group selected",
"not_part_group": "you are not part of the encrypted group of members. Wait until an admin re-encrypts the keys.", "not_part_group": "you are not part of the encrypted group of members. Wait until an admin re-encrypts the keys.",
@ -66,6 +76,7 @@
"descrypt_wallet": "error decrypting wallet {{ :errorMessage }}", "descrypt_wallet": "error decrypting wallet {{ :errorMessage }}",
"description_required": "please provide a description", "description_required": "please provide a description",
"group_info": "cannot access group information", "group_info": "cannot access group information",
"group_promotion": "error publishing the promotion. Please try again",
"group_secret_key": "cannot get group secret key", "group_secret_key": "cannot get group secret key",
"name_required": "please provide a name", "name_required": "please provide a name",
"notify_admins": "try notifying an admin from the list of admins below:", "notify_admins": "try notifying an admin from the list of admins below:",
@ -87,6 +98,7 @@
"group_leave_name": "left group {{group_name}}: awaiting confirmation", "group_leave_name": "left group {{group_name}}: awaiting confirmation",
"group_leave_label": "left group {{name}}: success!", "group_leave_label": "left group {{name}}: success!",
"group_member_admin": "successfully made member an admin. It may take a couple of minutes for the changes to propagate", "group_member_admin": "successfully made member an admin. It may take a couple of minutes for the changes to propagate",
"group_promotion": "successfully published promotion. It may take a couple of minutes for the promotion to appear",
"group_remove_member": "successfully removed member as an admin. It may take a couple of minutes for the changes to propagate", "group_remove_member": "successfully removed member as an admin. It may take a couple of minutes for the changes to propagate",
"invitation_cancellation": "successfully canceled invitation. It may take a couple of minutes for the changes to propagate", "invitation_cancellation": "successfully canceled invitation. It may take a couple of minutes for the changes to propagate",
"invitation_request": "accepted join request: awaiting confirmation", "invitation_request": "accepted join request: awaiting confirmation",