sepehr 7fb486c9a4 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>
2026-01-11 22:26:13 +01:00

512 lines
29 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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": "Общие заметки"
}
}