0) {
setHasFirstPage(true);
@@ -296,12 +298,14 @@ export const Thread = ({
const urlOlder = `${getBaseApiReact()}${getArbitraryEndpointReact()}?mode=ALL&service=${threadIdentifier}&identifier=${identifier}&limit=1&includemetadata=false&reverse=false&prefix=true&after=${
fullArrayMsg[fullArrayMsg.length - 1].created
}`;
+
const responseOlder = await fetch(urlOlder, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
+
const responseDataOlder = await responseOlder.json();
if (responseDataOlder.length > 0) {
setHasLastPage(true);
@@ -321,6 +325,7 @@ export const Thread = ({
},
[messages, secretKey]
);
+
const getMessages = useCallback(async () => {
if (
!currentThread ||
@@ -337,6 +342,7 @@ export const Thread = ({
groupInfo?.groupId,
isPrivate,
]);
+
const firstMount = useRef(false);
const saveTimestamp = useCallback((currentThread: any, username?: string) => {
@@ -613,6 +619,7 @@ export const Thread = ({
})}
+
{/* Conditionally render the scroll buttons */}
{showScrollButton &&
(isAtBottom ? (
diff --git a/src/components/Group/Group.tsx b/src/components/Group/Group.tsx
index 88538fb..8d6a46b 100644
--- a/src/components/Group/Group.tsx
+++ b/src/components/Group/Group.tsx
@@ -2389,6 +2389,7 @@ export const Group = ({
: 'flex',
}}
>
+
{
const [groupsWithJoinRequests, setGroupsWithJoinRequests] = useState([]);
const [isExpanded, setIsExpanded] = useState(false);
-
const [loading, setLoading] = useState(true);
+ const { t } = useTranslation(['auth', 'core', 'group']);
+ const theme = useTheme();
const getJoinRequests = async () => {
try {
@@ -37,9 +38,6 @@ export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
}
};
- const { t } = useTranslation(['auth', 'core', 'group']);
- const theme = useTheme();
-
useEffect(() => {
if (myAddress) {
getJoinRequests();
@@ -75,6 +73,7 @@ export const GroupInvites = ({ myAddress, setOpenAddGroup }) => {
{groupsWithJoinRequests?.length > 0 &&
` (${groupsWithJoinRequests?.length})`}
+
{isExpanded ? (
{
)}
+
{!loading && groupsWithJoinRequests.length === 0 && (
{
)}
+
{
- const [isExpanded, setIsExpanded] = React.useState(false);
+ const [isExpanded, setIsExpanded] = useState(false);
const { t } = useTranslation(['auth', 'core', 'group']);
- const [groupsWithJoinRequests, setGroupsWithJoinRequests] = React.useState(
- []
- );
- const [loading, setLoading] = React.useState(true);
+ const [groupsWithJoinRequests, setGroupsWithJoinRequests] = useState([]);
+ const [loading, setLoading] = useState(true);
const [txList] = useAtom(txListAtom);
const setMyGroupsWhereIAmAdmin = useSetAtom(myGroupsWhereIAmAdminAtom);
@@ -91,7 +89,7 @@ export const GroupJoinRequests = ({
}
};
- React.useEffect(() => {
+ useEffect(() => {
if (myAddress && groups.length > 0) {
getJoinRequests();
} else {
@@ -99,7 +97,7 @@ export const GroupJoinRequests = ({
}
}, [myAddress, groups]);
- const filteredJoinRequests = React.useMemo(() => {
+ const filteredJoinRequests = useMemo(() => {
return groupsWithJoinRequests.map((group) => {
const filteredGroupRequests = group?.data?.filter((gd) => {
const findJoinRequsetInTxList = txList?.find(
@@ -149,6 +147,7 @@ export const GroupJoinRequests = ({
?.length > 0 &&
` (${filteredJoinRequests?.filter((group) => group?.data?.length > 0)?.length})`}
+
{isExpanded ? (
)}
+
)}
+
{!loading &&
(filteredJoinRequests.length === 0 ||
filteredJoinRequests?.filter((group) => group?.data?.length > 0)
@@ -212,6 +213,7 @@ export const GroupJoinRequests = ({
)}
+
diff --git a/src/components/Group/GroupList.tsx b/src/components/Group/GroupList.tsx
index b9b0433..156d744 100644
--- a/src/components/Group/GroupList.tsx
+++ b/src/components/Group/GroupList.tsx
@@ -29,7 +29,6 @@ import {
isRunningPublicNodeAtom,
timestampEnterDataSelector,
} from '../../atoms/global';
-
import { timeDifferenceForNotificationChats } from './Group';
import { useAtom, useAtomValue } from 'jotai';
import { useTranslation } from 'react-i18next';
@@ -56,23 +55,23 @@ export const GroupList = ({
return (
@@ -296,7 +295,7 @@ const GroupItem = React.memo(
theme.palette.text.primary,
fontSize: '16px',
},
- }} // Change the color of the primary text
+ }}
secondaryTypographyProps={{
style: {
color:
diff --git a/src/components/Group/HomeDesktop.tsx b/src/components/Group/HomeDesktop.tsx
index e5e0d4e..a5cf85e 100644
--- a/src/components/Group/HomeDesktop.tsx
+++ b/src/components/Group/HomeDesktop.tsx
@@ -1,5 +1,5 @@
import { Box, Divider, Typography, useTheme } from '@mui/material';
-import React from 'react';
+import { useEffect, useMemo, useState } from 'react';
import { Spacer } from '../../common/Spacer';
import { ThingsToDoInitial } from './ThingsToDoInitial';
import { GroupJoinRequests } from './GroupJoinRequests';
@@ -28,28 +28,28 @@ export const HomeDesktop = ({
setDesktopViewMode,
desktopViewMode,
}) => {
- const [checked1, setChecked1] = React.useState(false);
- const [checked2, setChecked2] = React.useState(false);
+ const [checked1, setChecked1] = useState(false);
+ const [checked2, setChecked2] = useState(false);
const { t } = useTranslation(['auth', 'core', 'group']);
const theme = useTheme();
- React.useEffect(() => {
+ useEffect(() => {
if (balance && +balance >= 6) {
setChecked1(true);
}
}, [balance]);
- React.useEffect(() => {
+ useEffect(() => {
if (name) setChecked2(true);
}, [name]);
- const isLoaded = React.useMemo(() => {
+ const isLoaded = useMemo(() => {
if (userInfo !== null) return true;
return false;
}, [userInfo]);
- const hasDoneNameAndBalanceAndIsLoaded = React.useMemo(() => {
+ const hasDoneNameAndBalanceAndIsLoaded = useMemo(() => {
if (isLoaded && checked1 && checked2) return true;
return false;
}, [checked1, isLoaded, checked2]);
@@ -136,14 +136,6 @@ export const HomeDesktop = ({
{desktopViewMode === 'home' && (
<>
- {/*
-
- */}
{hasDoneNameAndBalanceAndIsLoaded && (
<>
{
const handleCancelBan = async (address) => {
try {
const fee = await getFee('CANCEL_GROUP_BAN');
+
await show({
message: t('core:message.question.perform_transaction', {
action: 'CANCEL_GROUP_BAN',
@@ -94,6 +95,7 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
}),
publishFee: fee.fee + ' QORT',
});
+
setIsLoadingUnban(true);
new Promise((res, rej) => {
window
@@ -125,7 +127,11 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => {
.catch((error) => {
setInfoSnack({
type: 'error',
- message: error.message || 'An error occurred',
+ message:
+ error.message ||
+ t('core:message.error.generic', {
+ postProcess: 'capitalizeFirstChar',
+ }),
});
setOpenSnack(true);
rej(error);
diff --git a/src/components/Group/ListOfGroupPromotions.tsx b/src/components/Group/ListOfGroupPromotions.tsx
index 1c280d2..4fb29f1 100644
--- a/src/components/Group/ListOfGroupPromotions.tsx
+++ b/src/components/Group/ListOfGroupPromotions.tsx
@@ -1,10 +1,4 @@
-import React, {
- useCallback,
- useContext,
- useEffect,
- useRef,
- useState,
-} from 'react';
+import { useCallback, useContext, useEffect, useRef, useState } from 'react';
import {
Avatar,
Box,
@@ -88,7 +82,7 @@ export const ListOfGroupPromotions = () => {
const [promotionTimeInterval, setPromotionTimeInterval] = useAtom(
promotionTimeIntervalAtom
);
- const [isExpanded, setIsExpanded] = React.useState(false);
+ const [isExpanded, setIsExpanded] = useState(false);
const [openSnack, setOpenSnack] = useState(false);
const [infoSnack, setInfoSnack] = useState(null);
const [fee, setFee] = useState(null);
@@ -101,7 +95,7 @@ export const ListOfGroupPromotions = () => {
const listRef = useRef(null);
const rowVirtualizer = useVirtualizer({
count: promotions.length,
- getItemKey: React.useCallback(
+ getItemKey: useCallback(
(index) => promotions[index]?.identifier,
[promotions]
),
@@ -276,6 +270,7 @@ export const ListOfGroupPromotions = () => {
try {
const groupId = group.groupId;
const fee = await getFee('JOIN_GROUP');
+
await show({
message: t('core:message.question.perform_transaction', {
action: 'JOIN_GROUP',
@@ -283,6 +278,7 @@ export const ListOfGroupPromotions = () => {
}),
publishFee: fee.fee + ' QORT',
});
+
setIsLoadingJoinGroup(true);
await new Promise((res, rej) => {
window
@@ -496,6 +492,7 @@ export const ListOfGroupPromotions = () => {
)}
+
{!loading && promotions.length === 0 && (
{
)}
+
{
}}
/>
)}
+
{promotion?.isOpen === true && (
{
}}
/>
)}
+
diff --git a/src/components/Group/ListOfThreadPostsWatched.tsx b/src/components/Group/ListOfThreadPostsWatched.tsx
index fc94ee5..e0c4820 100644
--- a/src/components/Group/ListOfThreadPostsWatched.tsx
+++ b/src/components/Group/ListOfThreadPostsWatched.tsx
@@ -117,6 +117,7 @@ export const ListOfThreadPostsWatched = () => {
)}
+
{!loading && posts.length === 0 && (
{
)}
+
{posts?.length > 0 && (
{
>
diff --git a/src/components/Group/ManageMembers.tsx b/src/components/Group/ManageMembers.tsx
index 419009e..22c6d0c 100644
--- a/src/components/Group/ManageMembers.tsx
+++ b/src/components/Group/ManageMembers.tsx
@@ -367,9 +367,9 @@ export const ManageMembers = ({
{value === 0 && (
diff --git a/src/components/QortPayment.tsx b/src/components/QortPayment.tsx
index dab6ec2..c031914 100644
--- a/src/components/QortPayment.tsx
+++ b/src/components/QortPayment.tsx
@@ -1,19 +1,13 @@
-import { Box, CircularProgress, useTheme } from '@mui/material';
+import { Box, useTheme } from '@mui/material';
import { useState } from 'react';
-import {
- CustomButton,
- CustomInput,
- CustomLabel,
- TextP,
-} from '../styles/App-styles';
+import { TextP } from '../styles/App-styles';
import { Spacer } from '../common/Spacer';
-import BoundedNumericTextField from '../common/BoundedNumericTextField';
-import { PasswordField } from './PasswordField/PasswordField';
-import { ErrorText } from './ErrorText/ErrorText';
import { getFee } from '../background';
+import { useTranslation } from 'react-i18next';
export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
const theme = useTheme();
+ const { t } = useTranslation(['auth', 'core', 'group']);
const [paymentTo, setPaymentTo] = useState(defaultPaymentTo);
const [paymentAmount, setPaymentAmount] = useState(0);
const [paymentPassword, setPaymentPassword] = useState('');
@@ -26,22 +20,37 @@ export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
setSendPaymentError('');
setSendPaymentSuccess('');
if (!paymentTo) {
- setSendPaymentError('Please enter a recipient');
+ setSendPaymentError(
+ t('auth:action.enter_recipient', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
return;
}
if (!paymentAmount) {
- setSendPaymentError('Please enter an amount greater than 0');
+ setSendPaymentError(
+ t('auth:action.enter_amount', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
return;
}
if (!paymentPassword) {
- setSendPaymentError('Please enter your wallet password');
+ setSendPaymentError(
+ t('auth:action.enter_wallet_password', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
return;
}
- const fee = await getFee('PAYMENT'); // TODO translate
+ const fee = await getFee('PAYMENT');
await show({
- message: `Would you like to transfer ${Number(paymentAmount)} QORT?`,
+ message: t('core:message.question.transfer_qort', {
+ amount: Number(paymentAmount),
+ postProcess: 'capitalizeFirstChar',
+ }),
paymentFee: fee.fee + ' QORT',
});
@@ -87,7 +96,9 @@ export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
textAlign: 'start',
}}
>
- Transfer QORT
+ {t('core:action.transfer_qort', {
+ postProcess: 'capitalizeFirstChar',
+ })}
@@ -101,7 +112,9 @@ export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
textAlign: 'start',
}}
>
- Balance:
+ {t('core:balance', {
+ postProcess: 'capitalizeFirstChar',
+ })}
{
- To
+
+ {t('core:to', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
@@ -132,7 +149,11 @@ export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
- Amount
+
+ {t('core:amount', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
@@ -149,7 +170,9 @@ export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
- Confirm wallet password
+ {t('auth:wallet.password_confirmation', {
+ postProcess: 'capitalizeFirstChar',
+ })}
@@ -171,7 +194,6 @@ export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
{sendPaymentError}
- {/* {sendPaymentSuccess} */}
@@ -192,7 +214,7 @@ export const QortPayment = ({ balance, show, onSuccess, defaultPaymentTo }) => {
}}
/>
)}
- Send
+ {t('core:action.send', { postProcess: 'capitalizeFirstChar' })}
>
);
diff --git a/src/components/UserLookup.tsx/UserLookup.tsx b/src/components/UserLookup.tsx/UserLookup.tsx
index ee0b8c9..675d661 100644
--- a/src/components/UserLookup.tsx/UserLookup.tsx
+++ b/src/components/UserLookup.tsx/UserLookup.tsx
@@ -33,6 +33,7 @@ import {
unsubscribeFromEvent,
} from '../../utils/events';
import { useNameSearch } from '../../hooks/useNameSearch';
+import { useTranslation } from 'react-i18next';
function formatAddress(str) {
if (str.length <= 12) return str;
@@ -45,6 +46,7 @@ function formatAddress(str) {
export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
const theme = useTheme();
+ const { t } = useTranslation(['auth', 'core', 'group']);
const [nameOrAddress, setNameOrAddress] = useState('');
const [inputValue, setInputValue] = useState('');
const { results, isLoading } = useNameSearch(inputValue);
@@ -64,13 +66,27 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
const inputAddressOrName = messageAddressOrName || nameOrAddress;
if (!inputAddressOrName?.trim())
- throw new Error('Please insert a name or address');
+ throw new Error(
+ t('auth:action.insert_name_address', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
+
const owner = await getNameOrAddress(inputAddressOrName);
- if (!owner) throw new Error('Name does not exist');
+ if (!owner)
+ throw new Error(
+ t('auth:message.error.name_not_existing', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
const addressInfoRes = await getAddressInfo(owner);
if (!addressInfoRes?.publicKey) {
- throw new Error('Address does not exist on blockchain');
+ throw new Error(
+ t('auth:message.error.address_not_existing', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
const name = await getNameInfo(owner);
@@ -175,7 +191,9 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
autoFocus
autoComplete="off"
{...params}
- label="Address or Name"
+ label={t('auth:address_name', {
+ postProcess: 'capitalizeFirstChar',
+ })}
onKeyDown={(e) => {
if (e.key === 'Enter' && nameOrAddress) {
lookupFunc(inputValue);
@@ -200,6 +218,7 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
/>
+
{
{errorMessage}
)}
+
{isLoadingUser && (
{
/>
)}
+
{!isLoadingUser && addressInfo && (
<>
@@ -265,7 +286,10 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
textAlign: 'center',
}}
>
- {addressInfo?.name ?? 'Name not registered'}
+ {addressInfo?.name ??
+ t('auth:message.error.name_not_registered', {
+ postProcess: 'capitalizeFirstChar',
+ })}
@@ -307,7 +331,8 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
textAlign: 'center',
}}
>
- Level {addressInfo?.level}
+ {t('core:level', { postProcess: 'capitalizeFirstChar' })}{' '}
+ {addressInfo?.level}
@@ -336,8 +361,13 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
flexShrink: 0,
}}
>
- Address
+
+ {t('auth:address', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
+
{
fontWeight: 700,
}}
>
- copy address
+ {t('auth:action.copy_address', {
+ postProcess: 'capitalizeFirstChar',
+ })}
}
placement="bottom"
@@ -391,7 +423,12 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
width: '100%',
}}
>
- Balance
+
+ {t('core:balance', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
+
{addressInfo?.balance}
@@ -406,7 +443,9 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
});
}}
>
- Send QORT
+ {t('core:action.send_qort', {
+ postProcess: 'capitalizeFirstChar',
+ })}
@@ -440,7 +479,12 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
padding: '15px',
}}
>
- 20 most recent payments
+
+ {t('core:message.generic.most_recent_payment', {
+ count: 20,
+ postProcess: 'capitalizeFirstChar',
+ })}
+
@@ -452,17 +496,33 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
width: '100%',
}}
>
- No payments
+
+ {t('core:message.generic.no_payments', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
)}
- Sender
- Reciver
- Amount
- Time
+
+ {t('core:sender', { postProcess: 'capitalizeFirstChar' })}
+
+
+ {t('core:receiver', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
+
+ {t('core:amount', { postProcess: 'capitalizeFirstChar' })}
+
+
+ {t('core:time.time', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
@@ -479,7 +539,9 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
fontWeight: 700,
}}
>
- copy address
+ {t('auth:action.copy_address', {
+ postProcess: 'capitalizeFirstChar',
+ })}
}
placement="bottom"
@@ -522,7 +584,9 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
fontWeight: 700,
}}
>
- copy address
+ {t('auth:action.copy_address', {
+ postProcess: 'capitalizeFirstChar',
+ })}
}
placement="bottom"
@@ -552,7 +616,9 @@ export const UserLookup = ({ isOpenDrawerLookup, setIsOpenDrawerLookup }) => {
+
{payment?.amount}
+
{formatTimestamp(payment?.timestamp)}
diff --git a/src/components/WrapperUserAction.tsx b/src/components/WrapperUserAction.tsx
index 07b5d45..591c200 100644
--- a/src/components/WrapperUserAction.tsx
+++ b/src/components/WrapperUserAction.tsx
@@ -10,9 +10,11 @@ import { executeEvent } from '../utils/events';
import { MyContext } from '../App';
import { useAtom } from 'jotai';
import { isRunningPublicNodeAtom } from '../atoms/global';
+import { useTranslation } from 'react-i18next';
export const WrapperUserAction = ({ children, address, name, disabled }) => {
const theme = useTheme();
+ const { t } = useTranslation(['auth', 'core', 'group']);
const [isRunningPublicNode] = useAtom(isRunningPublicNodeAtom);
const [anchorEl, setAnchorEl] = useState(null);
@@ -96,7 +98,9 @@ export const WrapperUserAction = ({ children, address, name, disabled }) => {
justifyContent: 'flex-start',
}}
>
- Message
+ {t('core:message.message', {
+ postProcess: 'capitalizeFirstChar',
+ })}
{/* Option 2: Send QORT */}
@@ -114,8 +118,11 @@ export const WrapperUserAction = ({ children, address, name, disabled }) => {
justifyContent: 'flex-start',
}}
>
- Send QORT
+ {t('core:action.send_qort', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
{
@@ -127,8 +134,11 @@ export const WrapperUserAction = ({ children, address, name, disabled }) => {
justifyContent: 'flex-start',
}}
>
- Copy address
+ {t('auth:action.copy_address', {
+ postProcess: 'capitalizeFirstChar',
+ })}
+
{
@@ -142,7 +152,9 @@ export const WrapperUserAction = ({ children, address, name, disabled }) => {
justifyContent: 'flex-start',
}}
>
- User lookup
+ {t('core:user_lookup', {
+ postProcess: 'capitalizeFirstChar',
+ })}
{!isRunningPublicNode && (
@@ -165,6 +177,7 @@ const BlockUser = ({ address, name, handleClose }) => {
const { isUserBlocked, addToBlockList, removeBlockFromList } =
useContext(MyContext);
const theme = useTheme();
+ const { t } = useTranslation(['auth', 'core', 'group']);
useEffect(() => {
if (!address) return;
@@ -180,12 +193,6 @@ const BlockUser = ({ address, name, handleClose }) => {
executeEvent('blockUserFromOutside', {
user: address,
});
- // if(isAlreadyBlocked === true){
- // await removeBlockFromList(address, name)
- // } else if(isAlreadyBlocked === false) {
- // await addToBlockList(address, name)
- // }
- // executeEvent('updateChatMessagesWithBlocks', true)
} catch (error) {
console.error(error);
} finally {
@@ -202,8 +209,10 @@ const BlockUser = ({ address, name, handleClose }) => {
{(isAlreadyBlocked === null || isLoading) && (
)}
- {isAlreadyBlocked && 'Unblock name'}
- {isAlreadyBlocked === false && 'Block name'}
+ {isAlreadyBlocked &&
+ t('auth:action.unblock_name', { postProcess: 'capitalizeFirstChar' })}
+ {isAlreadyBlocked === false &&
+ t('auth:action.block_name', { postProcess: 'capitalizeFirstChar' })}
);
};
diff --git a/src/hooks/useHandlePrivateApps.tsx b/src/hooks/useHandlePrivateApps.tsx
index be79d41..1115b52 100644
--- a/src/hooks/useHandlePrivateApps.tsx
+++ b/src/hooks/useHandlePrivateApps.tsx
@@ -10,6 +10,7 @@ import { saveToLocalStorage } from '../components/Apps/AppsNavBarDesktop';
import { base64ToUint8Array } from '../qdn/encryption/group-encryption';
import { uint8ArrayToObject } from '../backgroundFunctions/encryption';
import { useSetAtom } from 'jotai';
+import { useTranslation } from 'react-i18next';
export const useHandlePrivateApps = () => {
const [status, setStatus] = useState('');
@@ -20,8 +21,8 @@ export const useHandlePrivateApps = () => {
setInfoSnackCustom,
} = useContext(MyContext);
const setSortablePinnedApps = useSetAtom(sortablePinnedAppsAtom);
-
const setSettingsLocalLastUpdated = useSetAtom(settingsLocalLastUpdatedAtom);
+ const { t } = useTranslation(['auth', 'core', 'group']);
const openApp = async (
privateAppProperties,
@@ -30,13 +31,19 @@ export const useHandlePrivateApps = () => {
) => {
try {
if (setLoadingStatePrivateApp) {
- setLoadingStatePrivateApp(`Downloading and decrypting private app.`);
+ setLoadingStatePrivateApp(
+ t('core:message.generic.downloading_decrypting_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
setOpenSnackGlobal(true);
setInfoSnackCustom({
type: 'info',
- message: 'Fetching app data',
+ message: t('core:message.generic.fetching_data', {
+ postProcess: 'capitalizeFirstChar',
+ }),
duration: null,
});
const urlData = `${getBaseApiReact()}/arbitrary/${
@@ -55,7 +62,11 @@ export const useHandlePrivateApps = () => {
if (!responseData?.ok) {
if (setLoadingStatePrivateApp) {
- setLoadingStatePrivateApp('Error! Unable to download private app.');
+ setLoadingStatePrivateApp(
+ t('core:message.generic.unable_download_private_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
throw new Error('Unable to fetch app');
@@ -64,13 +75,25 @@ export const useHandlePrivateApps = () => {
data = await responseData.text();
if (data?.error) {
if (setLoadingStatePrivateApp) {
- setLoadingStatePrivateApp('Error! Unable to download private app.');
+ setLoadingStatePrivateApp(
+ t('core:message.generic.unable_download_private_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
- throw new Error('Unable to fetch app');
+ throw new Error(
+ t('core:message.generic.unable_fetch_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
} catch (error) {
if (setLoadingStatePrivateApp) {
- setLoadingStatePrivateApp('Error! Unable to download private app.');
+ setLoadingStatePrivateApp(
+ t('core:message.generic.unable_download_private_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
throw error;
}
@@ -78,23 +101,27 @@ export const useHandlePrivateApps = () => {
let decryptedData;
// eslint-disable-next-line no-useless-catch
try {
- decryptedData = await window.sendMessage(
- 'DECRYPT_QORTAL_GROUP_DATA',
-
- {
- base64: data,
- groupId: privateAppProperties?.groupId,
- }
- );
+ decryptedData = await window.sendMessage('DECRYPT_QORTAL_GROUP_DATA', {
+ base64: data,
+ groupId: privateAppProperties?.groupId,
+ });
if (decryptedData?.error) {
if (setLoadingStatePrivateApp) {
- setLoadingStatePrivateApp('Error! Unable to decrypt private app.');
+ setLoadingStatePrivateApp(
+ t('core:message.generic.unable_decrypt_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
throw new Error(decryptedData?.error);
}
} catch (error) {
if (setLoadingStatePrivateApp) {
- setLoadingStatePrivateApp('Error! Unable to decrypt private app.');
+ setLoadingStatePrivateApp(
+ t('core:message.generic.unable_decrypt_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ );
}
throw error;
}
@@ -106,11 +133,15 @@ export const useHandlePrivateApps = () => {
if (decryptedData) {
setInfoSnackCustom({
type: 'info',
- message: 'Building app',
+ message: t('core:message.generic.building_app', {
+ postProcess: 'capitalizeFirstChar',
+ }),
});
+
const endpoint = await createEndpoint(
`/arbitrary/APP/${privateAppProperties?.name}/zip?preview=true`
);
+
const response = await fetch(endpoint, {
method: 'POST',
headers: {
@@ -118,7 +149,9 @@ export const useHandlePrivateApps = () => {
},
body: UintToObject?.app,
});
+
const previewPath = await response.text();
+
const refreshfunc = async (tabId, privateAppProperties) => {
const checkIfPreviewLinkStillWorksUrl = await createEndpoint(
`/render/hash/HmtnZpcRPwisMfprUXuBp27N2xtv5cDiQjqGZo8tbZS?secret=E39WTiG4qBq3MFcMPeRZabtQuzyfHg9ZuR5SgY7nW1YH`
@@ -132,6 +165,7 @@ export const useHandlePrivateApps = () => {
const endpoint = await createEndpoint(
`/arbitrary/APP/${privateAppProperties?.name}/zip?preview=true`
);
+
const response = await fetch(endpoint, {
method: 'POST',
headers: {
@@ -139,6 +173,7 @@ export const useHandlePrivateApps = () => {
},
body: UintToObject?.app,
});
+
const previewPath = await response.text();
executeEvent('updateAppUrl', {
tabId: tabId,
@@ -173,7 +208,9 @@ export const useHandlePrivateApps = () => {
});
setInfoSnackCustom({
type: 'success',
- message: 'Opened',
+ message: t('core:message.generic.opened', {
+ postProcess: 'capitalizeFirstChar',
+ }),
});
if (setLoadingStatePrivateApp) {
setLoadingStatePrivateApp(``);
@@ -206,7 +243,12 @@ export const useHandlePrivateApps = () => {
} catch (error) {
if (setLoadingStatePrivateApp) {
setLoadingStatePrivateApp(
- `Error! ${error?.message || 'Unable to build private app.'}`
+ `Error! ${
+ error?.message ||
+ t('core:message.error.unable_build_app', {
+ postProcess: 'capitalizeFirstChar',
+ })
+ }`
);
}
throw error;
@@ -214,7 +256,11 @@ export const useHandlePrivateApps = () => {
} catch (error) {
setInfoSnackCustom({
type: 'error',
- message: error?.message || 'Unable to fetch app',
+ message:
+ error?.message ||
+ t('core:message.error.unable_fetch_app', {
+ postProcess: 'capitalizeFirstChar',
+ }),
});
}
};
diff --git a/src/hooks/useQortalMessageListener.tsx b/src/hooks/useQortalMessageListener.tsx
index 27e8fb8..81f697a 100644
--- a/src/hooks/useQortalMessageListener.tsx
+++ b/src/hooks/useQortalMessageListener.tsx
@@ -168,157 +168,157 @@ export function openIndexedDB() {
}
export const listOfAllQortalRequests = [
- 'GET_USER_ACCOUNT',
- 'DECRYPT_DATA',
- 'SEND_COIN',
- 'GET_LIST_ITEMS',
- 'ADD_LIST_ITEMS',
- 'DELETE_LIST_ITEM',
- 'VOTE_ON_POLL',
- 'CREATE_POLL',
- 'SEND_CHAT_MESSAGE',
- 'JOIN_GROUP',
- 'DEPLOY_AT',
- 'GET_USER_WALLET',
- 'GET_WALLET_BALANCE',
- 'GET_USER_WALLET_INFO',
- 'GET_CROSSCHAIN_SERVER_INFO',
- 'GET_TX_ACTIVITY_SUMMARY',
- 'GET_FOREIGN_FEE',
- 'UPDATE_FOREIGN_FEE',
- 'GET_SERVER_CONNECTION_HISTORY',
- 'SET_CURRENT_FOREIGN_SERVER',
'ADD_FOREIGN_SERVER',
- 'REMOVE_FOREIGN_SERVER',
- 'GET_DAY_SUMMARY',
+ 'ADD_GROUP_ADMIN',
+ 'ADD_LIST_ITEMS',
+ 'ADMIN_ACTION',
+ 'BAN_FROM_GROUP',
+ 'BUY_NAME',
+ 'CANCEL_GROUP_BAN',
+ 'CANCEL_GROUP_INVITE',
+ 'CANCEL_SELL_NAME',
+ 'CANCEL_TRADE_SELL_ORDER',
+ 'CREATE_AND_COPY_EMBED_LINK',
+ 'CREATE_GROUP',
+ 'CREATE_POLL',
'CREATE_TRADE_BUY_ORDER',
'CREATE_TRADE_SELL_ORDER',
- 'CANCEL_TRADE_SELL_ORDER',
- 'IS_USING_PUBLIC_NODE',
- 'ADMIN_ACTION',
- 'SIGN_TRANSACTION',
- 'OPEN_NEW_TAB',
- 'CREATE_AND_COPY_EMBED_LINK',
- 'DECRYPT_QORTAL_GROUP_DATA',
+ 'DECRYPT_AESGCM',
'DECRYPT_DATA_WITH_SHARING_KEY',
+ 'DECRYPT_DATA',
+ 'DECRYPT_QORTAL_GROUP_DATA',
'DELETE_HOSTED_DATA',
- 'GET_HOSTED_DATA',
- 'PUBLISH_MULTIPLE_QDN_RESOURCES',
- 'PUBLISH_QDN_RESOURCE',
- 'ENCRYPT_DATA',
+ 'DELETE_LIST_ITEM',
+ 'DEPLOY_AT',
'ENCRYPT_DATA_WITH_SHARING_KEY',
+ 'ENCRYPT_DATA',
'ENCRYPT_QORTAL_GROUP_DATA',
- 'SAVE_FILE',
+ 'FETCH_BLOCK_RANGE',
+ 'FETCH_BLOCK',
+ 'FETCH_QDN_RESOURCE',
'GET_ACCOUNT_DATA',
'GET_ACCOUNT_NAMES',
- 'SEARCH_NAMES',
- 'GET_NAME_DATA',
- 'GET_QDN_RESOURCE_URL',
- 'LINK_TO_QDN_RESOURCE',
- 'LIST_QDN_RESOURCES',
- 'SEARCH_QDN_RESOURCES',
- 'FETCH_QDN_RESOURCE',
- 'GET_QDN_RESOURCE_STATUS',
- 'GET_QDN_RESOURCE_PROPERTIES',
- 'GET_QDN_RESOURCE_METADATA',
- 'SEARCH_CHAT_MESSAGES',
- 'LIST_GROUPS',
- 'GET_BALANCE',
- 'GET_AT',
+ 'GET_ARRR_SYNC_STATUS',
'GET_AT_DATA',
- 'LIST_ATS',
- 'FETCH_BLOCK',
- 'FETCH_BLOCK_RANGE',
- 'SEARCH_TRANSACTIONS',
- 'GET_PRICE',
- 'SHOW_ACTIONS',
- 'REGISTER_NAME',
- 'UPDATE_NAME',
- 'LEAVE_GROUP',
- 'INVITE_TO_GROUP',
- 'KICK_FROM_GROUP',
- 'BAN_FROM_GROUP',
- 'CANCEL_GROUP_BAN',
- 'ADD_GROUP_ADMIN',
- 'REMOVE_GROUP_ADMIN',
- 'DECRYPT_AESGCM',
- 'CANCEL_GROUP_INVITE',
- 'CREATE_GROUP',
- 'GET_USER_WALLET_TRANSACTIONS',
+ 'GET_AT',
+ 'GET_BALANCE',
+ 'GET_CROSSCHAIN_SERVER_INFO',
+ 'GET_DAY_SUMMARY',
+ 'GET_FOREIGN_FEE',
+ 'GET_HOSTED_DATA',
+ 'GET_LIST_ITEMS',
+ 'GET_NAME_DATA',
'GET_NODE_INFO',
'GET_NODE_STATUS',
- 'GET_ARRR_SYNC_STATUS',
- 'SHOW_PDF_READER',
- 'UPDATE_GROUP',
- 'SELL_NAME',
- 'CANCEL_SELL_NAME',
- 'BUY_NAME',
- 'SIGN_FOREIGN_FEES',
+ 'GET_PRICE',
+ 'GET_QDN_RESOURCE_METADATA',
+ 'GET_QDN_RESOURCE_PROPERTIES',
+ 'GET_QDN_RESOURCE_STATUS',
+ 'GET_QDN_RESOURCE_URL',
+ 'GET_SERVER_CONNECTION_HISTORY',
+ 'GET_TX_ACTIVITY_SUMMARY',
+ 'GET_USER_ACCOUNT',
+ 'GET_USER_WALLET_INFO',
+ 'GET_USER_WALLET_TRANSACTIONS',
+ 'GET_USER_WALLET',
+ 'GET_WALLET_BALANCE',
+ 'INVITE_TO_GROUP',
+ 'IS_USING_PUBLIC_NODE',
+ 'JOIN_GROUP',
+ 'KICK_FROM_GROUP',
+ 'LEAVE_GROUP',
+ 'LINK_TO_QDN_RESOURCE',
+ 'LIST_ATS',
+ 'LIST_GROUPS',
+ 'LIST_QDN_RESOURCES',
'MULTI_ASSET_PAYMENT_WITH_PRIVATE_DATA',
+ 'OPEN_NEW_TAB',
+ 'PUBLISH_MULTIPLE_QDN_RESOURCES',
+ 'PUBLISH_QDN_RESOURCE',
+ 'REGISTER_NAME',
+ 'REMOVE_FOREIGN_SERVER',
+ 'REMOVE_GROUP_ADMIN',
+ 'SAVE_FILE',
+ 'SEARCH_CHAT_MESSAGES',
+ 'SEARCH_NAMES',
+ 'SEARCH_QDN_RESOURCES',
+ 'SEARCH_TRANSACTIONS',
+ 'SELL_NAME',
+ 'SEND_CHAT_MESSAGE',
+ 'SEND_COIN',
+ 'SET_CURRENT_FOREIGN_SERVER',
+ 'SHOW_ACTIONS',
+ 'SHOW_PDF_READER',
+ 'SIGN_FOREIGN_FEES',
+ 'SIGN_TRANSACTION',
'TRANSFER_ASSET',
+ 'UPDATE_FOREIGN_FEE',
+ 'UPDATE_GROUP',
+ 'UPDATE_NAME',
+ 'VOTE_ON_POLL',
];
export const UIQortalRequests = [
- 'GET_USER_ACCOUNT',
- 'DECRYPT_DATA',
- 'SEND_COIN',
- 'GET_LIST_ITEMS',
- 'ADD_LIST_ITEMS',
- 'DELETE_LIST_ITEM',
- 'VOTE_ON_POLL',
- 'CREATE_POLL',
- 'SEND_CHAT_MESSAGE',
- 'JOIN_GROUP',
- 'DEPLOY_AT',
- 'GET_USER_WALLET',
- 'GET_WALLET_BALANCE',
- 'GET_USER_WALLET_INFO',
- 'GET_CROSSCHAIN_SERVER_INFO',
- 'GET_TX_ACTIVITY_SUMMARY',
- 'GET_FOREIGN_FEE',
- 'UPDATE_FOREIGN_FEE',
- 'GET_SERVER_CONNECTION_HISTORY',
- 'SET_CURRENT_FOREIGN_SERVER',
'ADD_FOREIGN_SERVER',
- 'REMOVE_FOREIGN_SERVER',
- 'GET_DAY_SUMMARY',
+ 'ADD_GROUP_ADMIN',
+ 'ADD_LIST_ITEMS',
+ 'ADMIN_ACTION',
+ 'BAN_FROM_GROUP',
+ 'BUY_NAME',
+ 'CANCEL_GROUP_BAN',
+ 'CANCEL_GROUP_INVITE',
+ 'CANCEL_SELL_NAME',
+ 'CANCEL_TRADE_SELL_ORDER',
+ 'CREATE_AND_COPY_EMBED_LINK',
+ 'CREATE_GROUP',
+ 'CREATE_POLL',
'CREATE_TRADE_BUY_ORDER',
'CREATE_TRADE_SELL_ORDER',
- 'CANCEL_TRADE_SELL_ORDER',
- 'IS_USING_PUBLIC_NODE',
- 'ADMIN_ACTION',
- 'SIGN_TRANSACTION',
- 'OPEN_NEW_TAB',
- 'CREATE_AND_COPY_EMBED_LINK',
- 'DECRYPT_QORTAL_GROUP_DATA',
- 'DECRYPT_DATA_WITH_SHARING_KEY',
- 'DELETE_HOSTED_DATA',
- 'GET_HOSTED_DATA',
- 'SHOW_ACTIONS',
- 'REGISTER_NAME',
- 'UPDATE_NAME',
- 'LEAVE_GROUP',
- 'INVITE_TO_GROUP',
- 'KICK_FROM_GROUP',
- 'BAN_FROM_GROUP',
- 'CANCEL_GROUP_BAN',
- 'ADD_GROUP_ADMIN',
- 'REMOVE_GROUP_ADMIN',
'DECRYPT_AESGCM',
- 'CANCEL_GROUP_INVITE',
- 'CREATE_GROUP',
- 'GET_USER_WALLET_TRANSACTIONS',
+ 'DECRYPT_DATA_WITH_SHARING_KEY',
+ 'DECRYPT_DATA',
+ 'DECRYPT_QORTAL_GROUP_DATA',
+ 'DELETE_HOSTED_DATA',
+ 'DELETE_LIST_ITEM',
+ 'DEPLOY_AT',
+ 'GET_ARRR_SYNC_STATUS',
+ 'GET_CROSSCHAIN_SERVER_INFO',
+ 'GET_DAY_SUMMARY',
+ 'GET_FOREIGN_FEE',
+ 'GET_HOSTED_DATA',
+ 'GET_LIST_ITEMS',
'GET_NODE_INFO',
'GET_NODE_STATUS',
- 'GET_ARRR_SYNC_STATUS',
- 'SHOW_PDF_READER',
- 'UPDATE_GROUP',
- 'SELL_NAME',
- 'CANCEL_SELL_NAME',
- 'BUY_NAME',
- 'SIGN_FOREIGN_FEES',
+ 'GET_SERVER_CONNECTION_HISTORY',
+ 'GET_TX_ACTIVITY_SUMMARY',
+ 'GET_USER_ACCOUNT',
+ 'GET_USER_WALLET_INFO',
+ 'GET_USER_WALLET_TRANSACTIONS',
+ 'GET_USER_WALLET',
+ 'GET_WALLET_BALANCE',
+ 'INVITE_TO_GROUP',
+ 'IS_USING_PUBLIC_NODE',
+ 'JOIN_GROUP',
+ 'KICK_FROM_GROUP',
+ 'LEAVE_GROUP',
'MULTI_ASSET_PAYMENT_WITH_PRIVATE_DATA',
+ 'OPEN_NEW_TAB',
+ 'REGISTER_NAME',
+ 'REMOVE_FOREIGN_SERVER',
+ 'REMOVE_GROUP_ADMIN',
+ 'SELL_NAME',
+ 'SEND_CHAT_MESSAGE',
+ 'SEND_COIN',
+ 'SET_CURRENT_FOREIGN_SERVER',
+ 'SHOW_ACTIONS',
+ 'SHOW_PDF_READER',
+ 'SIGN_FOREIGN_FEES',
+ 'SIGN_TRANSACTION',
'TRANSFER_ASSET',
+ 'UPDATE_FOREIGN_FEE',
+ 'UPDATE_GROUP',
+ 'UPDATE_NAME',
+ 'VOTE_ON_POLL',
];
async function retrieveFileFromIndexedDB(fileId) {
@@ -667,7 +667,7 @@ export const useQortalMessageListener = (
setPath(pathUrl);
if (appName?.toLowerCase() === 'q-mail') {
window.sendMessage('addEnteredQmailTimestamp').catch((error) => {
- // error
+ // TODO print error
});
} else if (appName?.toLowerCase() === 'q-wallets') {
executeEvent('setLastEnteredTimestampPaymentEvent', {});
diff --git a/src/i18n/locales/en/auth.json b/src/i18n/locales/en/auth.json
index a62b460..e091927 100644
--- a/src/i18n/locales/en/auth.json
+++ b/src/i18n/locales/en/auth.json
@@ -11,17 +11,32 @@
"seed_phrase": "add seed-phrase"
},
"authenticate": "authenticate",
+ "block": "block",
+ "block_all": "block all",
+ "block_data": "block QDN data",
+ "block_name": "block name",
+ "block_txs": "block tsx",
+ "fetch_names": "fetch names",
+ "copy_address": "copy address",
"create_account": "create account",
"create_qortal_account": "create your Qortal account by clicking NEXT below.",
"choose_password": "choose new password",
"download_account": "download account",
+ "enter_amount": "please enter an amount greater than 0",
+ "enter_recipient": "please enter a recipient",
+ "enter_wallet_password": "please enter your wallet password",
"export_seedphrase": "export Seedphrase",
+ "insert_name_address": "please insert a name or address",
"publish_admin_secret_key": "publish admin secret key",
"publish_group_secret_key": "publish group secret key",
"reencrypt_key": "re-encrypt key",
"return_to_list": "return to list",
- "setup_qortal_account": "set up your Qortal account"
+ "setup_qortal_account": "set up your Qortal account",
+ "unblock": "unblock",
+ "unblock_name": "unblock name"
},
+ "address": "address",
+ "address_name": "address or name",
"advanced_users": "for advanced users",
"apikey": {
"alternative": "alternative: File select",
@@ -31,19 +46,29 @@
"key": "API key",
"select_valid": "select a valid apikey"
},
+ "blocked_users": "blocked users",
"build_version": "build version",
"message": {
"error": {
"account_creation": "could not create account.",
+ "address_not_existing": "address does not exist on blockchain",
"decrypt_data": "could not decrypt data",
"field_not_found_json": "{{ field }} not found in JSON",
"incorrect_password": "incorrect password",
"invalid_secret_key": "secretKey is not valid",
+ "name_not_existing": "name does not exist",
+ "name_not_registered": "name not registered",
+ "unable_block_user": "unable to block user",
"unable_decrypt": "unable to decrypt",
"unable_reencrypt_secret_key": "unable to re-encrypt secret key"
},
"generic": {
+ "blocked_addresses": "blocked addresses- blocks processing of txs",
+ "blocked_names": "blocked names for QDN",
+ "blocking": "blocking {{ name }}",
+ "choose_block": "choose 'block txs' or 'all' to block chat messages",
"congrats_setup": "congrats, you’re all set up!",
+ "decide_block": "decide what to block",
"no_account": "no accounts saved",
"no_minimum_length": "there is no minimum length requirement",
"no_secret_key_published": "no secret key published yet",
diff --git a/src/i18n/locales/en/core.json b/src/i18n/locales/en/core.json
index ba9d509..eaae575 100644
--- a/src/i18n/locales/en/core.json
+++ b/src/i18n/locales/en/core.json
@@ -70,6 +70,8 @@
"select_app_type": "select App Type",
"select_category": "select Category",
"select_name_app": "select Name/App",
+ "send": "send",
+ "send_qort": "send QORT",
"set_avatar": "set avatar",
"show": "show",
"show_poll": "show poll",
@@ -86,6 +88,7 @@
"admin": "admin",
"admin_other": "admins",
"all": "all",
+ "amount": "amount",
"announcement": "announcement",
"announcement_other": "announcements",
"api": "API",
@@ -96,6 +99,7 @@
"apps_dashboard": "apps Dashboard",
"apps_official": "official Apps",
"attachment": "attachment",
+ "balance": "balance:",
"category": "category",
"category_other": "categories",
"chat": "chat",
@@ -169,8 +173,12 @@
"rating_option": "cannot find rating option",
"save_qdn": "unable to save to QDN",
"send_failed": "failed to send",
+ "unable_build_app": "unable to build private app",
"unable_download_image": "unable to download IMAGE. Please try again later by clicking the refresh button",
+ "unable_download_private_app": "unable to download private app",
+ "unable_decrypt_app": "unable to decrypt private app'",
"unable_encrypt_app": "unable to encrypt app. App not published'",
+ "unable_fetch_app": "unable to fetch app",
"unable_publish_app": "unable to publish app",
"unable_publish_image": "unable to publish image",
"unable_rate": "unable to rate",
@@ -181,19 +189,23 @@
"already_voted": "you've already voted.",
"avatar_size": "{{ size }} KB max. for GIFS",
"building": "building",
+ "building_app": "building app",
"created_by": "created by {{ owner }}",
"buy_order_request": "the Application
{{hostname}}
is requesting {{count}} buy order",
"buy_order_request_other": "the Application
{{hostname}}
is requesting {{count}} buy orders",
"devmode_local_node": "please use your local node for dev mode! Logout and use Local node.",
"downloading": "downloading",
+ "downloading_decrypting_app": "downloading and decrypting private app.",
"edited": "edited",
"editing_message": "editing message",
"encrypted": "encrypted",
"encrypted_not": "not encrypted",
"fee_qort": "fee: {{ message }} QORT",
+ "fetching_data": "fetching app data",
"foreign_fee": "foreign fee: {{ message }}",
"mentioned": "mentioned",
"message_with_image": "this message already has an image",
+ "most_recent_payment": "{{ count }} most recent payment",
"name_available": "{{ name }} is available",
"name_benefits": "benefits of a name",
"name_checking": "checking if name already exists",
@@ -207,9 +219,11 @@
"no_messages": "no messages",
"no_minting_details": "cannot view minting details on the gateway",
"no_notifications": "no new notifications",
+ "no_payments": "no payments",
"no_pinned_changes": "you currently do not have any changes to your pinned apps",
"no_results": "no results",
"one_app_per_name": "note: Currently, only one App and Website is allowed per Name.",
+ "opened": "opened",
"overwrite_qdn": "overwrite to QDN",
"password_confirm": "please confirm a password",
"password_enter": "please enter a password",
@@ -236,6 +250,7 @@
"unsaved_changes": "you have unsaved changes to your pinned apps. Save them to QDN.",
"updating": "updating"
},
+ "message": "message",
"question": {
"accept_vote_on_poll": "do you accept this VOTE_ON_POLL transaction? POLLS are public!",
"logout": "are you sure you would like to logout?",
@@ -250,7 +265,8 @@
"rate_app": "would you like to rate this app a rating of {{ rate }}?. It will create a POLL tx.",
"register_name": "would you like to register this name?",
"reset_pinned": "don't like your current local changes? Would you like to reset to the default pinned apps?",
- "reset_qdn": "don't like your current local changes? Would you like to reset to your saved QDN pinned apps?"
+ "reset_qdn": "don't like your current local changes? Would you like to reset to your saved QDN pinned apps?",
+ "transfer_qort": "would you like to transfer {{ amount }} QORT"
},
"status": {
"minting": "(minting)",
@@ -271,6 +287,7 @@
"minting_status": "minting status",
"name": "name",
"name_app": "name/App",
+ "new_post_in": "new post in {{ title }}",
"none": "none",
"option": "option",
"option_other": "options",
@@ -288,8 +305,11 @@
"about": "about this Q-App",
"q_mail": "q-mail",
"q_manager": "q-manager",
- "q_sandbox": "q-Sandbox"
+ "q_sandbox": "q-Sandbox",
+ "q_wallets": "q-Wallets"
},
+ "receiver": "receiver",
+ "sender": "sender",
"server": "server",
"settings": "settings",
"sort": {
@@ -309,9 +329,11 @@
"hour_one": "{{count}} hour",
"hour_other": "{{count}} hours",
"minute_one": "{{count}} minute",
- "minute_other": "{{count}} minutes"
+ "minute_other": "{{count}} minutes",
+ "time": "time"
},
"title": "title",
+ "to": "to",
"tutorial": "tutorial",
"user_lookup": "user lookup",
"vote": "vote",
diff --git a/src/i18n/locales/en/group.json b/src/i18n/locales/en/group.json
index c4042bf..c58e88c 100644
--- a/src/i18n/locales/en/group.json
+++ b/src/i18n/locales/en/group.json
@@ -99,6 +99,7 @@
"not_part_group": "you are not part of the encrypted group of members. Wait until an admin re-encrypts the keys.",
"only_encrypted": "only unencrypted messages will be displayed.",
"only_private_groups": "only private groups will be shown",
+ "pending_join_requests": "{{ group }} has {{ count }} pending join requests",
"private_key_copied": "private key copied",
"provide_message": "please provide a first message to the thread",
"secure_place": "keep your private key in a secure place. Do not share!",