feat: Complete internationalization and code cleanup

## Translation Files
- Add 11 new language files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ missing translation keys across all 15 languages
- New sections: notebook, pagination, ai.batchOrganization, ai.autoLabels
- Update nav section with workspace, quickAccess, myLibrary keys

## Component Updates
- Update 15+ components to use translation keys instead of hardcoded text
- Components: notebook dialogs, sidebar, header, note-input, ghost-tags, etc.
- Replace 80+ hardcoded English/French strings with t() calls
- Ensure consistent UI across all supported languages

## Code Quality
- Remove 77+ console.log statements from codebase
- Clean up API routes, components, hooks, and services
- Keep only essential error handling (no debugging logs)

## UI/UX Improvements
- Update Keep logo to yellow post-it style (from-yellow-400 to-amber-500)
- Change selection colors to #FEF3C6 (notebooks) and #EFB162 (nav items)
- Make "+" button permanently visible in notebooks section
- Fix grammar and syntax errors in multiple components

## Bug Fixes
- Fix JSON syntax errors in it.json, nl.json, pl.json, zh.json
- Fix syntax errors in notebook-suggestion-toast.tsx
- Fix syntax errors in use-auto-tagging.ts
- Fix syntax errors in paragraph-refactor.service.ts
- Fix duplicate "fusion" section in nl.json

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

Ou une version plus courte si vous préférez :

feat(i18n): Add 15 languages, remove logs, update UI components

- Create 11 new translation files (es, de, pt, ru, zh, ja, ko, ar, hi, nl, pl)
- Add 100+ translation keys: notebook, pagination, AI features
- Update 15+ components to use translations (80+ strings)
- Remove 77+ console.log statements from codebase
- Fix JSON syntax errors in 4 translation files
- Fix component syntax errors (toast, hooks, services)
- Update logo to yellow post-it style
- Change selection colors (#FEF3C6, #EFB162)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-11 22:26:13 +01:00
parent fc2c40249e
commit 7fb486c9a4
183 changed files with 48288 additions and 1290 deletions

511
keep-notes/locales/ru.json Normal file
View File

@@ -0,0 +1,511 @@
{
"auth": {
"signIn": "Войти",
"signUp": "Зарегистрироваться",
"email": "Эл. почта",
"password": "Пароль",
"name": "Имя",
"emailPlaceholder": "Введите адрес электронной почты",
"passwordPlaceholder": "Введите пароль",
"namePlaceholder": "Введите ваше имя",
"passwordMinChars": "Введите пароль (минимум 6 символов)",
"resetPassword": "Сбросить пароль",
"resetPasswordInstructions": "Введите вашу почту для сброса пароля",
"forgotPassword": "Забыли пароль?",
"noAccount": "Нет аккаунта?",
"hasAccount": "Уже есть аккаунт?",
"signInToAccount": "Войдите в свой аккаунт",
"createAccount": "Создайте свой аккаунт",
"rememberMe": "Запомнить меня",
"orContinueWith": "Или продолжить с",
"checkYourEmail": "Проверьте вашу почту",
"resetEmailSent": "Мы отправили ссылку для сброса пароля на вашу почту, если она существует в нашей системе.",
"returnToLogin": "Вернуться ко входу",
"forgotPasswordTitle": "Забыли пароль",
"forgotPasswordDescription": "Введите адрес электронной почты, и мы отправим вам ссылку для сброса пароля.",
"sending": "Отправка...",
"sendResetLink": "Отправить ссылку для сброса",
"backToLogin": "Вернуться ко входу"
},
"notes": {
"title": "Заметки",
"newNote": "Новая заметка",
"untitled": "Без названия",
"placeholder": "Сделайте заметку...",
"markdownPlaceholder": "Сделайте заметку... (Поддерживается Markdown)",
"titlePlaceholder": "Заголовок",
"listItem": "Элемент списка",
"addListItem": "+ Элемент списка",
"newChecklist": "Новый контрольный список",
"add": "Добавить",
"adding": "Добавление...",
"close": "Закрыть",
"confirmDelete": "Вы уверены, что хотите удалить эту заметку?",
"confirmLeaveShare": "Вы уверены, что хотите покинуть эту общую заметку?",
"sharedBy": "Поделился",
"leaveShare": "Покинуть",
"delete": "Удалить",
"archive": "Архивировать",
"unarchive": "Разархивировать",
"pin": "Закрепить",
"unpin": "Открепить",
"color": "Цвет",
"changeColor": "Изменить цвет",
"setReminder": "Установить напоминание",
"setReminderButton": "Установить напоминание",
"date": "Дата",
"time": "Время",
"reminderDateTimeRequired": "Пожалуйста, введите дату и время",
"invalidDateTime": "Недействительная дата или время",
"reminderMustBeFuture": "Напоминание должно быть в будущем",
"reminderSet": "Напоминание установлено на {datetime}",
"reminderPastError": "Напоминание должно быть в будущем",
"reminderRemoved": "Напоминание удалено",
"addImage": "Добавить изображение",
"addLink": "Добавить ссылку",
"linkAdded": "Ссылка добавлена",
"linkMetadataFailed": "Не удалось получить метаданные ссылки",
"linkAddFailed": "Не удалось добавить ссылку",
"invalidFileType": "Недопустимый тип файла: {fileName}. Разрешены только JPEG, PNG, GIF и WebP.",
"fileTooLarge": "Файл слишком большой: {fileName}. Максимальный размер - {maxSize}.",
"uploadFailed": "Не удалось загрузить {filename}",
"contentOrMediaRequired": "Пожалуйста, введите содержимое или добавьте ссылку/изображение",
"itemOrMediaRequired": "Пожалуйста, добавьте хотя бы один элемент или медиа",
"noteCreated": "Заметка успешно создана",
"noteCreateFailed": "Не удалось создать заметку",
"aiAssistant": "ИИ-помощник",
"changeSize": "Изменить размер",
"backgroundOptions": "Параметры фона",
"moreOptions": "Больше параметров",
"remindMe": "Напомнить мне",
"markdownMode": "Markdown",
"addCollaborators": "Добавить соавторов",
"duplicate": "Дублировать",
"share": "Поделиться",
"showCollaborators": "Показать соавторов",
"pinned": "Закреплённые",
"others": "Другие",
"noNotes": "Нет заметок",
"noNotesFound": "Заметки не найдены",
"createFirstNote": "Создайте свою первую заметку",
"size": "Размер",
"small": "Маленький",
"medium": "Средний",
"large": "Большой",
"shareWithCollaborators": "Поделиться с соавторами",
"view": "Просмотреть заметку",
"edit": "Редактировать заметку",
"readOnly": "Только чтение",
"preview": "Предпросмотр",
"noContent": "Нет содержимого",
"takeNote": "Сделайте заметку...",
"takeNoteMarkdown": "Сделайте заметку... (Поддерживается Markdown)",
"addItem": "Добавить элемент",
"sharedReadOnly": "Эта заметка предоставлена вам в режиме только для чтения",
"makeCopy": "Сделать копию",
"saving": "Сохранение...",
"copySuccess": "Заметка успешно скопирована!",
"copyFailed": "Не удалось скопировать заметку",
"copy": "Копировать",
"markdownOn": "Markdown ВКЛ",
"markdownOff": "Markdown ВЫКЛ",
"undo": "Отменить (Ctrl+Z)",
"redo": "Повторить (Ctrl+Y)"
},
"pagination": {
"previous": "←",
"pageInfo": "Страница {currentPage} / {totalPages}",
"next": "→"
},
"labels": {
"title": "Метки",
"filter": "Фильтр по метке",
"manage": "Управление метками",
"manageTooltip": "Управление метками",
"changeColor": "Изменить цвет",
"changeColorTooltip": "Изменить цвет",
"delete": "Удалить",
"deleteTooltip": "Удалить метку",
"confirmDelete": "Вы уверены, что хотите удалить эту метку?",
"newLabelPlaceholder": "Создать новую метку",
"namePlaceholder": "Введите название метки",
"addLabel": "Добавить метку",
"createLabel": "Создать метку",
"labelName": "Название метки",
"labelColor": "Цвет метки",
"manageLabels": "Управление метками",
"manageLabelsDescription": "Добавьте или удалите метки для этой заметки. Нажмите на метку, чтобы изменить её цвет.",
"selectedLabels": "Выбранные метки",
"allLabels": "Все метки",
"clearAll": "Очистить всё",
"filterByLabel": "Фильтр по метке",
"tagAdded": "Тег \"{tag}\" добавлен",
"showLess": "Показать меньше",
"showMore": "Показать больше",
"editLabels": "Редактировать метки",
"editLabelsDescription": "Создавайте, редактируйте цвета или удаляйте метки.",
"noLabelsFound": "Метки не найдены.",
"loading": "Загрузка...",
"notebookRequired": "⚠️ Метки доступны только в блокнотах. Сначала переместите эту заметку в блокнот."
},
"search": {
"placeholder": "Поиск",
"searchPlaceholder": "Поиск в заметках...",
"semanticInProgress": "ИИ-поиск...",
"semanticTooltip": "Семантический поиск с ИИ",
"searching": "Поиск...",
"noResults": "Результаты не найдены",
"resultsFound": "Найдено заметок: {count}",
"exactMatch": "Точное совпадение",
"related": "Связанные"
},
"collaboration": {
"emailPlaceholder": "Введите адрес электронной почты",
"addCollaborator": "Добавить соавтора",
"removeCollaborator": "Удалить соавтора",
"owner": "Владелец",
"canEdit": "Может редактировать",
"canView": "Может просматривать",
"shareNote": "Поделиться заметкой",
"shareWithCollaborators": "Поделиться с соавторами",
"addCollaboratorDescription": "Добавьте людей для совместной работы над этой заметкой по их адресу электронной почты.",
"viewerDescription": "У вас есть доступ к этой заметке. Только владелец может управлять соавторами.",
"emailAddress": "Адрес электронной почты",
"enterEmailAddress": "Введите адрес электронной почты",
"invite": "Пригласить",
"peopleWithAccess": "Люди с доступом",
"noCollaborators": "Соавторов пока нет. Добавьте кого-нибудь выше!",
"noCollaboratorsViewer": "Соавторов пока нет.",
"pendingInvite": "Ожидающее приглашение",
"pending": "Ожидает",
"remove": "Удалить",
"unnamedUser": "Безымянный пользователь",
"done": "Готово",
"willBeAdded": "{email} будет добавлен как соавтор при создании заметки",
"alreadyInList": "Этот адрес уже в списке",
"nowHasAccess": "{name} теперь имеет доступ к этой заметке",
"accessRevoked": "Доступ был отозван",
"errorLoading": "Ошибка загрузки соавторов",
"failedToAdd": "Не удалось добавить соавтора",
"failedToRemove": "Не удалось удалить соавтора"
},
"ai": {
"analyzing": "ИИ анализирует...",
"clickToAddTag": "Нажмите, чтобы добавить этот тег",
"ignoreSuggestion": "Игнорировать это предложение",
"generatingTitles": "Генерация заголовков...",
"generateTitlesTooltip": "Генерировать заголовки с помощью ИИ",
"poweredByAI": "Работает на ИИ",
"languageDetected": "Язык обнаружен",
"processing": "Обработка...",
"tagAdded": "Тег \"{tag}\" добавлен",
"titleGenerating": "Генерация...",
"titleGenerateWithAI": "Генерировать заголовки с помощью ИИ",
"titleGenerationMinWords": "Содержимое должно содержать минимум 10 слов для генерации заголовков (текущее: {count} слов)",
"titleGenerationError": "Ошибка при генерации заголовков",
"titlesGenerated": "💡 Сгенерировано заголовков: {count}!",
"titleGenerationFailed": "Не удалось сгенерировать заголовки",
"titleApplied": "Заголовок применён!",
"reformulationNoText": "Пожалуйста, выделите текст или добавьте содержимое",
"reformulationSelectionTooShort": "Выделение слишком короткое, используется полное содержимое",
"reformulationMinWords": "Текст должен содержать минимум 10 слов (текущее: {count} слов)",
"reformulationMaxWords": "Текст должен содержать максимум 500 слов",
"reformulationError": "Ошибка при реформулировании",
"reformulationFailed": "Не удалось реформулировать текст",
"reformulationApplied": "Реформулированный текст применён!",
"transformMarkdown": "Преобразовать в Markdown",
"transforming": "Преобразование...",
"transformSuccess": "Текст успешно преобразован в Markdown!",
"transformError": "Ошибка при преобразовании",
"assistant": "ИИ-помощник",
"generating": "Генерация...",
"generateTitles": "Генерировать заголовки",
"reformulateText": "Реформулировать текст",
"reformulating": "Реформирование...",
"clarify": "Уточнить",
"shorten": "Сократить",
"improveStyle": "Улучшить стиль",
"reformulationComparison": "Сравнение реформулирования",
"original": "Оригинал",
"reformulated": "Реформулировано"
},
"batchOrganization": {
"error": "Не удалось создать план организации",
"noNotesSelected": "Нет выбранных заметок",
"title": "Организовать с ИИ",
"description": "ИИ проанализирует ваши заметки и предложит организовать их в блокноты.",
"analyzing": "Анализ ваших заметок...",
"notesToOrganize": "{count} заметок для организации",
"selected": "{count} выбрано",
"noNotebooks": "Нет доступных блокнотов. Создайте сначала блокноты для организации ваших заметок.",
"noSuggestions": "ИИ не нашел хорошего способа организации этих заметок.",
"confidence": "уверенность",
"unorganized": "{count} заметок не удалось категоризовать и останутся в общих заметках.",
"applying": "Применение...",
"apply": "Применить ({count})"
},
"autoLabels": {
"error": "Не удалось получить предложения меток",
"noLabelsSelected": "Меток не выбраны",
"created": "Меток успешно создано: {count}",
"analyzing": "Анализ ваших заметок...",
"title": "Новые предложения меток",
"description": "Я обнаружил повторяющиеся темы в \"{notebookName}\" ({totalNotes} заметок). Создать метки для них?",
"note": "заметка",
"notes": "заметки",
"typeContent": "Введите контент для получения предложений меток...",
"createNewLabel": "Создать эту новую метку и добавить ее",
"new": "(новая)"
},
"titleSuggestions": {
"available": "Предложения заголовков",
"title": "Предложения ИИ",
"generating": "Генерация...",
"selectTitle": "Выберите заголовок",
"dismiss": "Отклонить"
},
"semanticSearch": {
"exactMatch": "Точное совпадение",
"related": "Связанные",
"searching": "Поиск..."
},
"paragraphRefactor": {
"title": "Улучшение текста",
"shorten": "Сократить",
"expand": "Расширить",
"improve": "Улучшить",
"formal": "Формальный",
"casual": "Непринуждённый"
},
"memoryEcho": {
"title": "Я заметил что-то...",
"description": "Проактивные связи между вашими заметками",
"dailyInsight": "Ежедневные идеи из ваших заметок",
"insightReady": "Ваша идея готова!",
"viewConnection": "Просмотреть связь",
"helpful": "Полезно",
"notHelpful": "Не полезно",
"dismiss": "Отклонить пока",
"thanksFeedback": "Спасибо за ваш отзыв!",
"thanksFeedbackImproving": "Спасибо! Мы используем это для улучшения.",
"connections": "Связи",
"connection": "связь",
"connectionsBadge": "{count} связь{plural}",
"fused": "Объединено",
"overlay": {
"title": "Связанные заметки",
"searchPlaceholder": "Поиск связей...",
"sortBy": "Сортировать по:",
"sortSimilarity": "Сходство",
"sortRecent": "Недавние",
"sortOldest": "Старые",
"viewAll": "Просмотреть все рядом",
"loading": "Загрузка...",
"noConnections": "Связи не найдены"
},
"comparison": {
"title": "💡 Сравнение заметок",
"similarityInfo": "Эти заметки связаны на {similarity}% сходства",
"highSimilarityInsight": "Эти заметки посвящены одной теме с высокой степенью сходства. Они могут быть объединены или консолидированы.",
"untitled": "Без названия",
"clickToView": "Нажмите, чтобы просмотреть заметку",
"helpfulQuestion": "Это сравнение полезно?",
"helpful": "Полезно",
"notHelpful": "Не полезно"
},
"editorSection": {
"title": "⚡ Связанные заметки ({count})",
"loading": "Загрузка...",
"view": "Просмотреть",
"compare": "Сравнить",
"merge": "Объединить",
"compareAll": "Сравнить все",
"mergeAll": "Объединить все"
},
"fusion": {
"title": "🔗 Интеллектуальное объединение",
"mergeNotes": "Объединить {count} заметок(и)",
"notesToMerge": "📝 Заметки для объединения",
"optionalPrompt": "💬 Запрос объединения (необязательно)",
"promptPlaceholder": "Дополнительные инструкции для ИИ (например, 'Сохранить формальный стиль заметки 1')...",
"generateFusion": "Сгенерировать объединение",
"generating": "Генерация...",
"previewTitle": "📝 Предпросмотр объединённой заметки",
"edit": "Редактировать",
"modify": "Изменить",
"finishEditing": "Завершить редактирование",
"optionsTitle": "Параметры объединения",
"archiveOriginals": "Архивировать оригинальные заметки",
"keepAllTags": "Сохранить все теги",
"useLatestTitle": "Использовать последнюю заметку как заголовок",
"createBacklinks": "Создать обратную ссылку на оригинальные заметки",
"cancel": "Отмена",
"confirmFusion": "Подтвердить объединение",
"success": "Заметки успешно объединены!",
"error": "Не удалось объединить заметки",
"generateError": "Не удалось сгенерировать объединение",
"noContentReturned": "API не вернул контент объединения",
"unknownDate": "Неизвестная дата"
}
},
"nav": {
"home": "Главная",
"notes": "Заметки",
"notebooks": "Блокноты",
"generalNotes": "Общие заметки",
"archive": "Архив",
"settings": "Настройки",
"profile": "Профиль",
"aiSettings": "Настройки ИИ",
"logout": "Выйти",
"login": "Войти",
"adminDashboard": "Панель администратора",
"diagnostics": "Диагностика",
"trash": "Корзина",
"support": "Поддержать Memento ☕",
"reminders": "Напоминания",
"userManagement": "Управление пользователями",
"accountSettings": "Настройки аккаунта",
"manageAISettings": "Управление настройками ИИ",
"configureAI": "Настройте функции на базе ИИ, провайдера и предпочтения",
"supportDevelopment": "Поддержать разработку Memento ☕",
"supportDescription": "Memento на 100% бесплатен и открыт. Ваша поддержка помогает сохранить это.",
"buyMeACoffee": "Купить мне кофе",
"donationDescription": "Сделайте единовременное пожертвование или станьте ежемесячным сторонником.",
"donateOnKofi": "Пожертвовать на Ko-fi",
"donationNote": "Без комиссий платформы • Мгновенные выплаты • Безопасно",
"sponsorOnGithub": "Спонсорировать на GitHub",
"sponsorDescription": "Станьте ежемесячным спонсором и получите признание.",
"workspace": "Рабочее пространство",
"quickAccess": "Быстрый доступ",
"myLibrary": "Моя библиотека",
"favorites": "Избранное",
"recent": "Недавние",
"proPlan": "Про-план"
},
"settings": {
"title": "Настройки",
"description": "Управление настройками и предпочтениями",
"account": "Аккаунт",
"appearance": "Внешний вид",
"theme": "Тема",
"themeLight": "Светлая",
"themeDark": "Тёмная",
"themeSystem": "Системная",
"notifications": "Уведомления",
"language": "Язык",
"selectLanguage": "Выбрать язык",
"privacy": "Конфиденциальность",
"security": "Безопасность",
"about": "О программе",
"version": "Версия",
"settingsSaved": "Настройки сохранены",
"settingsError": "Ошибка сохранения настроек"
},
"profile": {
"title": "Профиль",
"description": "Обновите вашу личную информацию",
"displayName": "Отображаемое имя",
"email": "Эл. почта",
"changePassword": "Изменить пароль",
"changePasswordDescription": "Обновите ваш пароль. Вам понадобится ваш текущий пароль.",
"currentPassword": "Текущий пароль",
"newPassword": "Новый пароль",
"confirmPassword": "Подтвердите пароль",
"updatePassword": "Обновить пароль",
"passwordChangeSuccess": "Пароль успешно изменён",
"passwordChangeFailed": "Не удалось изменить пароль",
"passwordUpdated": "Пароль обновлён",
"passwordError": "Ошибка обновления пароля",
"languagePreferences": "Языковые предпочтения",
"languagePreferencesDescription": "Выберите предпочитаемый язык для функций ИИ и интерфейса.",
"preferredLanguage": "Предпочитаемый язык",
"selectLanguage": "Выберите язык",
"languageDescription": "Этот язык будет использоваться для функций на базе ИИ, анализа содержимого и текста интерфейса.",
"autoDetect": "Автоопределение",
"updateSuccess": "Профиль обновлён",
"updateFailed": "Не удалось обновить профиль",
"languageUpdateSuccess": "Язык успешно обновлён",
"languageUpdateFailed": "Не удалось обновить язык",
"profileUpdated": "Профиль обновлён",
"profileError": "Ошибка обновления профиля",
"accountSettings": "Настройки аккаунта",
"manageAISettings": "Управление настройками ИИ",
"displaySettings": "Настройки отображения",
"displaySettingsDescription": "Настройте внешний вид и размер шрифта.",
"fontSize": "Размер шрифта",
"selectFontSize": "Выбрать размер шрифта",
"fontSizeSmall": "Маленький",
"fontSizeMedium": "Средний",
"fontSizeLarge": "Большой",
"fontSizeExtraLarge": "Очень большой",
"fontSizeDescription": "Настройте размер шрифта для лучшей читаемости. Это применяется ко всему тексту интерфейса.",
"fontSizeUpdateSuccess": "Размер шрифта успешно обновлён",
"fontSizeUpdateFailed": "Не удалось обновить размер шрифта"
},
"aiSettings": {
"title": "Настройки ИИ",
"description": "Настройте функции и предпочтения на базе ИИ",
"features": "Функции ИИ",
"provider": "Провайдер ИИ",
"providerAuto": "Авто (Рекомендуется)",
"providerOllama": "Ollama (Локальный)",
"providerOpenAI": "OpenAI (Облачный)",
"frequency": "Частота",
"frequencyDaily": "Ежедневно",
"frequencyWeekly": "Еженедельно",
"saving": "Сохранение...",
"saved": "Настройка обновлена",
"error": "Не удалось обновить настройку"
},
"general": {
"loading": "Загрузка...",
"save": "Сохранить",
"cancel": "Отмена",
"add": "Добавить",
"edit": "Редактировать",
"confirm": "Подтвердить",
"close": "Закрыть",
"back": "Назад",
"next": "Далее",
"previous": "Назад",
"submit": "Отправить",
"reset": "Сбросить",
"apply": "Применить",
"clear": "Очистить",
"select": "Выбрать",
"tryAgain": "Пожалуйста, попробуйте снова",
"error": "Произошла ошибка",
"operationSuccess": "Операция успешна",
"operationFailed": "Операция не удалась"
},
"colors": {
"default": "По умолчанию",
"red": "Красный",
"blue": "Синий",
"green": "Зелёный",
"yellow": "Жёлтый",
"purple": "Фиолетовый",
"pink": "Розовый",
"orange": "Оранжевый",
"gray": "Серый"
},
"reminder": {
"title": "Напоминание",
"setReminder": "Установить напоминание",
"removeReminder": "Удалить напоминание",
"reminderDate": "Дата напоминания",
"reminderTime": "Время напоминания",
"save": "Установить напоминание",
"cancel": "Отмена"
},
"notebookSuggestion": {
"title": "Переместить в {icon} {name}?",
"description": "Эта заметка, похоже, принадлежит этому блокноту",
"move": "Переместить",
"dismiss": "Отклонить",
"dismissIn": "Отклонить (закроется через {timeLeft}с)",
"moveToNotebook": "Переместить в блокнот",
"generalNotes": "Общие заметки"
}
}