/
zxclovly
/
BlinkCode
Обзор
Документация
Войти
/
zxclovly
/
BlinkCode
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/utils/i18n.ts
662 строки
38 KB
lovlygod
feat(settings): add toggle for inline git blame
28 апр 2026, 23:45
28 апр 2026, 23:45
3714ded
Код
Авторство
О чём код?
const en: Record<string, string> = { 'logo.text': 'BlinkCode', 'empty.title.blink': 'Blink', 'empty.title.code': 'Code', 'empty.sub': 'Open a file to start coding', 'empty.autosave': 'Ctrl+S auto-saves', 'empty.welcome': 'Welcome to BlinkCode', 'empty.hint': 'Create a file or open a folder to get started', 'common.close': 'Close', 'search.title': 'Search', 'search.placeholder': 'Search', 'search.replacePlaceholder': 'Replace', 'search.regex': 'Use Regular Expression', 'search.matchCase': 'Match Case', 'search.wholeWord': 'Match Whole Word', 'search.include': 'files to include, e.g. src/**/*.ts', 'search.exclude': 'files to exclude, e.g. node_modules,dist', 'search.empty': 'Type to search in workspace', 'search.run': 'Search', 'problems.title': 'Problems', 'problems.all': 'All', 'problems.errors': 'Errors', 'problems.warnings': 'Warnings', 'problems.noProblems': 'No problems detected in workspace', 'search.searching': 'Searching…', 'search.matches': '{0} matches', 'search.truncated': 'Results truncated.', 'search.failed': 'Search failed', 'search.fileNotFound': 'File not found in workspace tree', 'search.replaceAll': 'Replace All', 'search.replaceAllConfirm': 'Replace all matches in workspace?', 'search.replaced': 'Replaced {0} matches', 'search.replaceFailed': 'Replace failed', 'empty.simpleWelcome': 'Welcome to BlinkCode', 'onboarding.title': 'Welcome to BlinkCode', 'onboarding.description': 'BlinkCode helps you quickly open folders, edit project files and work in a focused development workspace.', 'onboarding.section.start': 'Getting started', 'onboarding.section.files': 'Files and editing', 'onboarding.section.interface': 'Interface', 'onboarding.section.workflow': 'Workflow and convenience', 'onboarding.item.startIntro': 'This screen appears when you open BlinkCode for the first time so you can quickly understand how the editor works.', 'onboarding.item.openFolder': 'Use Open to load your project folder into the explorer.', 'onboarding.item.projectTree': 'After opening a folder, the explorer shows your project structure and lets you navigate through files and folders.', 'onboarding.item.editFiles': 'Click any supported file to open and edit it in the code editor.', 'onboarding.item.filesIntro': 'BlinkCode is focused on editing project files directly inside one workspace.', 'onboarding.item.supportedFiles': 'Supported code, config and text files open normally in the editor with syntax highlighting and editing enabled.', 'onboarding.item.unsupported': 'Unsupported files open safely in read-only mode instead of breaking the editor.', 'onboarding.item.logs': 'Log files and plain text files can also be opened directly in the editor.', 'onboarding.item.tabs': 'Opened files stay in tabs at the top, so you can switch between files without losing your current place.', 'onboarding.item.interfaceIntro': 'The interface is organized to keep navigation and editing fast and predictable.', 'onboarding.item.sidebar': 'Use the left activity bar to open or hide the explorer at any time.', 'onboarding.item.activityBar': 'The activity bar stays visible even when the explorer is collapsed, so the workspace is always one click away.', 'onboarding.item.settings': 'Use Settings to configure theme, editor behavior and shortcuts.', 'onboarding.item.ai': 'The AI panel can be opened when needed to help analyze or improve code inside the current workspace.', 'onboarding.item.workflowIntro': 'BlinkCode also keeps common development actions close to the editor so you can stay focused.', 'onboarding.item.autosave': 'Files are saved using the current autosave logic, so edits are preserved without extra manual steps when autosave is enabled.', 'onboarding.item.restore': 'Open tabs, workspace state and some layout preferences can be restored between launches.', 'onboarding.item.shortcuts': 'Keyboard shortcuts are available for common actions such as save, undo, redo, sidebar toggle and more.', 'onboarding.item.themes': 'Themes, color scheme and editor appearance can be adjusted to match your preferred workflow.', 'onboarding.dontShowAgain': "Don't show this help again", 'onboarding.dismissTitle': 'Close this help screen?', 'top.open': 'Open', 'top.terminal': 'Terminal', 'top.ai': 'AI', 'top.settings': 'Settings', 'top.share': 'Share', 'top.sidebar': 'Toggle Sidebar', 'explorer.title': 'EXPLORER', 'explorer.closeFolder': 'Close Folder', 'explorer.filter': 'Filter files...', 'explorer.refresh': 'Refresh', 'explorer.newFile': 'New File', 'explorer.newFolder': 'New Folder', 'sidebar.recentProjects': 'Recent projects', 'ctx.open': 'Open', 'ctx.rename': 'Rename', 'ctx.delete': 'Delete', 'ctx.newFile': 'New File', 'ctx.newFolder': 'New Folder', 'inline.file': 'filename.js', 'inline.folder': 'folder name', 'tab.close': 'Close', 'term.title': 'TERMINAL', 'term.placeholder': 'Type commands...', 'term.reconnect': 'Reconnect', 'term.clear': 'Clear', 'term.close': 'Close panel', 'term.closeTab': 'Close terminal', 'term.newTab': 'New terminal', 'term.tab': 'Terminal', 'ai.title': 'AI Assistant', 'ai.explain': 'Explain code', 'ai.fix': 'Fix error', 'ai.improve': 'Improve code', 'ai.hint': 'Open a file to use AI', 'settings.title': 'Settings', 'settings.general': 'General', 'settings.keybindings': 'Keybindings', 'settings.openJson': 'Open User Settings (JSON)', 'settings.openWorkspaceJson': 'Open Workspace Settings (JSON)', 'settings.globalJson': 'User JSON', 'settings.workspaceJson': 'Workspace JSON', 'settings.editor': 'Editor', 'settings.editor.desc': 'Configure the code editor appearance and behavior', 'settings.fontSize': 'Font Size', 'settings.fontSize.desc': 'Controls the font size in pixels', 'settings.tabSize': 'Tab Size', 'settings.tabSize.desc': 'The number of spaces a tab is equal to', 'settings.wordWrap': 'Word Wrap', 'settings.wordWrap.desc': 'Controls how long lines should wrap', 'settings.minimap': 'Minimap', 'settings.minimap.desc': 'Controls whether the minimap is shown', 'settings.fontLigatures': 'Font Ligatures', 'settings.fontLigatures.desc': 'Controls font ligatures rendering', 'settings.lineNumbers': 'Line Numbers', 'settings.lineNumbers.desc': 'Controls the display of line numbers', 'settings.cursorBlinking': 'Cursor Blinking', 'settings.cursorBlinking.desc': 'Controls the cursor animation style', 'settings.fontFamily': 'Font Family', 'settings.fontFamily.desc': 'Controls the font family of the editor', 'settings.cursorStyle': 'Cursor Style', 'settings.cursorStyle.desc': 'Controls the cursor style', 'settings.renderWhitespace': 'Render Whitespace', 'settings.renderWhitespace.desc': 'Controls whitespace rendering', 'settings.bracketPairColorization': 'Bracket Pair Colorization', 'settings.bracketPairColorization.desc': 'Enables colorization of matching brackets', 'settings.autoClosingBrackets': 'Auto Closing Brackets', 'settings.autoClosingBrackets.desc': 'Controls auto closing of brackets', 'settings.smoothScrolling': 'Smooth Scrolling', 'settings.smoothScrolling.desc': 'Controls smooth scrolling animation', 'settings.gitInlineBlame': 'Inline Git Blame', 'settings.gitInlineBlame.desc': 'Show Git author and commit summary for the current line', 'settings.trimTrailingWhitespace': 'Trim Trailing Whitespace', 'settings.trimTrailingWhitespace.desc': 'Trims trailing whitespace on save', 'settings.insertSpaces': 'Insert Spaces', 'settings.insertSpaces.desc': 'Insert spaces when pressing Tab', 'settings.animations': 'Animations', 'settings.animations.desc': 'Enable UI transition animations', 'settings.showFileIcons': 'File Icons', 'settings.showFileIcons.desc': 'Show file type icons in the sidebar', 'settings.compactMode': 'Compact Mode', 'settings.compactMode.desc': 'Reduce spacing for denser UI', 'settings.dotGridColor': 'Dot Grid Color', 'settings.dotGridColor.desc': 'Color of the interactive dot grid on the welcome screen', 'settings.backgroundStyle': 'Background Style', 'settings.backgroundStyle.desc': 'Choose the background style for the empty editor area', 'backgroundStyle.dotgrid': 'Dot Grid', 'backgroundStyle.solid': 'Solid', 'cursorStyle.line': 'Line', 'cursorStyle.block': 'Block', 'cursorStyle.underline': 'Underline', 'cursorStyle.line-thin': 'Line Thin', 'cursorStyle.block-outline': 'Block Outline', 'renderWhitespace.none': 'None', 'renderWhitespace.boundary': 'Boundary', 'renderWhitespace.all': 'All', 'fontFamily.jetbrains-mono': 'JetBrains Mono', 'fontFamily.fira-code': 'Fira Code', 'fontFamily.cascadia-code': 'Cascadia Code', 'fontFamily.consolas': 'Consolas', 'fontFamily.source-code-pro': 'Source Code Pro', 'fontFamily.monospace': 'Monospace', 'settings.files': 'Files', 'settings.files.desc': 'Configure how files are saved', 'settings.autoSaveDelay': 'Auto Save Delay', 'settings.autoSaveDelay.desc': 'Controls the delay before auto-saving changes', 'settings.appearance': 'Appearance', 'settings.appearance.desc': 'Customize the look of BlinkCode', 'settings.colorScheme': 'Color Scheme', 'settings.colorScheme.desc': 'Choose whether BlinkCode uses a light or dark theme', 'colorScheme.dark': 'Dark', 'colorScheme.light': 'Light', 'colorScheme.system': 'System', 'settings.theme': 'Theme', 'settings.theme.desc': 'Customize the appearance of BlinkCode', 'theme.tokyonight': 'Tokyo Night', 'theme.tokyonight.desc': 'Based on the tokyonight theme', 'theme.everforest': 'Everforest', 'theme.everforest.desc': 'Based on the Everforest theme', 'theme.ayu': 'Ayu', 'theme.ayu.desc': 'Based on the Ayu dark theme', 'theme.catppuccin': 'Catppuccin', 'theme.catppuccin.desc': 'Based on the Catppuccin theme', 'theme.catppuccin-macchiato': 'Catppuccin Macchiato', 'theme.catppuccin-macchiato.desc': 'Based on the Catppuccin theme', 'theme.gruvbox': 'Gruvbox', 'theme.gruvbox.desc': 'Based on the Gruvbox theme', 'theme.kanagawa': 'Kanagawa', 'theme.kanagawa.desc': 'Based on the Kanagawa theme', 'theme.nord': 'Nord', 'theme.nord.desc': 'Based on the Nord theme', 'theme.matrix': 'Matrix', 'theme.matrix.desc': 'Хакерская тема: зеленый на черном', 'theme.one-dark': 'One Dark', 'theme.one-dark.desc': 'Based on the Atom One Dark theme', 'theme.amoled': 'AMOLED', 'theme.amoled.desc': 'Pure black AMOLED theme', 'settings.language': 'Language', 'settings.language.desc': 'Set the display language for the interface', 'settings.keyboard': 'Keyboard Shortcuts', 'settings.reset': 'Reset', 'settings.pressKeys': 'Press keys...', 'kb.commandPalette': 'Command Palette', 'kb.quickOpen': 'Quick Open', 'kb.splitEditor': 'Split Editor Right', 'kb.save': 'Save File', 'kb.toggleSidebar': 'Toggle Sidebar', 'kb.toggleTerminal': 'Toggle Terminal', 'kb.toggleAI': 'Toggle AI Panel', 'kb.toggleSettings': 'Toggle Settings', 'kb.newFile': 'New File', 'kb.closeTab': 'Close Tab', 'kb.zoomIn': 'Zoom In', 'kb.zoomOut': 'Zoom Out', 'kb.find': 'Find', 'kb.replace': 'Find and Replace', 'kb.undo': 'Undo', 'kb.redo': 'Redo', 'kb.goToLine': 'Go to Line', 'kb.toggleWordWrap': 'Toggle Word Wrap', 'kb.comment': 'Toggle Comment', 'kb.workspaceSearch': 'Search in Workspace', 'kb.sourceControl': 'Source Control', 'kb.problemsPanel': 'Problems Panel', 'kb.saveAll': 'Save All', 'kb.closeAllTabs': 'Close All Tabs', 'kb.formatDocument': 'Format Document', 'on': 'On', 'settings.off': 'Off', 'off': 'Off', 'toast.openFolder': 'Use Chrome or Edge to open folders', 'toast.reading': 'Reading folder...', 'toast.empty': 'Folder is empty', 'toast.opened': 'Opened {0} files', 'toast.openFail': 'Failed to open folder: ', 'toast.ai': 'AI: {0}', 'toast.openFileFirst': 'Open a file first', 'preview.cannotDisplay': 'Cannot display image', 'preview.binaryFile': 'Binary file — cannot display', 'preview.generatedFile': '{file} is a generated file and is opened in read-only mode.', 'preview.largeFile': '{file} is too large for normal editing and is opened in a limited read-only mode.', 'preview.readOnlyTextFile': '{file} is available in read-only mode.', 'preview.imagePreview': '{file} is shown as a preview instead of an editable text file.', 'preview.archiveFile': 'Archive files cannot be opened as text in the editor.', 'preview.fontFile': 'Font files cannot be opened inside the code editor.', 'preview.documentFile': 'Document files are not available for inline editing here.', 'preview.mediaFile': 'Media files are not editable in the code editor.', 'preview.binaryBlocked': 'This binary file cannot be opened as editable text.', 'preview.webOnlyTitle': 'Read-only file', 'preview.webOnlyMessage': '{file} is available for viewing only.', 'preview.webOnlyDescription': 'Unsupported file types can be viewed but not edited.', 'preview.readOnlyBadge': 'Read-only mode', 'zoom.reset': 'Reset', 'openFolder': 'Open Folder', 'explorer.unsupportedFileHint': 'This file is available for viewing only', 'common.cancel': 'Cancel', 'sc.title': 'Source Control', 'sc.noRepo': 'The folder is not a Git repository. Initialize a repository to use source control.', 'sc.noChanges': 'No changes detected in the repository.', 'sc.stagedChanges': 'Staged Changes', 'sc.changes': 'Changes', 'sc.untracked': 'Untracked', 'sc.commitPlaceholder': 'Commit message (Ctrl+Enter to commit)', 'sc.commit': 'Commit', 'sc.committed': 'Changes committed successfully', 'sc.commitFailed': 'Commit failed: ', 'sc.commitIdentityHint': 'Git author is not configured. Run: git config user.name "Your Name" and git config user.email "you@example.com"', 'sc.stage': 'Stage', 'sc.stageAll': 'Stage All', 'sc.unstage': 'Unstage', 'sc.discard': 'Discard Changes', 'sc.refresh': 'Refresh', 'sc.pull': 'Pull', 'sc.push': 'Push', 'sc.pullSuccess': 'Pulled latest changes', 'sc.pushSuccess': 'Pushed commits', 'sc.pullFailed': 'Pull failed: ', 'sc.pushFailed': 'Push failed: ', 'sc.pullTrackingMissing': 'No tracking branch configured. Set upstream or run pull from origin for current branch.', 'sc.pullRemoteBranchMissing': 'Remote branch not found on origin. Check branch name and remote repository.', 'sc.pushUpstreamMissing': 'Upstream branch is not configured. Set upstream for the current branch.', 'sc.pushNonFastForward': 'Push rejected (non-fast-forward). Run pull first, resolve conflicts if needed, then push again.', 'sc.authFailed': 'Authentication failed for remote Git operation. Re-login to Git provider or fix credentials/token.', 'sc.unknownGitError': 'Unknown Git error', 'sc.stageFailed': 'Stage failed: ', 'sc.unstageFailed': 'Unstage failed: ', 'sc.discardConfirmTitle': 'Discard local changes?', 'sc.discardConfirmOne': 'This will permanently discard all local changes in this file. This action cannot be undone.', 'sc.discardConfirmMany': 'Discard all local changes in {count} files? This cannot be undone.', 'sc.discardConfirmAction': 'Discard changes', 'sc.discardFailed': 'Discard failed: ', 'sc.diffPreview': 'Diff Preview', 'sc.diffFailed': 'Diff preview failed: ', 'tab.savePrompt': 'Save changes?', 'tab.save': 'Save', 'tab.dontSave': "Don't Save", 'tab.cancel': 'Cancel', 'tab.copyPath': 'Copy Path', 'tab.closeAll': 'Close All', 'tab.noChanges': 'No changes', }; const ru: Record<string, string> = { 'logo.text': 'BlinkCode', 'empty.title.blink': 'Blink', 'empty.title.code': 'Code', 'empty.sub': 'Откройте файл чтобы начать', 'empty.autosave': 'Ctrl+S автосохранение', 'empty.welcome': 'Добро пожаловать в BlinkCode', 'empty.hint': 'Создайте файл или откройте папку чтобы начать', 'common.close': 'Закрыть', 'search.title': 'Поиск', 'search.placeholder': 'Поиск', 'search.replacePlaceholder': 'Замена', 'search.regex': 'Использовать регулярное выражение', 'search.matchCase': 'Учитывать регистр', 'search.wholeWord': 'Слово целиком', 'search.include': 'включить файлы, например src/**/*.ts', 'search.exclude': 'исключить файлы, например node_modules,dist', 'search.empty': 'Введите запрос для поиска по проекту', 'search.run': 'Найти', 'problems.title': 'Проблемы', 'problems.all': 'Все', 'problems.errors': 'Ошибки', 'problems.warnings': 'Предупреждения', 'problems.noProblems': 'Проблем в проекте не обнаружено', 'search.searching': 'Поиск…', 'search.matches': '{0} совпадений', 'search.truncated': 'Результаты обрезаны.', 'search.failed': 'Ошибка поиска', 'search.fileNotFound': 'Файл не найден в дереве проекта', 'search.replaceAll': 'Заменить всё', 'search.replaceAllConfirm': 'Заменить все совпадения в проекте?', 'search.replaced': 'Заменено совпадений: {0}', 'search.replaceFailed': 'Ошибка замены', 'empty.simpleWelcome': 'Добро пожаловать в BlinkCode', 'onboarding.title': 'Добро пожаловать в BlinkCode', 'onboarding.description': 'BlinkCode помогает быстро открывать папки, редактировать файлы проекта и работать в удобном пространстве разработки.', 'onboarding.section.start': 'Быстрый старт', 'onboarding.section.files': 'Файлы и редактирование', 'onboarding.section.interface': 'Интерфейс', 'onboarding.section.workflow': 'Рабочий процесс и удобство', 'onboarding.item.startIntro': 'Этот экран показывается при первом запуске BlinkCode, чтобы сразу объяснить, как устроен редактор и с чего начать.', 'onboarding.item.openFolder': 'Используйте Открыть, чтобы загрузить папку проекта в проводник.', 'onboarding.item.projectTree': 'После открытия папки проводник показывает структуру проекта и позволяет быстро перемещаться по файлам и каталогам.', 'onboarding.item.editFiles': 'Нажмите на любой поддерживаемый файл, чтобы открыть и редактировать его в редакторе кода.', 'onboarding.item.filesIntro': 'BlinkCode ориентирован на работу с файлами проекта прямо внутри одного рабочего пространства.', 'onboarding.item.supportedFiles': 'Поддерживаемые файлы кода, конфигов и обычного текста открываются в редакторе с подсветкой синтаксиса и возможностью редактирования.', 'onboarding.item.unsupported': 'Неподдерживаемые файлы открываются безопасно в режиме только для чтения и не ломают редактор.', 'onboarding.item.logs': 'Файлы логов и обычные текстовые файлы тоже можно открывать прямо в редакторе.', 'onboarding.item.tabs': 'Открытые файлы остаются во вкладках сверху, поэтому можно быстро переключаться между ними и не терять текущее место.', 'onboarding.item.interfaceIntro': 'Интерфейс организован так, чтобы навигация и работа с кодом были быстрыми и предсказуемыми.', 'onboarding.item.sidebar': 'Используйте левый activity bar, чтобы в любой момент открыть или скрыть проводник.', 'onboarding.item.activityBar': 'Activity bar остаётся видимым даже когда проводник скрыт, поэтому доступ к структуре проекта всегда находится в один клик.', 'onboarding.item.settings': 'Используйте Настройки, чтобы менять тему, поведение редактора и горячие клавиши.', 'onboarding.item.ai': 'При необходимости можно открыть AI-панель для помощи с анализом или улучшением кода внутри текущего проекта.', 'onboarding.item.workflowIntro': 'BlinkCode также держит рядом с редактором основные действия разработки, чтобы работа оставалась непрерывной.', 'onboarding.item.autosave': 'Файлы сохраняются по текущей логике автосохранения, поэтому при включённом autosave изменения не теряются без лишних действий.', 'onboarding.item.restore': 'Открытые вкладки, состояние рабочего пространства и часть настроек интерфейса могут восстанавливаться между запусками.', 'onboarding.item.shortcuts': 'Для основных действий доступны горячие клавиши: сохранение, отмена, повтор, переключение панели и другие команды.', 'onboarding.item.themes': 'Темы, цветовая схема и внешний вид редактора можно настроить под свой рабочий стиль.', 'onboarding.dontShowAgain': 'Больше не показывать эту справку', 'onboarding.dismissTitle': 'Закрыть этот экран справки?', 'top.open': 'Открыть', 'top.terminal': 'Терминал', 'top.ai': 'ИИ', 'top.settings': 'Настройки', 'top.share': 'Поделиться', 'top.sidebar': 'Боковая панель', 'explorer.title': 'ПРОВОДНИК', 'explorer.closeFolder': 'Закрыть папку', 'explorer.filter': 'Фильтр файлов...', 'explorer.refresh': 'Обновить', 'explorer.newFile': 'Новый файл', 'explorer.newFolder': 'Новая папка', 'sidebar.recentProjects': 'Последние проекты', 'ctx.open': 'Открыть', 'ctx.rename': 'Переименовать', 'ctx.delete': 'Удалить', 'ctx.newFile': 'Новый файл', 'ctx.newFolder': 'Новая папка', 'inline.file': 'имя.js', 'inline.folder': 'имя папки', 'tab.close': 'Закрыть', 'term.title': 'ТЕРМИНАЛ', 'term.placeholder': 'Введите команду...', 'term.reconnect': 'Переподключить', 'term.clear': 'Очистить', 'term.close': 'Закрыть панель', 'term.closeTab': 'Закрыть терминал', 'term.newTab': 'Новый терминал', 'term.tab': 'Терминал', 'ai.title': 'ИИ Ассистент', 'ai.explain': 'Объяснить код', 'ai.fix': 'Исправить ошибку', 'ai.improve': 'Улучшить код', 'ai.hint': 'Откройте файл для ИИ', 'settings.title': 'Настройки', 'settings.general': 'Основные', 'settings.keybindings': 'Горячие клавиши', 'settings.openJson': 'Открыть настройки пользователя (JSON)', 'settings.openWorkspaceJson': 'Открыть настройки проекта (JSON)', 'settings.globalJson': 'JSON пользователя', 'settings.workspaceJson': 'JSON проекта', 'settings.editor': 'Редактор', 'settings.editor.desc': 'Настройте внешний вид и поведение редактора кода', 'settings.fontSize': 'Размер шрифта', 'settings.fontSize.desc': 'Управляет размером шрифта в пикселях', 'settings.tabSize': 'Размер табуляции', 'settings.tabSize.desc': 'Количество пробелов в одной табуляции', 'settings.wordWrap': 'Перенос строк', 'settings.wordWrap.desc': 'Управляет переносом длинных строк', 'settings.minimap': 'Миникарта', 'settings.minimap.desc': 'Управляет отображением миникарты', 'settings.fontLigatures': 'Лигатуры шрифта', 'settings.fontLigatures.desc': 'Управляет отображением лигатур шрифта', 'settings.lineNumbers': 'Номера строк', 'settings.lineNumbers.desc': 'Управляет отображением номеров строк', 'settings.cursorBlinking': 'Мигание курсора', 'settings.cursorBlinking.desc': 'Управляет стилем анимации курсора', 'settings.fontFamily': 'Шрифт', 'settings.fontFamily.desc': 'Управляет семейством шрифтов редактора', 'settings.cursorStyle': 'Стиль курсора', 'settings.cursorStyle.desc': 'Управляет стилем курсора', 'settings.renderWhitespace': 'Отображение пробелов', 'settings.renderWhitespace.desc': 'Управляет отображением пробелов', 'settings.bracketPairColorization': 'Цветовые пары скобок', 'settings.bracketPairColorization.desc': 'Включает подсветку парных скобок', 'settings.autoClosingBrackets': 'Автозакрытие скобок', 'settings.autoClosingBrackets.desc': 'Управляет автозакрытием скобок', 'settings.smoothScrolling': 'Плавная прокрутка', 'settings.smoothScrolling.desc': 'Управляет плавной анимацией прокрутки', 'settings.gitInlineBlame': 'Inline Git Blame', 'settings.gitInlineBlame.desc': 'Показывать автора Git и сообщение коммита для текущей строки', 'settings.trimTrailingWhitespace': 'Удаление конечных пробелов', 'settings.trimTrailingWhitespace.desc': 'Удаляет конечные пробелы при сохранении', 'settings.insertSpaces': 'Вставка пробелов', 'settings.insertSpaces.desc': 'Вставлять пробелы при нажатии Tab', 'settings.animations': 'Анимации', 'settings.animations.desc': 'Включить анимации переходов в интерфейсе', 'settings.showFileIcons': 'Иконки файлов', 'settings.showFileIcons.desc': 'Показывать иконки типов файлов в боковой панели', 'settings.compactMode': 'Компактный режим', 'settings.compactMode.desc': 'Уменьшить отступы для плотного интерфейса', 'settings.dotGridColor': 'Цвет точек', 'settings.dotGridColor.desc': 'Цвет интерактивной сетки точек на экране приветствия', 'settings.backgroundStyle': 'Стиль фона', 'settings.backgroundStyle.desc': 'Выберите стиль фона для пустой области редактора', 'backgroundStyle.dotgrid': 'Сетка точек', 'backgroundStyle.solid': 'Сплошной', 'cursorStyle.line': 'Линия', 'cursorStyle.block': 'Блок', 'cursorStyle.underline': 'Подчёркивание', 'cursorStyle.line-thin': 'Тонкая линия', 'cursorStyle.block-outline': 'Контур блока', 'renderWhitespace.none': 'Нет', 'renderWhitespace.boundary': 'Граница', 'renderWhitespace.all': 'Все', 'fontFamily.jetbrains-mono': 'JetBrains Mono', 'fontFamily.fira-code': 'Fira Code', 'fontFamily.cascadia-code': 'Cascadia Code', 'fontFamily.consolas': 'Consolas', 'fontFamily.source-code-pro': 'Source Code Pro', 'fontFamily.monospace': 'Моноширинный', 'settings.files': 'Файлы', 'settings.files.desc': 'Настройте сохранение файлов', 'settings.autoSaveDelay': 'Задержка автосохранения', 'settings.autoSaveDelay.desc': 'Управляет задержкой перед автосохранением', 'settings.off': 'Выкл', 'settings.appearance': 'Внешний вид', 'settings.appearance.desc': 'Настройте оформление BlinkCode', 'settings.colorScheme': 'Цветовая схема', 'settings.colorScheme.desc': 'Выберите, следует ли BlinkCode использовать светлую или тёмную тему', 'colorScheme.dark': 'Тёмная', 'colorScheme.light': 'Светлая', 'colorScheme.system': 'Системная', 'settings.theme': 'Тема', 'settings.theme.desc': 'Настройте оформление BlinkCode', 'theme.tokyonight': 'Tokyo Night', 'theme.tokyonight.desc': 'Основана на теме tokyonight', 'theme.everforest': 'Everforest', 'theme.everforest.desc': 'Основана на теме Everforest', 'theme.ayu': 'Ayu', 'theme.ayu.desc': 'Основана на тёмной теме Ayu', 'theme.catppuccin': 'Catppuccin', 'theme.catppuccin.desc': 'Основана на теме Catppuccin', 'theme.catppuccin-macchiato': 'Catppuccin Macchiato', 'theme.catppuccin-macchiato.desc': 'Основана на теме Catppuccin', 'theme.gruvbox': 'Gruvbox', 'theme.gruvbox.desc': 'Основана на теме Gruvbox', 'theme.kanagawa': 'Kanagawa', 'theme.kanagawa.desc': 'Основана на теме Kanagawa', 'theme.nord': 'Nord', 'theme.nord.desc': 'Основана на теме Nord', 'theme.matrix': 'Matrix', 'theme.matrix.desc': 'Хакерская тема: зелёный на чёрном', 'theme.one-dark': 'One Dark', 'theme.one-dark.desc': 'Основана на теме Atom One Dark', 'theme.amoled': 'AMOLED', 'theme.amoled.desc': 'Чисто чёрная AMOLED тема', 'settings.language': 'Язык', 'settings.language.desc': 'Установите язык интерфейса', 'settings.keyboard': 'Горячие клавиши', 'settings.reset': 'Сбросить', 'settings.pressKeys': 'Нажмите клавиши...', 'kb.commandPalette': 'Палитра команд', 'kb.quickOpen': 'Быстрое открытие', 'kb.splitEditor': 'Разделить редактор', 'kb.save': 'Сохранить файл', 'kb.toggleSidebar': 'Боковая панель', 'kb.toggleTerminal': 'Терминал', 'kb.toggleAI': 'Панель ИИ', 'kb.toggleSettings': 'Настройки', 'kb.newFile': 'Новый файл', 'kb.closeTab': 'Закрыть вкладку', 'kb.zoomIn': 'Увеличить', 'kb.zoomOut': 'Уменьшить', 'kb.find': 'Найти', 'kb.replace': 'Найти и заменить', 'kb.undo': 'Отменить', 'kb.redo': 'Повторить', 'kb.goToLine': 'Перейти к строке', 'kb.toggleWordWrap': 'Перенос строк', 'kb.comment': 'Комментарий', 'kb.workspaceSearch': 'Поиск в проекте', 'kb.sourceControl': 'Контроль версий', 'kb.problemsPanel': 'Панель проблем', 'kb.saveAll': 'Сохранить все', 'kb.closeAllTabs': 'Закрыть все вкладки', 'kb.formatDocument': 'Форматировать документ', 'on': 'Вкл', 'off': 'Выкл', 'toast.openFolder': 'Используйте Chrome или Edge', 'toast.reading': 'Чтение папки...', 'toast.empty': 'Папка пуста', 'toast.opened': 'Открыто {0} файлов', 'toast.openFail': 'Ошибка открытия: ', 'toast.ai': 'ИИ: {0}', 'toast.openFileFirst': 'Сначала откройте файл', 'preview.cannotDisplay': 'Невозможно отобразить', 'preview.binaryFile': 'Бинарный файл — нельзя отобразить', 'preview.generatedFile': '{file} — это сгенерированный файл, поэтому он открыт в режиме только для чтения.', 'preview.largeFile': '{file} слишком большой для обычного редактирования и открыт в ограниченном режиме только для чтения.', 'preview.readOnlyTextFile': '{file} открыт в режиме только для чтения.', 'preview.imagePreview': '{file} показывается как preview, а не как редактируемый текстовый файл.', 'preview.archiveFile': 'Архивные файлы нельзя открыть как текст в редакторе.', 'preview.fontFile': 'Файлы шрифтов нельзя открыть внутри кодового редактора.', 'preview.documentFile': 'Файлы документов недоступны для встроенного редактирования здесь.', 'preview.mediaFile': 'Медиафайлы нельзя редактировать в кодовом редакторе.', 'preview.binaryBlocked': 'Этот бинарный файл нельзя открыть как редактируемый текст.', 'preview.webOnlyTitle': 'Файл только для чтения', 'preview.webOnlyMessage': '{file} доступен только для просмотра.', 'preview.webOnlyDescription': 'Неподдерживаемые типы файлов можно просматривать, но нельзя редактировать.', 'preview.readOnlyBadge': 'Режим чтения', 'zoom.reset': 'Сброс', 'openFolder': 'Открыть папку', 'explorer.unsupportedFileHint': 'Этот файл доступен только для просмотра', 'common.cancel': 'Отмена', 'tab.savePrompt': 'Сохранить изменения?', 'tab.save': 'Сохранить', 'tab.dontSave': 'Не сохранять', 'tab.cancel': 'Отмена', 'tab.copyPath': 'Копировать путь', 'tab.closeAll': 'Закрыть все', 'tab.noChanges': 'Без изменений', 'sc.title': 'Контроль версий', 'sc.noRepo': 'Папка не является Git-репозиторием. Инициализируйте репозиторий для использования контроля версий.', 'sc.noChanges': 'Изменений в репозитории не обнаружено.', 'sc.stagedChanges': 'Индексированные изменения', 'sc.changes': 'Изменения', 'sc.untracked': 'Неотслеживаемые', 'sc.commitPlaceholder': 'Сообщение коммита (Ctrl+Enter для коммита)', 'sc.commit': 'Закоммитить', 'sc.committed': 'Изменения успешно закоммичены', 'sc.commitFailed': 'Ошибка коммита: ', 'sc.commitIdentityHint': 'Не настроен автор Git. Выполните: git config user.name "Ваше Имя" и git config user.email "you@example.com"', 'sc.stage': 'Индексировать', 'sc.stageAll': 'Индексировать все', 'sc.unstage': 'Убрать из индекса', 'sc.discard': 'Отменить изменения', 'sc.refresh': 'Обновить', 'sc.pull': 'Получить изменения', 'sc.push': 'Отправить изменения', 'sc.pullSuccess': 'Последние изменения получены', 'sc.pushSuccess': 'Коммиты отправлены', 'sc.pullFailed': 'Ошибка получения изменений: ', 'sc.pushFailed': 'Ошибка отправки изменений: ', 'sc.pullTrackingMissing': 'Для текущей ветки не настроен tracking. Настройте upstream или выполните pull из origin для текущей ветки.', 'sc.pullRemoteBranchMissing': 'Удалённая ветка не найдена в origin. Проверьте имя ветки и удалённый репозиторий.', 'sc.pushUpstreamMissing': 'Для текущей ветки не настроен upstream. Настройте upstream для этой ветки.', 'sc.pushNonFastForward': 'Push отклонён (non-fast-forward). Сначала выполните pull, решите конфликты при необходимости и повторите push.', 'sc.authFailed': 'Ошибка аутентификации при удалённой Git-операции. Повторите вход в Git-провайдер или исправьте credentials/token.', 'sc.unknownGitError': 'Неизвестная ошибка Git', 'sc.stageFailed': 'Ошибка индексации: ', 'sc.unstageFailed': 'Ошибка убирания из индекса: ', 'sc.discardConfirmTitle': 'Отменить локальные изменения?', 'sc.discardConfirmOne': 'Все локальные изменения в этом файле будут безвозвратно отменены. Это действие нельзя отменить.', 'sc.discardConfirmMany': 'Отменить все локальные изменения в {count} файлах? Это действие нельзя отменить.', 'sc.discardConfirmAction': 'Отменить изменения', 'sc.discardFailed': 'Ошибка отмены изменений: ', 'sc.diffPreview': 'Предпросмотр изменений', 'sc.diffFailed': 'Ошибка предпросмотра изменений: ', }; const dicts: Record<string, Record<string, string>> = { en, ru }; export function t(key: string, lang: string, args?: Record<string, string | number>): string { const dict = dicts[lang] || dicts.en; let val = dict[key] || dicts.en[key] || key; if (args) { Object.entries(args).forEach(([k, v]) => { val = val.replace(`{${k}}`, String(v)); }); } return val; }