From 51cceeebc958a0df498df89783be77c0936060be Mon Sep 17 00:00:00 2001 From: Zabilsya Date: Fri, 28 Mar 2025 04:35:05 +0600 Subject: [PATCH 1/2] [DOP-20892] add russian language --- src/app/config/antd/constants.ts | 6 + src/app/config/antd/index.tsx | 22 +- src/app/styles/antd.less | 5 + src/app/styles/variables.less | 3 +- src/entities/auth/hooks/useLogout/index.ts | 3 + src/entities/connection/api/types.ts | 1 + .../api/hooks/useDeleteGroupUser/index.ts | 2 +- .../ui/GroupWarningAlert/styles.module.less | 7 +- src/entities/run/ui/RunStatusBadge/index.tsx | 5 +- src/entities/transfer/api/types.ts | 2 +- .../TransformationForm/TransformationForm.tsx | 4 +- .../components/FilterColumnsValue/index.tsx | 5 +- .../FilterColumnsValue/styles.module.less | 3 + .../FilterFileRegexpValue/styles.module.less | 3 +- .../components/FilterFileSizeValue/index.tsx | 9 +- .../FilterFileSizeValue/styles.module.less | 8 +- .../components/FilterRowsValue/index.tsx | 3 +- .../FilterRowsValue/styles.module.less | 3 + .../TransformationFormItem.tsx | 11 +- .../TransformationFormItem/styles.module.less | 10 +- src/features/auth/Login/index.tsx | 4 +- src/features/auth/Login/styles.module.less | 2 +- .../utils/getConnectionListColumns/index.tsx | 2 +- .../connection/UpdateConnection/index.tsx | 2 +- .../connection/UpdateConnection/types.ts | 2 +- .../utils/getGroupListColumns/index.tsx | 2 +- .../utils/getGroupUserListColumns/index.ts | 5 +- .../utils/getQueueListColumns/index.tsx | 2 +- .../RunList/utils/getRunListColumns/index.tsx | 2 +- .../TransformButtons/TransformButtons.tsx | 4 +- .../components/TransformButtonItem/index.tsx | 2 +- .../TransferStrategyParams/index.tsx | 2 +- .../utils/getTransferListColumns/index.tsx | 2 +- .../connection/ConnectionDetailPage/index.tsx | 2 +- .../connection/ConnectionListPage/index.tsx | 9 +- .../components/UpdateGroupButton/index.tsx | 12 +- src/pages/group/GroupDetailPage/index.tsx | 2 +- src/pages/group/GroupListPage/index.tsx | 9 +- src/pages/queue/QueueDetailPage/index.tsx | 2 +- src/pages/queue/QueueListPage/index.tsx | 9 +- src/pages/run/RunDetailPage/index.tsx | 2 +- .../transfer/TransferDetailPage/index.tsx | 2 +- .../TransferListPageContent/index.tsx | 8 +- src/shared/config/i18n/constants.ts | 4 + src/shared/config/i18n/index.ts | 3 + src/shared/config/i18n/instance.ts | 4 +- src/shared/config/i18n/translations/en.json | 63 +++-- src/shared/config/i18n/translations/ru.json | 258 ++++++++++++++++++ .../i18n/ui/ChangeLanguageSelect/constants.ts | 13 + .../i18n/ui/ChangeLanguageSelect/index.tsx | 28 ++ .../ChangeLanguageSelect/styles.module.less | 8 + src/shared/config/i18n/ui/index.ts | 1 + src/shared/services/cronService/constants.ts | 6 +- .../services/cronService/cronService.ts | 8 +- src/shared/ui/ActionButton/constants.tsx | 22 ++ src/shared/ui/ActionButton/index.tsx | 30 ++ src/shared/ui/ActionButton/styles.module.less | 3 + src/shared/ui/ActionButton/types.ts | 12 + src/shared/ui/Canvas/index.tsx | 2 - .../ui/ControlButtons/styles.module.less | 2 +- .../components/DynamicSelect/index.tsx | 42 +-- .../useGetDaysOfWeekSelectOptions/index.ts | 10 +- src/shared/ui/CronSelect/index.tsx | 25 +- src/shared/ui/CronSelect/styles.module.less | 8 +- src/shared/ui/ManagedTable/ManagedTable.tsx | 2 + .../hooks/useTableColumns/useTableColumns.tsx | 2 +- src/shared/ui/ManagedTable/styles.module.less | 5 + src/shared/ui/index.ts | 1 + .../DeleteConnectionButton/index.tsx | 7 +- .../UpdateConnectionButton/index.tsx | 12 +- .../components/AddGroupUserButton/index.tsx | 6 +- .../Header/components/LogoutButton/index.tsx | 4 +- src/widgets/layout/Header/index.tsx | 20 +- src/widgets/layout/Header/styles.module.less | 24 +- .../components/DeleteQueueButton/index.tsx | 7 +- .../components/UpdateQueueButton/index.tsx | 12 +- .../components/DeleteTransferButton/index.tsx | 7 +- .../components/UpdateTransferButton/index.tsx | 12 +- src/widgets/transfer/UpdateTransfer/index.tsx | 1 + src/widgets/transfer/UpdateTransfer/types.ts | 2 +- 80 files changed, 656 insertions(+), 225 deletions(-) create mode 100644 src/app/config/antd/constants.ts create mode 100644 src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/styles.module.less create mode 100644 src/entities/transformation/ui/TransformationForm/components/FilterRowsValue/styles.module.less create mode 100644 src/shared/config/i18n/translations/ru.json create mode 100644 src/shared/config/i18n/ui/ChangeLanguageSelect/constants.ts create mode 100644 src/shared/config/i18n/ui/ChangeLanguageSelect/index.tsx create mode 100644 src/shared/config/i18n/ui/ChangeLanguageSelect/styles.module.less create mode 100644 src/shared/config/i18n/ui/index.ts create mode 100644 src/shared/ui/ActionButton/constants.tsx create mode 100644 src/shared/ui/ActionButton/index.tsx create mode 100644 src/shared/ui/ActionButton/styles.module.less create mode 100644 src/shared/ui/ActionButton/types.ts create mode 100644 src/shared/ui/ManagedTable/styles.module.less diff --git a/src/app/config/antd/constants.ts b/src/app/config/antd/constants.ts new file mode 100644 index 00000000..39d8b6b4 --- /dev/null +++ b/src/app/config/antd/constants.ts @@ -0,0 +1,6 @@ +import { Language } from '@shared/config'; + +export const ANTD_LOCALES = { + [Language.EN]: () => import('antd/es/locale/en_US'), + [Language.RU]: () => import('antd/es/locale/ru_RU'), +}; diff --git a/src/app/config/antd/index.tsx b/src/app/config/antd/index.tsx index 811edc2c..16d846b8 100644 --- a/src/app/config/antd/index.tsx +++ b/src/app/config/antd/index.tsx @@ -1,11 +1,27 @@ import { ConfigProvider } from 'antd'; -import React, { PropsWithChildren } from 'react'; +import React, { PropsWithChildren, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { Locale } from 'antd/lib/locale-provider'; +import { Language } from '@shared/config'; import { getValidateMessages } from './utils'; +import { ANTD_LOCALES } from './constants'; export const AntdConfigProvider = ({ children }: PropsWithChildren) => { - const { t } = useTranslation('error'); + const { t, i18n } = useTranslation('error'); + const [locale, setLocale] = useState(); - return {children}; + useEffect(() => { + const loadLocale = async () => { + const localeModule = await ANTD_LOCALES[i18n.language as Language](); + setLocale(localeModule.default); + }; + loadLocale(); + }, [i18n.language]); + + return ( + + {children} + + ); }; diff --git a/src/app/styles/antd.less b/src/app/styles/antd.less index 32655050..93fbbc14 100644 --- a/src/app/styles/antd.less +++ b/src/app/styles/antd.less @@ -54,3 +54,8 @@ margin-left: 8px; } } + +.ant-picker-ranges { + display: flex; + justify-content: space-between; +} diff --git a/src/app/styles/variables.less b/src/app/styles/variables.less index 9a81d5d3..a0d0cba0 100644 --- a/src/app/styles/variables.less +++ b/src/app/styles/variables.less @@ -22,5 +22,4 @@ @picker-bg: #f1f3f5; @tooltip-bg: #000000; -// custom constants -@select-transformation-type-width: 180px; +@line-height-base: 1.5; diff --git a/src/entities/auth/hooks/useLogout/index.ts b/src/entities/auth/hooks/useLogout/index.ts index efbdd52c..fccf0f73 100644 --- a/src/entities/auth/hooks/useLogout/index.ts +++ b/src/entities/auth/hooks/useLogout/index.ts @@ -1,3 +1,4 @@ +import { Language, LANGUAGE_LOCAL_STORAGE_KEY } from '@shared/config'; import { useQueryClient } from '@tanstack/react-query'; import { useNavigate } from 'react-router-dom'; @@ -6,7 +7,9 @@ export const useLogout = () => { const queryClient = useQueryClient(); const logout = () => { + const language = localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) || Language.EN; localStorage.clear(); + localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, language); queryClient.clear(); navigate('/login'); }; diff --git a/src/entities/connection/api/types.ts b/src/entities/connection/api/types.ts index 1fe82bb5..c3c50256 100644 --- a/src/entities/connection/api/types.ts +++ b/src/entities/connection/api/types.ts @@ -200,6 +200,7 @@ export type CreateConnectionRequest = { export type UpdateConnectionRequest = { id: number; + group_id: number; name: string; description: string; } & ConnectionData; diff --git a/src/entities/group/api/hooks/useDeleteGroupUser/index.ts b/src/entities/group/api/hooks/useDeleteGroupUser/index.ts index 12eb9f2d..091440b1 100644 --- a/src/entities/group/api/hooks/useDeleteGroupUser/index.ts +++ b/src/entities/group/api/hooks/useDeleteGroupUser/index.ts @@ -17,7 +17,7 @@ export const useDeleteGroupUser = (data: DeleteGroupUserRequest): UseMutationRes onSuccess: () => { queryClient.invalidateQueries({ queryKey: [GroupQueryKey.GET_GROUP_USERS, data.groupId] }); notification.success({ - message: t('deleteGroupSuccess', { ns: 'group' }), + message: t('deleteUserFromGroupSuccess', { ns: 'group' }), }); }, onError: (error) => { diff --git a/src/entities/group/ui/GroupWarningAlert/styles.module.less b/src/entities/group/ui/GroupWarningAlert/styles.module.less index 03ebc92a..493bb746 100644 --- a/src/entities/group/ui/GroupWarningAlert/styles.module.less +++ b/src/entities/group/ui/GroupWarningAlert/styles.module.less @@ -1,3 +1,8 @@ .alert { - width: 500px; + width: fit-content; + padding: 20px 32px 20px 24px !important; + + :global(.ant-alert-message) { + font-weight: 700; + } } diff --git a/src/entities/run/ui/RunStatusBadge/index.tsx b/src/entities/run/ui/RunStatusBadge/index.tsx index b051fa36..985e24ea 100644 --- a/src/entities/run/ui/RunStatusBadge/index.tsx +++ b/src/entities/run/ui/RunStatusBadge/index.tsx @@ -1,11 +1,14 @@ import React, { memo } from 'react'; import { Badge } from 'antd'; import { RUN_STATUS_DISPLAY } from '@entities/run'; +import { useTranslation } from 'react-i18next'; import { RunStatusBadgeProps } from './types'; import { getRunStatusColor } from './utils'; export const RunStatusBadge = memo(({ status }: RunStatusBadgeProps) => { - const statusText = RUN_STATUS_DISPLAY[status]; + const { t } = useTranslation('run'); + const statusText = t(RUN_STATUS_DISPLAY[status]); + return ; }); diff --git a/src/entities/transfer/api/types.ts b/src/entities/transfer/api/types.ts index 86204297..0d2a526e 100644 --- a/src/entities/transfer/api/types.ts +++ b/src/entities/transfer/api/types.ts @@ -83,7 +83,7 @@ export interface GetTransferRequest { export interface CreateTransferRequest extends Omit {} -export interface UpdateTransferRequest extends Omit {} +export interface UpdateTransferRequest extends Transfer {} export interface DeleteTransferRequest { id: number; diff --git a/src/entities/transformation/ui/TransformationForm/TransformationForm.tsx b/src/entities/transformation/ui/TransformationForm/TransformationForm.tsx index e901408e..e0e24747 100644 --- a/src/entities/transformation/ui/TransformationForm/TransformationForm.tsx +++ b/src/entities/transformation/ui/TransformationForm/TransformationForm.tsx @@ -12,7 +12,7 @@ const TransformationFormComponent = ({ transformationType, ...props }: TransformationFormProps) => { - const { t } = useTranslation('transformation'); + const { t } = useTranslation(); const { isDisplayed } = useShowButtons(); const formInstance = Form.useFormInstance(); @@ -44,7 +44,7 @@ const TransformationFormComponent = ({ /> ))} )} diff --git a/src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/index.tsx b/src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/index.tsx index 2a5f6757..4610ddce 100644 --- a/src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/index.tsx +++ b/src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/index.tsx @@ -4,6 +4,7 @@ import { TransformationFilterColumnsType } from '@entities/transformation'; import { useTranslation } from 'react-i18next'; import { FilterColumnsValueProps } from './types'; +import classes from './styles.module.less'; export const FilterColumnsValue = ({ name, type }: FilterColumnsValueProps) => { const { t } = useTranslation('transformation'); @@ -14,13 +15,13 @@ export const FilterColumnsValue = ({ name, type }: FilterColumnsValueProps) => { return null; case TransformationFilterColumnsType.RENAME: return ( - + ); case TransformationFilterColumnsType.CAST: return ( - + ); diff --git a/src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/styles.module.less b/src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/styles.module.less new file mode 100644 index 00000000..7804505a --- /dev/null +++ b/src/entities/transformation/ui/TransformationForm/components/FilterColumnsValue/styles.module.less @@ -0,0 +1,3 @@ +.control { + width: 250px; +} diff --git a/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileRegexpValue/styles.module.less b/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileRegexpValue/styles.module.less index e4eb5bb6..7804505a 100644 --- a/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileRegexpValue/styles.module.less +++ b/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileRegexpValue/styles.module.less @@ -1,4 +1,3 @@ .control { - width: calc(100% - @select-transformation-type-width); - flex-grow: 1; + width: 250px; } diff --git a/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileSizeValue/index.tsx b/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileSizeValue/index.tsx index 9269aae0..7a62e494 100644 --- a/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileSizeValue/index.tsx +++ b/src/entities/transformation/ui/TransformationForm/components/FilterFileValue/components/FilterFileSizeValue/index.tsx @@ -13,15 +13,10 @@ export const FilterFileSizeValue = memo(({ name }: FilterFileSizeValueProps) => return ( <> - + - + ); diff --git a/src/entities/transformation/ui/TransformationForm/components/FilterRowsValue/styles.module.less b/src/entities/transformation/ui/TransformationForm/components/FilterRowsValue/styles.module.less new file mode 100644 index 00000000..7804505a --- /dev/null +++ b/src/entities/transformation/ui/TransformationForm/components/FilterRowsValue/styles.module.less @@ -0,0 +1,3 @@ +.control { + width: 250px; +} diff --git a/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/TransformationFormItem.tsx b/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/TransformationFormItem.tsx index f4223f70..9b3212b2 100644 --- a/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/TransformationFormItem.tsx +++ b/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/TransformationFormItem.tsx @@ -3,6 +3,7 @@ import React, { useMemo, useState } from 'react'; import { DeleteOutlined } from '@ant-design/icons'; import { Select } from '@shared/ui'; import { useTranslation } from 'react-i18next'; +import clsx from 'clsx'; import { TransformationsFormNestedType, TransformationType } from '../../../../types'; import { FilterComponent } from '../FilterComponent'; @@ -53,12 +54,18 @@ export const TransformationFormItem = ({ size="large" options={nestedTypesSelectOptions} onChange={setType} - placeholder={t('selectType')} + placeholder={t('selectOption')} /> {onRemove && ( - )} diff --git a/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/styles.module.less b/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/styles.module.less index 21691752..5eeef18a 100644 --- a/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/styles.module.less +++ b/src/entities/transformation/ui/TransformationForm/components/TransformationFormItem/styles.module.less @@ -1,6 +1,6 @@ .root { display: flex; - align-items: center; + align-items: flex-start; gap: 12px; &:first-of-type { @@ -8,11 +8,15 @@ } .column { - min-width: 300px; + width: 250px; } .type { - min-width: @select-transformation-type-width; + min-width: 180px; flex-grow: 1; } + + .deleteButton { + margin-top: calc(1rem * @line-height-base); + } } diff --git a/src/features/auth/Login/index.tsx b/src/features/auth/Login/index.tsx index 5aa78754..3674baa2 100644 --- a/src/features/auth/Login/index.tsx +++ b/src/features/auth/Login/index.tsx @@ -18,7 +18,7 @@ export const Login = () => { return (
- {t('signIn')} + {t('auth')} @@ -28,7 +28,7 @@ export const Login = () => { - +
); diff --git a/src/features/auth/Login/styles.module.less b/src/features/auth/Login/styles.module.less index 06adaa27..b8a476b7 100644 --- a/src/features/auth/Login/styles.module.less +++ b/src/features/auth/Login/styles.module.less @@ -2,7 +2,7 @@ display: flex; flex-direction: column; gap: 32px; - width: 360px; + width: 420px; padding: 32px; background-color: @white; border-radius: 16px; diff --git a/src/features/connection/ConnectionList/utils/getConnectionListColumns/index.tsx b/src/features/connection/ConnectionList/utils/getConnectionListColumns/index.tsx index e93fd381..ee8d8d48 100644 --- a/src/features/connection/ConnectionList/utils/getConnectionListColumns/index.tsx +++ b/src/features/connection/ConnectionList/utils/getConnectionListColumns/index.tsx @@ -10,7 +10,7 @@ export const getConnectionListColumns = (t: TFunction<'shared'>) => { { title: t('id'), dataIndex: 'id', - width: 150, + width: 160, }, { title: t('name'), diff --git a/src/features/connection/UpdateConnection/index.tsx b/src/features/connection/UpdateConnection/index.tsx index 145eb5b0..17b94819 100644 --- a/src/features/connection/UpdateConnection/index.tsx +++ b/src/features/connection/UpdateConnection/index.tsx @@ -13,7 +13,7 @@ export const UpdateConnection = ({ connection, group }: UpdateConnectionProps) = const navigate = useNavigate(); const handleUpdateConnection = (values: UpdateConnectionForm) => { - return connectionService.updateConnection(Object.assign({ id: connectionId, ...values })); + return connectionService.updateConnection(Object.assign({ id: connectionId, group_id, ...values })); }; const onSuccess = (response: Connection) => { diff --git a/src/features/connection/UpdateConnection/types.ts b/src/features/connection/UpdateConnection/types.ts index 3c214296..e1ed25b8 100644 --- a/src/features/connection/UpdateConnection/types.ts +++ b/src/features/connection/UpdateConnection/types.ts @@ -1,7 +1,7 @@ import { Connection, UpdateConnectionRequest } from '@entities/connection'; import { GroupData } from '@entities/group'; -export type UpdateConnectionForm = Omit; +export type UpdateConnectionForm = Omit; export interface UpdateConnectionProps { connection: Connection; diff --git a/src/features/group/GroupList/utils/getGroupListColumns/index.tsx b/src/features/group/GroupList/utils/getGroupListColumns/index.tsx index fef3bafa..4a767ac7 100644 --- a/src/features/group/GroupList/utils/getGroupListColumns/index.tsx +++ b/src/features/group/GroupList/utils/getGroupListColumns/index.tsx @@ -11,7 +11,7 @@ export const getGroupListColumns = (t: TFunction) => { title: t('id'), dataIndex: 'id', render: (name, record) => record.data.id, - width: 150, + width: 160, }, { title: t('name'), diff --git a/src/features/group/GroupUserList/utils/getGroupUserListColumns/index.ts b/src/features/group/GroupUserList/utils/getGroupUserListColumns/index.ts index 181452ec..52da41c9 100644 --- a/src/features/group/GroupUserList/utils/getGroupUserListColumns/index.ts +++ b/src/features/group/GroupUserList/utils/getGroupUserListColumns/index.ts @@ -1,4 +1,5 @@ import { GroupUser } from '@entities/group'; +import { USER_ROLE_DISPLAY } from '@shared/constants'; import { PaginationResponse } from '@shared/types'; import { TableColumns } from '@shared/ui'; import { TFunction } from 'i18next'; @@ -8,15 +9,17 @@ export const getGroupUserListColumns = (t: TFunction) => { { title: t('id'), dataIndex: 'id', - width: 150, + width: 160, }, { title: t('username', { ns: 'auth' }), dataIndex: 'username', + width: 400, }, { title: t('role', { ns: 'group' }), dataIndex: 'role', + render: (name, record) => t(USER_ROLE_DISPLAY[record.role], { ns: 'auth' }), width: 200, }, ]; diff --git a/src/features/queue/QueueList/utils/getQueueListColumns/index.tsx b/src/features/queue/QueueList/utils/getQueueListColumns/index.tsx index 6700f7a1..4c14ddc3 100644 --- a/src/features/queue/QueueList/utils/getQueueListColumns/index.tsx +++ b/src/features/queue/QueueList/utils/getQueueListColumns/index.tsx @@ -10,7 +10,7 @@ export const getQueueListColumns = (t: TFunction) => { { title: t('id'), dataIndex: 'id', - width: 150, + width: 160, }, { title: t('name'), diff --git a/src/features/run/RunList/utils/getRunListColumns/index.tsx b/src/features/run/RunList/utils/getRunListColumns/index.tsx index 0e72b7ed..03415905 100644 --- a/src/features/run/RunList/utils/getRunListColumns/index.tsx +++ b/src/features/run/RunList/utils/getRunListColumns/index.tsx @@ -15,7 +15,7 @@ export const getRunListColumns = (t: TFunction<'run'>) => { title: t('id', { ns: 'shared' }), dataIndex: 'id', render: (id, record) => {id}, - width: 80, + width: 160, }, { title: t('status'), diff --git a/src/features/transfer/MutateTransferForm/components/TransformButtons/TransformButtons.tsx b/src/features/transfer/MutateTransferForm/components/TransformButtons/TransformButtons.tsx index be076ddb..217b5a52 100644 --- a/src/features/transfer/MutateTransferForm/components/TransformButtons/TransformButtons.tsx +++ b/src/features/transfer/MutateTransferForm/components/TransformButtons/TransformButtons.tsx @@ -36,7 +36,7 @@ export const TransformButtons = memo(() => { return (
- {t('transformationsControls')} + {t('transformations')}
{Object.values(TransferCanvasTransformNodeType).map((item, index) => ( {
{nodeTypeForDeleting && ( } onClick={() => onDeleteNode(nodeType)}> - {t('remove', { ns: 'shared' })} {t(TRANSFER_CANVAS_TRANSFORM_NODE_TYPE_NAME_DISPLAY[nodeType])} + {t('delete', { ns: 'shared' })} {t(TRANSFER_CANVAS_TRANSFORM_NODE_TYPE_NAME_DISPLAY[nodeType])} ); } diff --git a/src/features/transfer/TransferDetailInfo/components/TransferStrategyParams/index.tsx b/src/features/transfer/TransferDetailInfo/components/TransferStrategyParams/index.tsx index 72f4d02a..da5af4b9 100644 --- a/src/features/transfer/TransferDetailInfo/components/TransferStrategyParams/index.tsx +++ b/src/features/transfer/TransferDetailInfo/components/TransferStrategyParams/index.tsx @@ -10,7 +10,7 @@ export const TransferStrategyParams = ({ data, ...props }: TransferStrategyParam return ( - {data.type} + {t(data.type)} {data.increment_by && ( diff --git a/src/features/transfer/TransferList/utils/getTransferListColumns/index.tsx b/src/features/transfer/TransferList/utils/getTransferListColumns/index.tsx index 38034824..dedef512 100644 --- a/src/features/transfer/TransferList/utils/getTransferListColumns/index.tsx +++ b/src/features/transfer/TransferList/utils/getTransferListColumns/index.tsx @@ -10,7 +10,7 @@ export const getTransferListColumns = (t: TFunction<'shared'>) => { { title: t('id'), dataIndex: 'id', - width: 150, + width: 160, }, { title: t('name'), diff --git a/src/pages/connection/ConnectionDetailPage/index.tsx b/src/pages/connection/ConnectionDetailPage/index.tsx index 6ea16128..c58861e2 100644 --- a/src/pages/connection/ConnectionDetailPage/index.tsx +++ b/src/pages/connection/ConnectionDetailPage/index.tsx @@ -19,7 +19,7 @@ export const ConnectionDetailPage = () => { return ( - {t('connection')}: {connection.name} + {t('connection')} «{connection.name}» diff --git a/src/pages/connection/ConnectionListPage/index.tsx b/src/pages/connection/ConnectionListPage/index.tsx index 3c1aed78..bf061e8e 100644 --- a/src/pages/connection/ConnectionListPage/index.tsx +++ b/src/pages/connection/ConnectionListPage/index.tsx @@ -1,10 +1,9 @@ import React from 'react'; -import { AccessWrapper, PageContentWrapper } from '@shared/ui'; -import { Button, Typography } from 'antd'; +import { AccessWrapper, ActionButton, PageContentWrapper } from '@shared/ui'; +import { Typography } from 'antd'; import { GroupWarningAlert, useSelectedGroup } from '@entities/group'; import { ConnectionListWrapper } from '@widgets/connection'; import { UserRole } from '@shared/types'; -import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import classes from './styles.module.less'; @@ -23,9 +22,7 @@ export const ConnectionListPage = () => { return ( - + diff --git a/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx b/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx index 6ec85e8a..60576c24 100644 --- a/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx +++ b/src/pages/group/GroupDetailPage/components/UpdateGroupButton/index.tsx @@ -1,17 +1,9 @@ import React from 'react'; -import { Button } from 'antd'; -import { Link } from 'react-router-dom'; -import { useTranslation } from 'react-i18next'; +import { ActionButton } from '@shared/ui'; import classes from './styles.module.less'; import { UpdateGroupButtonProps } from './types'; export const UpdateGroupButton = ({ groupId }: UpdateGroupButtonProps) => { - const { t } = useTranslation('group'); - - return ( - - ); + return ; }; diff --git a/src/pages/group/GroupDetailPage/index.tsx b/src/pages/group/GroupDetailPage/index.tsx index c9f3a384..c3ce884b 100644 --- a/src/pages/group/GroupDetailPage/index.tsx +++ b/src/pages/group/GroupDetailPage/index.tsx @@ -24,7 +24,7 @@ export const GroupDetailPage = () => {
- {t('group')}: {group.data.name} + {t('group')} «{group.data.name}» { {t('groups')} - + diff --git a/src/pages/queue/QueueDetailPage/index.tsx b/src/pages/queue/QueueDetailPage/index.tsx index 04735b3f..3b5ce777 100644 --- a/src/pages/queue/QueueDetailPage/index.tsx +++ b/src/pages/queue/QueueDetailPage/index.tsx @@ -19,7 +19,7 @@ export const QueueDetailPage = () => { return ( - {t('queue')}: {queue.name} + {t('queue')} «{queue.name}» diff --git a/src/pages/queue/QueueListPage/index.tsx b/src/pages/queue/QueueListPage/index.tsx index e65483c3..ca5f9923 100644 --- a/src/pages/queue/QueueListPage/index.tsx +++ b/src/pages/queue/QueueListPage/index.tsx @@ -1,7 +1,6 @@ -import { AccessWrapper, PageContentWrapper } from '@shared/ui'; -import { Button, Typography } from 'antd'; +import { AccessWrapper, ActionButton, PageContentWrapper } from '@shared/ui'; +import { Typography } from 'antd'; import React from 'react'; -import { Link } from 'react-router-dom'; import { GroupWarningAlert, useSelectedGroup } from '@entities/group'; import { QueueListWrapper } from '@widgets/queue'; import { UserRole } from '@shared/types'; @@ -23,9 +22,7 @@ export const QueueListPage = () => { return ( - + diff --git a/src/pages/run/RunDetailPage/index.tsx b/src/pages/run/RunDetailPage/index.tsx index 44fb5bd0..463be387 100644 --- a/src/pages/run/RunDetailPage/index.tsx +++ b/src/pages/run/RunDetailPage/index.tsx @@ -31,7 +31,7 @@ export const RunDetailPage = () => {
- {t('run')}: #{run.id} + {t('run')} #{run.id}
diff --git a/src/pages/transfer/TransferDetailPage/index.tsx b/src/pages/transfer/TransferDetailPage/index.tsx index 2cd5f594..b9c8861b 100644 --- a/src/pages/transfer/TransferDetailPage/index.tsx +++ b/src/pages/transfer/TransferDetailPage/index.tsx @@ -28,7 +28,7 @@ export const TransferDetailPage = () => {
- {t('transfer')}: {transfer.name} + {t('transfer')} «{transfer.name}» { return ( - + diff --git a/src/shared/config/i18n/constants.ts b/src/shared/config/i18n/constants.ts index 8b7b5153..f3c908b5 100644 --- a/src/shared/config/i18n/constants.ts +++ b/src/shared/config/i18n/constants.ts @@ -1,6 +1,10 @@ import { Language } from './types'; import en from './translations/en.json'; +import ru from './translations/ru.json'; export const resources = { [Language.EN]: en, + [Language.RU]: ru, }; + +export const LANGUAGE_LOCAL_STORAGE_KEY = 'LANGUAGE'; diff --git a/src/shared/config/i18n/index.ts b/src/shared/config/i18n/index.ts index d46b5fe8..6654fd03 100644 --- a/src/shared/config/i18n/index.ts +++ b/src/shared/config/i18n/index.ts @@ -1 +1,4 @@ export * from './instance'; +export * from './types'; +export * from './ui'; +export * from './constants'; diff --git a/src/shared/config/i18n/instance.ts b/src/shared/config/i18n/instance.ts index 686006ce..c53021fd 100644 --- a/src/shared/config/i18n/instance.ts +++ b/src/shared/config/i18n/instance.ts @@ -1,11 +1,11 @@ import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; -import { resources } from './constants'; +import { LANGUAGE_LOCAL_STORAGE_KEY, resources } from './constants'; import { Language } from './types'; i18n.use(initReactI18next).init({ - lng: Language.EN, + lng: localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) || Language.EN, fallbackLng: Language.EN, resources, defaultNS: 'shared', diff --git a/src/shared/config/i18n/translations/en.json b/src/shared/config/i18n/translations/en.json index 2f1f0079..fc29090d 100644 --- a/src/shared/config/i18n/translations/en.json +++ b/src/shared/config/i18n/translations/en.json @@ -12,7 +12,9 @@ "invalidRegularExpression": "Invalid regular expressions" }, "auth": { + "auth": "Authorization", "signIn": "Sign in", + "logout": "Logout", "username": "Username", "password": "Password", "authType": "Auth type", @@ -26,7 +28,7 @@ "queue": "Queue", "queues": "Queues", "createQueue": "Create Queue", - "updateQueue": "Update Queue", + "updateQueue": "Edit Queue", "deleteQueue": "Delete Queue", "createQueueSuccess": "Queue was created successfully", "updateQueueSuccess": "Queue was updated successfully", @@ -42,7 +44,7 @@ "connection": "Connection", "connections": "Connections", "createConnection": "Create Connection", - "updateConnection": "Update Connection", + "updateConnection": "Edit Connection", "deleteConnection": "Delete Connection", "createConnectionSuccess": "Connection was created successfully", "updateConnectionSuccess": "Connection was updated successfully", @@ -87,7 +89,7 @@ "fileFormat": "File format", "selectFileFormat": "Select file format", "compression": "Compression", - "selectCompression": "Select compressions", + "selectCompression": "Select compression type", "delimiter": "Delimiter", "encoding": "Encoding", "quote": "Quote", @@ -100,7 +102,7 @@ "rootTag": "Root tag", "rowTag": "Row tag", "filenameTemplate": "Filename template", - "fileModifiedSince": "File modification type", + "fileModifiedSince": "File modified date", "filename": "File name", "fileFormatSettings": "File format settings", "useFollowingPlaceholders": "You can use the following placeholders (with brackets {}):", @@ -110,15 +112,15 @@ "group": "Group", "groups": "Groups", "createGroup": "Create Group", - "updateGroup": "Update Group", + "updateGroup": "Edit Group", "createGroupSuccess": "Group was created successfully", "updateGroupSuccess": "Group was updated successfully", "updateUserRoleSuccess": "User role was updated successfully", - "deleteGroupSuccess": "Group was deleted successfully", "addUserToGroupSuccess": "User was added to group successfully", - "updateUserInGroup": "Update user in Group", + "updateUserInGroup": "Edit user in Group", "deleteUserFromGroup": "Delete user from Group", "deleteUserFromGroupConfirm": "Do you really want to delete user <0>«{{username}}» from the group?", + "deleteUserFromGroupSuccess": "User was deleted from group successfully", "groupMembers": "Group members", "warning": "Warning", "addUser": "Add user", @@ -132,7 +134,7 @@ }, "run": { "run": "Run", - "createRunSuccess": "Transfer run was created successfully", + "createRunSuccess": "Transfer was run successfully", "runTransferConfirm": "Do you really want to run transfer", "transferRuns": "Transfer runs", "runTransfer": "Run Transfer", @@ -140,13 +142,19 @@ "status": "Status", "startedAt": "Started at", "endedAt": "Ended at", - "logUrl": "Log url" + "logUrl": "Log url", + "created": "Created", + "started": "Started", + "failed": "Failed", + "sendStopSignal": "Send stop signal", + "stopped": "Stopped", + "finished": "Finished" }, "transfer": { "transfer": "Transfer", "transfers": "Transfers", "createTransfer": "Create Transfer", - "updateTransfer": "Update Transfer", + "updateTransfer": "Edit Transfer", "deleteTransfer": "Delete Transfer", "createTransferSuccess": "Transfer was created successfully", "updateTransferSuccess": "Transfer was updated successfully", @@ -174,11 +182,11 @@ "advanced": "Advanced" }, "transformation": { - "addItem": "Add item", + "transformations": "Transformations:", "value": "Value", "selectUnit": "Select unit", "column": "Column", - "selectType": "Select type", + "selectOption": "Select option", "isNull": "is null", "isNotNull": "is not null", "equal": "equal", @@ -196,7 +204,6 @@ "include": "include", "rename": "rename", "operator": "Operator", - "transformationsControls": "Transformations controls:", "deleteNodeConfirm": "Do you really want to delete", "filterRows": "Filter rows", "filterColumns": "Filter columns", @@ -224,22 +231,27 @@ "fridayOn": "on Friday", "saturdayOn": "on Saturday", "sundayOn": "on Sunday", - "day": "day", - "week": "week", - "month": "month", "dayEvery": "Every day", "weekEvery": "Every week", "monthEvery": "Every month", - "dayOfMonth_ordinal_one": "{{count}}st", - "dayOfMonth_ordinal_two": "{{count}}nd", - "dayOfMonth_ordinal_few": "{{count}}rd", - "dayOfMonth_ordinal_other": "{{count}}th", - "every": "Every", - "on": "On", - "at": "At", + "dayOfMonth_ordinal_one": "st", + "dayOfMonth_ordinal_two": "nd", + "dayOfMonth_ordinal_few": "rd", + "dayOfMonth_ordinal_other": "th", + "dayOfMonthNumber_ordinal_one": "on the {{count}}st", + "dayOfMonthNumber_ordinal_two": "on the {{count}}nd", + "dayOfMonthNumber_ordinal_few": "on the {{count}}rd", + "dayOfMonthNumber_ordinal_other": "on the {{count}}th", + "dayOfMonth": "Day of month", + "dayOfWeek": "Day of week", + "period": "Period", + "time": "Time", + "at": "at", "actions": "Actions", + "confirm": "Confirm", "add": "Add", - "remove": "Remove", + "create": "Create", + "edit": "Edit", "update": "Update", "delete": "Delete", "id": "Id", @@ -247,7 +259,6 @@ "description": "Description", "type": "Type", "required": "required", - "mainInfo": "Main info", - "confirm": "Confirm" + "mainInfo": "Main info" } } \ No newline at end of file diff --git a/src/shared/config/i18n/translations/ru.json b/src/shared/config/i18n/translations/ru.json new file mode 100644 index 00000000..9cb1d72e --- /dev/null +++ b/src/shared/config/i18n/translations/ru.json @@ -0,0 +1,258 @@ +{ + "error": { + "access": "Извините, у Вас нет доступа к этой странице", + "notFound": "Извините, страница, которую вы посетили, не существует", + "internalServer": "Извините, что-то пошло не так", + "backHome": "На главную", + "unexpectedErrorOccurred": "Произошла непредвиденная ошибка", + "invalidValue": "Некорректное значение", + "formErrorHasOccurred": "Произошла ошибка формы", + "fieldIsRequired": "Поле обязательно", + "fieldPatternInvalid": "Значение поля не соответствует шаблону", + "invalidRegularExpression": "Некорректное регулярное выражение" + }, + "auth": { + "auth": "Авторизация", + "signIn": "Войти", + "logout": "Выйти", + "username": "Имя пользователя", + "password": "Пароль", + "authType": "Тип авторизации", + "guest": "Гость", + "developer": "Разработчик", + "maintainer": "Обслуживающий", + "owner": "Владелец", + "superuser": "Суперпользователь" + }, + "queue": { + "queue": "Очередь", + "queues": "Очереди", + "createQueue": "Создание очереди", + "updateQueue": "Редактирование очереди", + "deleteQueue": "Удаление очереди", + "createQueueSuccess": "Очередь успешно создана", + "updateQueueSuccess": "Очередь успешно обновлена", + "deleteQueueSuccess": "Очередь успешно удалена", + "deleteQueueConfirm": "Вы действительно хотите удалить очередь", + "needToSelectGroupToSeeQueueList": "Вам нужно выбрать группу, чтобы увидеть список очередей", + "needToSelectGroupToCreateQueue": "Вам нужно выбрать группу, чтобы создать очередь", + "notPermissionToCreateQueue": "У вас нет разрешения на создание очереди в выбранной группе", + "queueInfo": "Информация об очереди", + "selectQueue": "Выберите очередь" + }, + "connection": { + "connection": "Соединение", + "connections": "Соединения", + "createConnection": "Создание соединения", + "updateConnection": "Редактирование соединения", + "deleteConnection": "Удаление соединения", + "createConnectionSuccess": "Соединение успешно создано", + "updateConnectionSuccess": "Соединение успешно обновлено", + "deleteConnectionSuccess": "Соединение успешно удалено", + "deleteConnectionConfirm": "Вы действительно хотите удалить соединение", + "needToSelectGroupToSeeConnectionList": "Вам нужно выбрать группу, чтобы увидеть список соединений", + "needToSelectGroupToCreateConnection": "Вам нужно выбрать группу, чтобы создать соединение", + "notPermissionToCreateConnection": "У вас нет разрешения на создание соединения в выбранной группе", + "sourceConnectionInfo": "Информация об исходном соединении", + "targetConnectionInfo": "Информация о целевом соединении", + "connectionSettings": "Настройки соединения", + "selectConnectionType": "Выберите тип соединения", + "sourceConnection": "Исходное соединение", + "targetConnection": "Целевое соединение", + "selectSourceConnection": "Выберите исходное соединение", + "selectTargetConnection": "Выберите целевое соединение", + "connectionsSettings": "Настройки соединений", + "accessKey": "Ключ доступа", + "secretKey": "Секретный ключ", + "selectProtocol": "Выберите протокол", + "databaseName": "Имя базы данных", + "host": "Хост", + "port": "Порт", + "cluster": "Кластер", + "serviceName": "Название сервиса", + "serviceNameOrSidRequired": "Требуется либо название сервиса, либо сид", + "sid": "Сид", + "protocol": "Протокол", + "bucketStyle": "Стиль бакета", + "bucket": "Бакет", + "region": "Регион", + "selectBucketStyle": "Выберите стиль бакета", + "share": "Опубликованный ресурс", + "domain": "Домен", + "connectionInfo": "Информация о соединении" + }, + "file": { + "b": "Б", + "kb": "КБ", + "mb": "МБ", + "gb": "ГБ", + "fileFormat": "Формат файла", + "selectFileFormat": "Выбрать формат файла", + "compression": "Сжатие", + "selectCompression": "Выберите тип сжатия", + "delimiter": "Разделитель", + "encoding": "Кодировка", + "quote": "Кавычки", + "escape": "Экранирование", + "includeHeader": "Включить заголовок", + "lineSeparator": "Разделитель строк", + "yes": "Да", + "no": "Нет", + "startCell": "Начальная ячейка", + "rootTag": "Корневой тег", + "rowTag": "Тег строки", + "filenameTemplate": "Шаблон имени файла", + "fileModifiedSince": "Дата изменения файла", + "filename": "Имя файла", + "fileFormatSettings": "Настройки формата файла", + "useFollowingPlaceholders": "Вы можете использовать следующие шаблоны (с квадратными скобками {}):", + "lettersNumbersAndSymbols": "А также буквы, цифры и символы \".\", \"_\", \"-\"" + }, + "group": { + "group": "Группа", + "groups": "Группы", + "createGroup": "Создание группы", + "updateGroup": "Редактирование группы", + "createGroupSuccess": "Группа успешно создана", + "updateGroupSuccess": "Группа успешно обновлена", + "updateUserRoleSuccess": "Роль пользователя успешно обновлена", + "addUserToGroupSuccess": "Пользователь успешно добавлен в группу", + "updateUserInGroup": "Редактировать пользователя в группе", + "deleteUserFromGroup": "Удалить пользователя из группы", + "deleteUserFromGroupConfirm": "Вы действительно хотите удалить пользователя <0>«{{username}}» из группы?", + "deleteUserFromGroupSuccess": "Пользователь успешно удален из группы", + "groupMembers": "Члены группы", + "warning": "Внимание", + "addUser": "Добавить пользователя", + "addUserToGroup": "Добавить пользователя в группу", + "user": "Пользователь", + "role": "Роль", + "groupInfo": "Информация о группе", + "selectUser": "Выберите пользователя", + "selectGroup": "Выберите группу", + "selectRole": "Выберите роль" + }, + "run": { + "run": "Запуск", + "createRunSuccess": "Трансфер успешно запущен", + "runTransferConfirm": "Вы действительно хотите запустить трансфер", + "transferRuns": "Запуски трансфера", + "runTransfer": "Запустить трансфер", + "runInfo": "Информация о запуске", + "status": "Статус", + "startedAt": "Начало в", + "endedAt": "Окончание в", + "logUrl": "Адрес логов", + "created": "Создан", + "started": "Запущен", + "failed": "Неуспешный", + "sendStopSignal": "Отправлен сигнал остановки", + "stopped": "Остановлен", + "finished": "Закончен" + }, + "transfer": { + "transfer": "Трансфер", + "transfers": "Трансферы", + "createTransfer": "Создание трансфера", + "updateTransfer": "Редактирование трансфера", + "deleteTransfer": "Удаление трансфера", + "createTransferSuccess": "Трансфер успешно создан", + "updateTransferSuccess": "Трансфер успешно обновлен", + "deleteTransferSuccess": "Трансфер успешно удален", + "deleteTransferConfirm": "Вы действительно хотите удалить трансфер", + "needToSelectGroupToSeeTransferList": "Вам нужно выбрать группу, чтобы увидеть список трансферов", + "needToSelectGroupToCreateTransfer": "Вам нужно выбрать группу, чтобы создать трансфер", + "notPermissionToCreateTransfer": "У вас нет разрешения на создание трансфера в выбранной группе", + "transferAdvancedInfo": "Расширенная информация о трансфере", + "directoryPath": "Путь к каталогу", + "tableName": "Название таблицы", + "transferInfo": "Информация о трансфере", + "schedule": "Расписание", + "strategyParams": "Параметры стратегии", + "sourceParams": "Исходные параметры", + "targetParams": "Целевые параметры", + "incrementBy": "Инкремент", + "selectIncrementBy": "Выберите инкремент", + "source": "Источник", + "selectStrategy": "Выберите стратегию", + "full": "полная", + "incremental": "инкрементальная", + "target": "Цель", + "basic": "Обычный", + "advanced": "Продвинутый" + }, + "transformation": { + "transformations": "Трансформации:", + "value": "Значение", + "selectUnit": "Выберите единицу измерения", + "column": "Столбец", + "selectOption": "Выберите опцию", + "isNull": "пусто", + "isNotNull": "не пусто", + "equal": "равно", + "notEqual": "не равно", + "greaterThan": "больше чем", + "greaterOrEqual": "больше или равно", + "lessThan": "меньше чем", + "lessOrEqual": "меньше или равно", + "like": "подобно (с учетом регистра)", + "iLike": "подобно", + "notLike": "не подобно (с учетом регистра)", + "notILike": "не подобно", + "regexp": "регулярное выражение", + "cast": "преобразование", + "include": "включение", + "rename": "переименование", + "operator": "Оператор", + "deleteNodeConfirm": "Вы действительно хотите удалить", + "filterRows": "Фильтр строк", + "filterColumns": "Фильтр столбцов", + "filterFile": "Фильтр файлов", + "fileSizeUnit": "Единица измерения", + "fileSizeMin": "мин. размер файла", + "fileSizeMax": "макс. размер файла", + "nameGlob": "имя (глобально)", + "nameRegexp": "имя (регулярное выражение)" + }, + "shared": { + "submit": "Сохранить", + "cancel": "Отмена", + "monday": "Понедельник", + "tuesday": "Вторник", + "wednesday": "Среда", + "thursday": "Четверг", + "friday": "Пятница", + "saturday": "Суббота", + "sunday": "Воскресенье", + "mondayOn": "в понедельник", + "tuesdayOn": "во вторник", + "wednesdayOn": "в среду", + "thursdayOn": "в четверг", + "fridayOn": "в пятницу", + "saturdayOn": "в субботу", + "sundayOn": "в воскресенье", + "dayEvery": "Каждый день", + "weekEvery": "Каждую неделю", + "monthEvery": "Каждый месяц", + "dayOfMonth_ordinal_other": "-ое", + "dayOfMonthNumber_ordinal_other": "{{count}}-го числа", + "dayOfMonth": "Число месяца", + "dayOfWeek": "День недели", + "period": "Период", + "time": "Время", + "at": "в", + "actions": "Действия", + "confirm": "Подтвердить", + "add": "Добавить", + "create": "Создать", + "edit": "Редактировать", + "update": "Обновить", + "delete": "Удалить", + "id": "Идентификатор", + "name": "Название", + "description": "Описание", + "type": "Тип", + "required": "обязательный", + "mainInfo": "Основная информация" + } +} \ No newline at end of file diff --git a/src/shared/config/i18n/ui/ChangeLanguageSelect/constants.ts b/src/shared/config/i18n/ui/ChangeLanguageSelect/constants.ts new file mode 100644 index 00000000..50467e6a --- /dev/null +++ b/src/shared/config/i18n/ui/ChangeLanguageSelect/constants.ts @@ -0,0 +1,13 @@ +import { prepareOptionsForSelect } from '../../../../ui/ManagedSelect/utils'; +import { Language } from '../../types'; + +const LANGUAGE_DISPLAY = { + [Language.EN]: 'EN', + [Language.RU]: 'RU', +}; + +export const LANGUAGE_SELECT_OPTIONS = prepareOptionsForSelect({ + data: Object.values(Language), + renderLabel: (data) => LANGUAGE_DISPLAY[data], + renderValue: (data) => data, +}); diff --git a/src/shared/config/i18n/ui/ChangeLanguageSelect/index.tsx b/src/shared/config/i18n/ui/ChangeLanguageSelect/index.tsx new file mode 100644 index 00000000..9f0f4912 --- /dev/null +++ b/src/shared/config/i18n/ui/ChangeLanguageSelect/index.tsx @@ -0,0 +1,28 @@ +import { Select } from 'antd'; +import React from 'react'; +import { useTranslation } from 'react-i18next'; + +import { Language } from '../../types'; +import { LANGUAGE_LOCAL_STORAGE_KEY } from '../../constants'; + +import { LANGUAGE_SELECT_OPTIONS } from './constants'; +import classes from './styles.module.less'; + +export const ChangeLanguageSelect = () => { + const { i18n } = useTranslation(); + + const handleChange = (value: Language) => { + i18n.changeLanguage(value); + localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, value); + }; + + return ( + - ); - case Period.MONTH: - return ( -
+
+ {t('dayOfWeek')}: + {t('dayOfMonth', { count: monthDay!, ordinal: true })} +
); default: diff --git a/src/shared/ui/CronSelect/hooks/useGetDaysOfWeekSelectOptions/index.ts b/src/shared/ui/CronSelect/hooks/useGetDaysOfWeekSelectOptions/index.ts index 9a3ce921..043900f4 100644 --- a/src/shared/ui/CronSelect/hooks/useGetDaysOfWeekSelectOptions/index.ts +++ b/src/shared/ui/CronSelect/hooks/useGetDaysOfWeekSelectOptions/index.ts @@ -9,7 +9,15 @@ export const useGetDaysOfWeekSelectOptions = () => { return useMemo(() => { return prepareOptionsForSelect({ - data: Object.values(DayOfWeek), + data: Object.values([ + DayOfWeek.MONDAY, + DayOfWeek.TUESDAY, + DayOfWeek.WEDNESDAY, + DayOfWeek.THURSDAY, + DayOfWeek.FRIDAY, + DayOfWeek.SATURDAY, + DayOfWeek.SUNDAY, + ]), renderLabel: (data) => t(DAY_OF_WEEK_DISPLAY[data as DayOfWeek]), renderValue: (data) => data, }); diff --git a/src/shared/ui/CronSelect/index.tsx b/src/shared/ui/CronSelect/index.tsx index fa8eab80..ac9b20a4 100644 --- a/src/shared/ui/CronSelect/index.tsx +++ b/src/shared/ui/CronSelect/index.tsx @@ -1,7 +1,8 @@ import React, { memo } from 'react'; -import { Select, TimePicker } from '@shared/ui'; +import { TimePicker } from '@shared/ui'; import { Period } from '@shared/services'; import { useTranslation } from 'react-i18next'; +import { Select } from 'antd'; import { CronSelectProps } from './types'; import classes from './styles.module.less'; @@ -26,31 +27,29 @@ export const CronSelect = memo(({ value, onChange }: CronSelectProps) => { return (
- {t('every')}: + {t('period')}: