diff --git a/src/components/common/DeleteMessageModal.tsx b/src/components/common/DeleteMessageModal.tsx index c454095c7..00653da2b 100644 --- a/src/components/common/DeleteMessageModal.tsx +++ b/src/components/common/DeleteMessageModal.tsx @@ -94,7 +94,7 @@ const DeleteMessageModal: FC = ({

{lang('lng_delete_for_me_chat_hint')}

)} {willDeleteForAll && ( -

{lang('lng_delete_for_everyone_hint')}

+

{lang('lng_delete_for_everyone_hint', 1, 'i')}

)} {canDeleteForAll && ( {canPinForAll && ( )} diff --git a/src/components/common/StickerSetModal.tsx b/src/components/common/StickerSetModal.tsx index 1b6808708..e3c88aa25 100644 --- a/src/components/common/StickerSetModal.tsx +++ b/src/components/common/StickerSetModal.tsx @@ -78,7 +78,7 @@ const StickerSetModal: FC = ({ isOpen={isOpen} onClose={onClose} hasCloseButton - title={stickerSet ? stickerSet.title : 'Sticker Set'} + title={stickerSet ? stickerSet.title : lang('AccDescrStickerSet')} > {stickerSet && stickerSet.stickers ? ( <> diff --git a/src/components/common/UnpinAllMessagesModal.tsx b/src/components/common/UnpinAllMessagesModal.tsx index 5da66e536..5f497ad26 100644 --- a/src/components/common/UnpinAllMessagesModal.tsx +++ b/src/components/common/UnpinAllMessagesModal.tsx @@ -1,7 +1,5 @@ import React, { FC, memo } from '../../lib/teact/teact'; -import { withGlobal } from '../../lib/teact/teactn'; -import { selectPinnedIds } from '../../modules/selectors'; import useLang from '../../hooks/useLang'; import Modal from '../ui/Modal'; @@ -10,42 +8,26 @@ import Button from '../ui/Button'; export type OwnProps = { isOpen: boolean; chatId?: number; + pinnedMessagesCount?: number; onClose: () => void; onUnpin: () => void; }; -type StateProps = { - pinnedMessagesCount: number; -}; - -const UnpinAllMessagesModal: FC = ({ +const UnpinAllMessagesModal: FC = ({ isOpen, - pinnedMessagesCount, + pinnedMessagesCount = 0, onClose, onUnpin, }) => { const lang = useLang(); - - function renderModalHeader() { - return ( -
-

{lang('UnpinAllMessages')}

-
- ); - } - - function renderMessage() { - return

Do you want to unpin all {pinnedMessagesCount} messages in this chat?

; - } - return ( - {renderMessage()} +

{lang('Chat.UnpinAllMessagesConfirmation', pinnedMessagesCount, 'i')}

@@ -54,12 +36,4 @@ const UnpinAllMessagesModal: FC = ({ ); }; -export default memo(withGlobal( - (global, { chatId }): StateProps => { - const pinnedIds = chatId ? selectPinnedIds(global, chatId) : []; - - return { - pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0, - }; - }, -)(UnpinAllMessagesModal)); +export default memo(UnpinAllMessagesModal); diff --git a/src/components/middle/DeleteSelectedMessagesModal.tsx b/src/components/middle/DeleteSelectedMessagesModal.tsx index 68d679fda..11a755598 100644 --- a/src/components/middle/DeleteSelectedMessagesModal.tsx +++ b/src/components/middle/DeleteSelectedMessagesModal.tsx @@ -78,7 +78,7 @@ const DeleteSelectedMessagesModal: FC = ( onClose={onClose} onEnter={canDeleteForAll ? undefined : handleDeleteMessageForSelf} className="delete" - title="Delete Messages?" + title={lang('Conversation.DeleteManyMessages')} >

{lang('AreYouSureDeleteFewMessages')}

{willDeleteForCurrentUserOnly && ( @@ -89,12 +89,13 @@ const DeleteSelectedMessagesModal: FC = ( )} {canDeleteForAll && ( )}
diff --git a/src/components/middle/MiddleColumn.tsx b/src/components/middle/MiddleColumn.tsx index 31fb1a2be..bc9424f69 100644 --- a/src/components/middle/MiddleColumn.tsx +++ b/src/components/middle/MiddleColumn.tsx @@ -58,6 +58,7 @@ type StateProps = { canPost?: boolean; messageSendingRestrictionReason?: string; hasPinnedOrAudioMessage?: boolean; + pinnedMessagesCount?: number; customBackground?: string; patternColor?: string; isCustomBackgroundColor?: boolean; @@ -85,6 +86,7 @@ const MiddleColumn: FC = ({ canPost, messageSendingRestrictionReason, hasPinnedOrAudioMessage, + pinnedMessagesCount, customBackground, patternColor, isCustomBackgroundColor, @@ -261,7 +263,7 @@ const MiddleColumn: FC = ({ onClick={handleOpenUnpinModal} > - {lang('Chat.PanelHidePinnedMessages')} + {lang('Chat.Pinned.UnpinAll', pinnedMessagesCount, 'i')} )} @@ -296,6 +298,7 @@ const MiddleColumn: FC = ({ @@ -350,6 +353,7 @@ export default memo(withGlobal( || Boolean(pinnedIds && pinnedIds.length) || Boolean(audioChatId && audioMessageId) ), + pinnedMessagesCount: pinnedIds ? pinnedIds.length : 0, }; }, (setGlobal, actions): DispatchProps => pick(actions, [ diff --git a/src/components/middle/composer/AttachmentModal.tsx b/src/components/middle/composer/AttachmentModal.tsx index f44e6e100..f3138dd70 100644 --- a/src/components/middle/composer/AttachmentModal.tsx +++ b/src/components/middle/composer/AttachmentModal.tsx @@ -149,11 +149,11 @@ const AttachmentModal: FC = ({ let title = ''; if (areAllPhotos) { - title = renderingAttachments.length === 1 ? 'Send Photo' : `Send ${renderingAttachments.length} Photos`; + title = lang('PreviewSender.SendPhoto', renderingAttachments.length, 'i'); } else if (areAllVideos) { - title = renderingAttachments.length === 1 ? 'Send Video' : `Send ${renderingAttachments.length} Videos`; + title = lang('PreviewSender.SendVideo', renderingAttachments.length, 'i'); } else { - title = renderingAttachments.length === 1 ? 'Send File' : `Send ${renderingAttachments.length} Files`; + title = lang('PreviewSender.SendFile', renderingAttachments.length, 'i'); } function renderHeader() { diff --git a/src/components/middle/composer/PollModal.tsx b/src/components/middle/composer/PollModal.tsx index 43e7eeda7..1663b4dc4 100644 --- a/src/components/middle/composer/PollModal.tsx +++ b/src/components/middle/composer/PollModal.tsx @@ -46,6 +46,8 @@ const PollModal: FC = ({ isOpen, onSend, onClear }) => { const [correctOption, setCorrectOption] = useState(); const [hasErrors, setHasErrors] = useState(false); + const lang = useLang(); + const focusInput = useCallback((ref: RefObject) => { if (isOpen && ref.current) { ref.current.focus(); @@ -206,21 +208,19 @@ const PollModal: FC = ({ isOpen, onSend, onClear }) => { const getQuestionError = useCallback(() => { if (hasErrors && !question.trim().length) { - return 'Please enter the question'; + return lang('lng_polls_choose_question'); } return undefined; - }, [hasErrors, question]); + }, [hasErrors, lang, question]); const getOptionsError = useCallback((index: number) => { const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length); if (hasErrors && optionsTrimmed.length < 2 && !options[index].trim().length) { - return 'Please enter at least two options'; + return lang('lng_polls_choose_answers'); } return undefined; - }, [hasErrors, options]); - - const lang = useLang(); + }, [hasErrors, lang, options]); function renderHeader() { return ( @@ -246,8 +246,8 @@ const PollModal: FC = ({ isOpen, onSend, onClear }) => {
updateOption(index, e.currentTarget.value)} @@ -259,7 +259,7 @@ const PollModal: FC = ({ isOpen, onSend, onClear }) => { round color="translucent" size="smaller" - ariaLabel="Remove option" + ariaLabel={lang('Delete')} onClick={() => removeOption(index)} > @@ -278,9 +278,7 @@ const PollModal: FC = ({ isOpen, onSend, onClear }) => { const optionsTrimmed = options.map((o) => o.trim()).filter((o) => o.length); return isQuizMode && (!correctOption || !optionsTrimmed[Number(correctOption)]) && ( -

- Please choose the correct answer -

+

{lang('lng_polls_choose_correct')}

); } @@ -341,9 +339,7 @@ const PollModal: FC = ({ isOpen, onSend, onClear }) => { contentEditable onChange={(e) => setSolution(e.currentTarget.innerHTML)} /> -
- Users will see this comment after choosing a wrong answer, good for educational purposes. -
+
{lang('CreatePoll.ExplanationInfo')}
)}
diff --git a/src/components/payment/PaymentModal.tsx b/src/components/payment/PaymentModal.tsx index 1250daa36..8ea218357 100644 --- a/src/components/payment/PaymentModal.tsx +++ b/src/components/payment/PaymentModal.tsx @@ -167,12 +167,12 @@ const Invoice: FC = ({ onClose={handleErrorModalClose} >

{error.description || 'Error'}

- {error.description || 'Error'} +

{error.description || 'Error'}

); @@ -287,11 +287,11 @@ const Invoice: FC = ({ const buttonText = useMemo(() => { switch (step) { case PaymentStep.Checkout: - return `Pay ${currencySign}${(totalPrice / 100).toFixed(2)}`; + return lang('Checkout.PayPrice', `${currencySign}${(totalPrice / 100).toFixed(2)}`); default: - return 'Next Step'; + return lang('Next'); } - }, [step, totalPrice, currencySign]); + }, [step, lang, currencySign, totalPrice]); if (isProviderError) { return ( @@ -300,13 +300,15 @@ const Invoice: FC = ({ isOpen={isOpen} onClose={onClose} > - Sorry, Telegram T doesn't support payments with this provider yet. - Please use one of our mobile apps to do this. +

+ Sorry, Telegram T doesn't support payments with this provider yet.
+ Please use one of our mobile apps to do this. +

); @@ -329,7 +331,7 @@ const Invoice: FC = ({ > -

{ modalHeader }

+

{modalHeader}

{step !== undefined ? (