From 9c8aa4cf8ce02ac9bdd61251ad5b531d8510116b Mon Sep 17 00:00:00 2001 From: Robin-Food Date: Tue, 31 Mar 2026 02:07:08 +0300 Subject: [PATCH] feat(i18n): add Russian (ru) language support - Add packages/i18n/src/locales/ru/translations.json with full translation of all 300+ keys covering UI, profile, security, themes, issues, projects, cycles, modules, notifications, and workspaces. - Register "ru" locale in SUPPORTED_LANGUAGES constant (language.ts). - Add dynamic import of ru translations in TranslationStore (store/index.ts). Closes: Russian language support request Made-with: Cursor --- packages/i18n/src/constants/language.ts | 1 + .../i18n/src/locales/ru/translations.json | 320 ++++++++++++++++++ packages/i18n/src/store/index.ts | 1 + 3 files changed, 322 insertions(+) create mode 100644 packages/i18n/src/locales/ru/translations.json diff --git a/packages/i18n/src/constants/language.ts b/packages/i18n/src/constants/language.ts index 67b8e9d3f66..89433125f99 100644 --- a/packages/i18n/src/constants/language.ts +++ b/packages/i18n/src/constants/language.ts @@ -8,6 +8,7 @@ export const SUPPORTED_LANGUAGES: ILanguageOption[] = [ { label: "Español", value: "es" }, { label: "日本語", value: "ja" }, { label: "中文", value: "zh-CN" }, + { label: "Русский", value: "ru" }, ]; export const STORAGE_KEY = "userLanguage"; diff --git a/packages/i18n/src/locales/ru/translations.json b/packages/i18n/src/locales/ru/translations.json new file mode 100644 index 00000000000..9692358bed0 --- /dev/null +++ b/packages/i18n/src/locales/ru/translations.json @@ -0,0 +1,320 @@ +{ + "submit": "Отправить", + "cancel": "Отмена", + "loading": "Загрузка", + "error": "Ошибка", + "success": "Успешно", + "warning": "Предупреждение", + "info": "Информация", + "close": "Закрыть", + "yes": "Да", + "no": "Нет", + "ok": "ОК", + "name": "Название", + "description": "Описание", + "search": "Поиск", + "add_member": "Добавить участника", + "remove_member": "Удалить участника", + "add_members": "Добавить участников", + "remove_members": "Удалить участников", + "add": "Добавить", + "remove": "Удалить", + "add_new": "Добавить новый", + "remove_selected": "Удалить выбранные", + "first_name": "Имя", + "last_name": "Фамилия", + "email": "Эл. почта", + "display_name": "Отображаемое имя", + "role": "Роль", + "timezone": "Часовой пояс", + "avatar": "Аватар", + "cover_image": "Обложка", + "password": "Пароль", + "change_cover": "Изменить обложку", + "language": "Язык", + "saving": "Сохранение...", + "save_changes": "Сохранить изменения", + "deactivate_account": "Деактивировать аккаунт", + "deactivate_account_description": "При деактивации аккаунта все данные и ресурсы будут безвозвратно удалены и не подлежат восстановлению.", + "profile_settings": "Настройки профиля", + "your_account": "Ваш аккаунт", + "profile": "Профиль", + "security": "Безопасность", + "activity": "Активность", + "appearance": "Внешний вид", + "notifications": "Уведомления", + "inbox": "Входящие", + "workspaces": "Рабочие пространства", + "create_workspace": "Создать рабочее пространство", + "invitations": "Приглашения", + "summary": "Сводка", + "assigned": "Назначено", + "created": "Создано", + "subscribed": "Отслеживаемое", + "you_do_not_have_the_permission_to_access_this_page": "У вас нет прав для доступа к этой странице.", + "failed_to_sign_out_please_try_again": "Не удалось выйти из системы. Попробуйте ещё раз.", + "password_changed_successfully": "Пароль успешно изменён.", + "something_went_wrong_please_try_again": "Что-то пошло не так. Попробуйте ещё раз.", + "change_password": "Изменить пароль", + "passwords_dont_match": "Пароли не совпадают", + "current_password": "Текущий пароль", + "new_password": "Новый пароль", + "confirm_password": "Подтверждение пароля", + "this_field_is_required": "Это поле обязательно для заполнения", + "changing_password": "Изменение пароля", + "please_enter_your_password": "Введите ваш пароль.", + "password_length_should_me_more_than_8_characters": "Длина пароля должна быть не менее 8 символов.", + "password_is_weak": "Слабый пароль.", + "password_is_strong": "Надёжный пароль.", + "load_more": "Загрузить ещё", + "select_or_customize_your_interface_color_scheme": "Выберите или настройте цветовую схему интерфейса.", + "theme": "Тема", + "system_preference": "Системная", + "light": "Светлая", + "dark": "Тёмная", + "light_contrast": "Светлая с высокой контрастностью", + "dark_contrast": "Тёмная с высокой контрастностью", + "custom": "Пользовательская тема", + "select_your_theme": "Выберите тему", + "customize_your_theme": "Настройте свою тему", + "background_color": "Цвет фона", + "text_color": "Цвет текста", + "primary_color": "Основной цвет (тема)", + "sidebar_background_color": "Цвет фона боковой панели", + "sidebar_text_color": "Цвет текста боковой панели", + "set_theme": "Применить тему", + "enter_a_valid_hex_code_of_6_characters": "Введите корректный HEX-код из 6 символов", + "background_color_is_required": "Цвет фона обязателен", + "text_color_is_required": "Цвет текста обязателен", + "primary_color_is_required": "Основной цвет обязателен", + "sidebar_background_color_is_required": "Цвет фона боковой панели обязателен", + "sidebar_text_color_is_required": "Цвет текста боковой панели обязателен", + "updating_theme": "Обновление темы", + "theme_updated_successfully": "Тема успешно обновлена", + "failed_to_update_the_theme": "Не удалось обновить тему", + "email_notifications": "Email-уведомления", + "stay_in_the_loop_on_issues_you_are_subscribed_to_enable_this_to_get_notified": "Получайте обновления по задачам, на которые вы подписаны. Включите, чтобы получать уведомления.", + "email_notification_setting_updated_successfully": "Настройки email-уведомлений успешно обновлены", + "failed_to_update_email_notification_setting": "Не удалось обновить настройки email-уведомлений", + "notify_me_when": "Уведомлять меня когда", + "property_changes": "Изменения свойств", + "property_changes_description": "Уведомлять при изменении свойств задачи: исполнителей, приоритета, оценки и других.", + "state_change": "Изменение статуса", + "state_change_description": "Уведомлять при переходе задачи в другой статус", + "issue_completed": "Задача завершена", + "issue_completed_description": "Уведомлять только при завершении задачи", + "comments": "Комментарии", + "comments_description": "Уведомлять при добавлении комментария к задаче", + "mentions": "Упоминания", + "mentions_description": "Уведомлять только при упоминании меня в комментариях или описании", + "create_your_workspace": "Создайте своё рабочее пространство", + "only_your_instance_admin_can_create_workspaces": "Только администратор вашего экземпляра может создавать рабочие пространства", + "only_your_instance_admin_can_create_workspaces_description": "Если вы знаете email администратора, нажмите кнопку ниже для связи с ним.", + "go_back": "Назад", + "request_instance_admin": "Запросить у администратора", + "plane_logo": "Логотип Plane", + "workspace_creation_disabled": "Создание рабочих пространств отключено", + "workspace_request_subject": "Запрос нового рабочего пространства", + "workspace_request_body": "Здравствуйте,\n\nПрошу создать новое рабочее пространство с URL [/название-пространства] для [цель создания].\n\nС уважением,\n{{firstName}} {{lastName}}\n{{email}}", + "creating_workspace": "Создание рабочего пространства", + "workspace_created_successfully": "Рабочее пространство успешно создано", + "create_workspace_page": "Страница создания рабочего пространства", + "workspace_could_not_be_created_please_try_again": "Не удалось создать рабочее пространство. Попробуйте ещё раз.", + "workspace_could_not_be_created_please_try_again_description": "При создании рабочего пространства произошла ошибка. Попробуйте ещё раз.", + "this_is_a_required_field": "Это обязательное поле.", + "name_your_workspace": "Назовите рабочее пространство", + "workspaces_names_can_contain_only_space_dash_and_alphanumeric_characters": "Название может содержать только пробелы (' '), дефисы ('-'), подчёркивания ('_') и буквенно-цифровые символы.", + "limit_your_name_to_80_characters": "Ограничьте название до 80 символов.", + "set_your_workspace_url": "Задайте URL вашего рабочего пространства", + "limit_your_url_to_48_characters": "Ограничьте URL до 48 символов.", + "how_many_people_will_use_this_workspace": "Сколько человек будут использовать это пространство?", + "how_many_people_will_use_this_workspace_description": "Это поможет нам определить необходимое количество мест.", + "select_a_range": "Выберите диапазон", + "urls_can_contain_only_dash_and_alphanumeric_characters": "URL может содержать только дефисы ('-') и буквенно-цифровые символы.", + "something_familiar_and_recognizable_is_always_best": "Знакомое и узнаваемое название — всегда лучший выбор.", + "workspace_url_is_already_taken": "Этот URL уже занят!", + "old_password": "Старый пароль", + "general_settings": "Общие настройки", + "sign_out": "Выйти", + "signing_out": "Выход...", + "active_cycles": "Активные циклы", + "active_cycles_description": "Отслеживайте циклы по проектам, контролируйте приоритетные задачи и фокусируйтесь на циклах, требующих внимания.", + "on_demand_snapshots_of_all_your_cycles": "Снимки всех ваших циклов по запросу", + "upgrade": "Обновить", + "10000_feet_view": "Обзор всех активных циклов с высоты птичьего полёта.", + "10000_feet_view_description": "Смотрите на все текущие циклы во всех проектах сразу, не переходя между ними.", + "get_snapshot_of_each_active_cycle": "Получайте снимок каждого активного цикла.", + "get_snapshot_of_each_active_cycle_description": "Отслеживайте ключевые метрики всех активных циклов, их прогресс и объём работ относительно дедлайнов.", + "compare_burndowns": "Сравнивайте графики сгорания.", + "compare_burndowns_description": "Следите за производительностью команд с помощью просмотра графика сгорания каждого цикла.", + "quickly_see_make_or_break_issues": "Быстро выявляйте критические задачи.", + "quickly_see_make_or_break_issues_description": "Просматривайте приоритетные задачи каждого цикла с учётом сроков. Все задачи цикла — в один клик.", + "zoom_into_cycles_that_need_attention": "Детальный просмотр проблемных циклов.", + "zoom_into_cycles_that_need_attention_description": "Изучите состояние любого цикла, не соответствующего ожиданиям, одним кликом.", + "stay_ahead_of_blockers": "Опережайте блокеры.", + "stay_ahead_of_blockers_description": "Обнаруживайте проблемы между проектами и межцикловые зависимости, незаметные из других представлений.", + "analytics": "Аналитика", + "workspace_invites": "Приглашения в пространство", + "workspace_settings": "Настройки пространства", + "enter_god_mode": "Режим администратора", + "workspace_logo": "Логотип пространства", + "new_issue": "Новая задача", + "home": "Главная", + "your_work": "Моя работа", + "drafts": "Черновики", + "projects": "Проекты", + "views": "Представления", + "workspace": "Рабочее пространство", + "archives": "Архивы", + "settings": "Настройки", + "failed_to_move_favorite": "Не удалось переместить избранное", + "your_favorites": "Избранное", + "no_favorites_yet": "Пока нет избранного", + "create_folder": "Создать папку", + "new_folder": "Новая папка", + "favorite_updated_successfully": "Избранное успешно обновлено", + "favorite_created_successfully": "Избранное успешно добавлено", + "folder_already_exists": "Папка уже существует", + "folder_name_cannot_be_empty": "Название папки не может быть пустым", + "something_went_wrong": "Что-то пошло не так", + "failed_to_reorder_favorite": "Не удалось изменить порядок избранного", + "favorite_removed_successfully": "Из избранного удалено", + "failed_to_create_favorite": "Не удалось добавить в избранное", + "failed_to_rename_favorite": "Не удалось переименовать избранное", + "project_link_copied_to_clipboard": "Ссылка на проект скопирована в буфер обмена", + "link_copied": "Ссылка скопирована", + "your_projects": "Мои проекты", + "add_project": "Добавить проект", + "create_project": "Создать проект", + "failed_to_remove_project_from_favorites": "Не удалось удалить проект из избранного. Попробуйте ещё раз.", + "project_created_successfully": "Проект успешно создан", + "project_created_successfully_description": "Проект успешно создан. Теперь вы можете добавлять в него задачи.", + "project_cover_image_alt": "Обложка проекта", + "name_is_required": "Название обязательно", + "title_should_be_less_than_255_characters": "Заголовок должен быть не длиннее 255 символов", + "project_name": "Название проекта", + "project_id_must_be_at_least_1_character": "ID проекта должен содержать не менее 1 символа", + "project_id_must_be_at_most_5_characters": "ID проекта должен содержать не более 5 символов", + "project_id": "ID проекта", + "project_id_tooltip_content": "Помогает уникально идентифицировать задачи в проекте. Максимум 5 символов.", + "description_placeholder": "Описание...", + "only_alphanumeric_non_latin_characters_allowed": "Допускаются только буквенно-цифровые и не-латинские символы.", + "project_id_is_required": "ID проекта обязателен", + "select_network": "Выберите доступность", + "lead": "Ответственный", + "private": "Приватный", + "public": "Публичный", + "accessible_only_by_invite": "Доступно только по приглашению", + "anyone_in_the_workspace_except_guests_can_join": "Все участники пространства, кроме гостей, могут вступить", + "creating": "Создание", + "creating_project": "Создание проекта", + "adding_project_to_favorites": "Добавление проекта в избранное", + "project_added_to_favorites": "Проект добавлен в избранное", + "couldnt_add_the_project_to_favorites": "Не удалось добавить проект в избранное. Попробуйте ещё раз.", + "removing_project_from_favorites": "Удаление проекта из избранного", + "project_removed_from_favorites": "Проект удалён из избранного", + "couldnt_remove_the_project_from_favorites": "Не удалось удалить проект из избранного. Попробуйте ещё раз.", + "add_to_favorites": "Добавить в избранное", + "remove_from_favorites": "Удалить из избранного", + "publish_settings": "Настройки публикации", + "publish": "Опубликовать", + "copy_link": "Скопировать ссылку", + "leave_project": "Покинуть проект", + "join_the_project_to_rearrange": "Вступите в проект для изменения порядка", + "drag_to_rearrange": "Перетащите для сортировки", + "congrats": "Поздравляем!", + "project": "Проект", + "open_project": "Открыть проект", + "issues": "Задачи", + "cycles": "Циклы", + "modules": "Модули", + "pages": "Страницы", + "intake": "Входящие задачи", + "time_tracking": "Учёт времени", + "work_management": "Управление работой", + "projects_and_issues": "Проекты и задачи", + "projects_and_issues_description": "Включите или отключите для этого проекта.", + "cycles_description": "Разбивайте работу на временные отрезки в удобном ритме и меняйте период от цикла к циклу.", + "modules_description": "Группируйте работу в подпроекты со своими ответственными и исполнителями.", + "views_description": "Сохраняйте фильтры, сортировку и параметры отображения для последующего использования или обмена.", + "pages_description": "Пишите что угодно — как обычный текстовый редактор.", + "intake_description": "Отслеживайте задачи, на которые вы подписаны. Включите, чтобы получать уведомления.", + "time_tracking_description": "Учитывайте время, потраченное на задачи и проекты.", + "work_management_description": "Управляйте своей работой и проектами с лёгкостью.", + "documentation": "Документация", + "message_support": "Написать в поддержку", + "contact_sales": "Связаться с отделом продаж", + "hyper_mode": "Режим Hyper", + "keyboard_shortcuts": "Горячие клавиши", + "whats_new": "Что нового?", + "version": "Версия", + "we_are_having_trouble_fetching_the_updates": "Не удаётся загрузить обновления.", + "our_changelogs": "наш журнал изменений", + "for_the_latest_updates": "для последних обновлений.", + "please_visit": "Пожалуйста, посетите", + "docs": "Документация", + "full_changelog": "Полный журнал изменений", + "support": "Поддержка", + "discord": "Discord", + "powered_by_plane_pages": "Создано на Plane Pages", + "please_select_at_least_one_invitation": "Выберите хотя бы одно приглашение.", + "please_select_at_least_one_invitation_description": "Выберите хотя бы одно приглашение для вступления в рабочее пространство.", + "we_see_that_someone_has_invited_you_to_join_a_workspace": "Вас пригласили вступить в рабочее пространство", + "join_a_workspace": "Вступить в рабочее пространство", + "we_see_that_someone_has_invited_you_to_join_a_workspace_description": "Вас пригласили вступить в рабочее пространство", + "join_a_workspace_description": "Вступить в рабочее пространство", + "accept_and_join": "Принять и вступить", + "go_home": "На главную", + "no_pending_invites": "Нет ожидающих приглашений", + "you_can_see_here_if_someone_invites_you_to_a_workspace": "Здесь появятся приглашения в рабочие пространства", + "back_to_home": "Вернуться на главную", + "workspace_name": "название-пространства", + "deactivate_your_account": "Деактивировать аккаунт", + "deactivate_your_account_description": "После деактивации вам нельзя будет назначать задачи, а оплата за пространство прекратится. Для повторной активации потребуется приглашение на этот email.", + "deactivating": "Деактивация", + "confirm": "Подтвердить", + "draft_created": "Черновик создан", + "issue_created_successfully": "Задача успешно создана", + "draft_creation_failed": "Не удалось создать черновик", + "issue_creation_failed": "Не удалось создать задачу", + "draft_issue": "Черновик задачи", + "issue_updated_successfully": "Задача успешно обновлена", + "issue_could_not_be_updated": "Не удалось обновить задачу", + "create_a_draft": "Создать черновик", + "save_to_drafts": "Сохранить в черновики", + "save": "Сохранить", + "update": "Обновить", + "updating": "Обновление", + "create_new_issue": "Создать новую задачу", + "editor_is_not_ready_to_discard_changes": "Редактор не готов к отмене изменений", + "failed_to_move_issue_to_project": "Не удалось перенести задачу в проект", + "create_more": "Создать ещё", + "add_to_project": "Добавить в проект", + "discard": "Отменить", + "duplicate_issue_found": "Найден дубликат задачи", + "duplicate_issues_found": "Найдены дубликаты задач", + "no_matching_results": "Ничего не найдено", + "title_is_required": "Заголовок обязателен", + "title": "Заголовок", + "state": "Статус", + "priority": "Приоритет", + "none": "Нет", + "urgent": "Срочный", + "high": "Высокий", + "medium": "Средний", + "low": "Низкий", + "members": "Участники", + "assignee": "Исполнитель", + "assignees": "Исполнители", + "you": "Вы", + "labels": "Метки", + "create_new_label": "Создать метку", + "start_date": "Дата начала", + "due_date": "Срок выполнения", + "cycle": "Цикл", + "estimate": "Оценка", + "change_parent_issue": "Изменить родительскую задачу", + "remove_parent_issue": "Удалить родительскую задачу", + "add_parent": "Добавить родительскую", + "loading_members": "Загрузка участников..." +} diff --git a/packages/i18n/src/store/index.ts b/packages/i18n/src/store/index.ts index d5bd3e598d6..d41eb92de47 100644 --- a/packages/i18n/src/store/index.ts +++ b/packages/i18n/src/store/index.ts @@ -40,6 +40,7 @@ export class TranslationStore { es: (await import("../locales/es/translations.json")).default, ja: (await import("../locales/ja/translations.json")).default, "zh-CN": (await import("../locales/zh-CN/translations.json")).default, + ru: (await import("../locales/ru/translations.json")).default, }; this.translations = translations; this.messageCache.clear(); // Clear cache when translations change