import { create } from 'zustand'; export type Lang = 'ru' | 'en'; const LANG_KEY = 'knot_language'; const translations = { ru: { // Side menu myProfile: 'Мой профиль', settings: 'Настройки', aboutApp: 'О приложении', logout: 'Выйти из аккаунта', // Profile name: 'Имя', username: 'Имя пользователя', chats: 'Чаты', calls: 'Звонки', contacts: 'Контакты', archive: 'Архив', aboutMe: 'О себе', birthday: 'Дата рождения', enterName: 'Введите имя', tellAboutYourself: 'Расскажите о себе', removePhoto: 'Удалить фото', cropPhoto: 'Обрезать фото', saveChanges: 'Сохранить изменения', displayName: 'Отображаемое имя', // Settings language: 'Язык / Language', interfaceLang: 'Язык интерфейса', theme: 'Оформление', russian: 'Русский', english: 'English', about: 'О приложении', version: 'Версия', modernMessenger: 'Современный мессенджер с фокусом', onPrivacy: 'на приватность и удобство', modernMessengerShort: 'Современный мессенджер', settingsDesc: 'Управляйте своим профилем и настройками приложения', appSettings: 'Настройки приложения', enterDisplayName: 'Как вас называть?', tellAboutBio: 'Расскажите немного о себе...', storageAndData: 'Хранилище и данные', importTelegram: 'Импорт истории Telegram', importTelegramDesc: 'Перенести сообщения и медиа из Telegram', importSuccess: 'Импорт завершен', importStarted: 'Импорт запущен в фоновом режиме', importSelectArchive: 'Загрузите архив', importSelectArchiveDesc: 'Экспортируйте чат из Telegram (HTML формат, вкл. медиа) и загрузите полученный ZIP архив.', importLimit: 'Лимит: до 1 ГБ', importSelectFile: 'Выбрать ZIP-архив', importParticipants: 'Соответствие участников', importParticipantsDesc: 'Назначьте участников из архива пользователям в Knot.', importInArchive: 'В архиве', importSelectContact: '-- Выберите контакт --', importGroupName: 'Название чата', importGroupNameHint: 'Например, Моя группа', importStart: 'Запустить импорт', importRestart: 'Начать заново', importCompletedDesc: 'Мы успешно создали чат и начали перенос сообщений в фоновом режиме.', // Chat chat: 'Чат', group: 'Группа', searchChats: 'Поиск чатов...', noChats: 'Нет чатов — создайте первый!', nothingFound: 'Ничего не найдено', selectChat: 'Выберите чат для начала общения', selectChatTitle: 'Выберите чат', selectChatSubtext: 'Начните общение прямо сейчас. Все ваши сообщения защищены сквозным шифрованием.', newMessage: 'Новое сообщение', noMessages: 'Нет сообщений — напишите первое!', typing: 'печатает...', online: 'в сети', wasRecently: 'был(а) недавно', members: 'участников', files: 'файлов', clearAll: 'Очистить всё', maxFilesLimit: 'Максимум 20 файлов', searchingHistory: 'Поиск сообщения в истории...', messageNotFound: 'Сообщение не найдено', messagePlaceholder: 'Сообщение...', message: 'Сообщение...', addCaption: 'Добавьте подпись...', searchMessages: 'Поиск сообщений...', searchMessagesBtn: 'Поиск сообщений', userProfile: 'Профиль пользователя', userProfileUpper: 'ПРОФИЛЬ ПОЛЬЗОВАТЕЛЯ', enableSound: 'Включить звук', disableSound: 'Выключить звук', deleteChat: 'Удалить чат', // Messages messageDeleted: 'Сообщение удалено', reply: 'Ответить', copy: 'Копировать', edit: 'Редактировать', delete: 'Удалить', deleteForMe: 'Удалить у меня', deleteForAll: 'Удалить у всех', deleteAlsoFor: 'Удалить также для', editing: 'Редактирование', replyTo: 'Ответ', media: 'Медиа', download: 'Скачать', edited: 'ред.', selected: 'выбрано', fileLabel: 'Файл', kb: 'КБ', voice: '🎤 Голосовое', photo: '🖼 Фото', video: '🎬 Видео', file: 'Файл', // Call call: 'Звонок', videoCall: 'Видеозвонок', incomingCall: 'Входящий звонок', incomingVideoCall: 'Входящий видеозвонок', calling: 'Вызов...', isCalling: 'звонит...', groupCall: 'Групповой звонок', comingSoon: 'Скоро будет', accept: 'Принять', decline: 'Отклонить', endCall: 'Завершить', callEnded: 'Звонок завершён', callDeclined: 'Звонок отклонён', audioCall: 'Голосовой звонок', missedCall: 'Пропущенный звонок', declinedCall: 'Отклонённый звонок', cancelledCall: 'Отменённый звонок', completedCall: 'Вызов завершён', // Photo/video photoVideo: 'Фото / видео', fileBtn: 'Файл', sendError: 'Ошибка отправки', // New chat newChat: 'Новый чат', add: 'Добавить', menu: 'Меню', // Date picker months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], weekDays: ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'], clear: 'Очистить', today: 'Сегодня', // New chat newChatTitle: 'Новый чат', selectMembers: 'Выберите участников', newGroup: 'Новая группа', groupNamePlaceholder: 'Название группы...', membersCount: 'Участники', createGroup: 'Создать группу', upTo200: 'До 200 участников', findUser: 'Найти пользователя по имени или @username...', addMembers: 'Добавить участников...', usersNotFound: 'Пользователи не найдены', enterNameOrUsername: 'Введите имя или @username', next: 'Далее', pinMessage: 'Закрепить', unpinMessage: 'Открепить', pinnedMessage: 'Закреплённое сообщение', poll: 'Опрос', pollTab: 'Опросы', createPoll: 'Создать опрос', pollQuestion: 'Вопрос', pollQuestionPlaceholder: 'Задайте вопрос...', pollOptions: 'Варианты ответа', pollOption: 'Вариант', addOption: 'Добавить вариант', pollSettings: 'Настройки', anonymousVoting: 'Анонимное голосование', multipleAnswers: 'Выбор нескольких вариантов', singleAnswer: 'Одиночный выбор', anonymous: 'Анонимно', votes: 'голосов', pollButton: 'Опрос', forwardMessage: 'Переслать сообщение', forward: 'Переслать', forwardedFrom: 'Переслано от', replyWithQuote: 'Ответить с цитатой', select: 'Выбрать', sending: 'Отправка...', scheduleMessage: 'Запланировать', scheduleSend: 'Отправить по расписанию', scheduled: 'Запланировано', myStory: 'Моя история', newStory: 'Новая история', textStory: 'Текст', imageStory: 'Фото', mediaStory: 'Медиа', typeYourStory: 'Напишите историю...', publishStory: 'Опубликовать', stories: 'Истории', clearChat: 'Очистить чат', clearChatConfirm: 'Очистить историю чата для себя? Собеседник сохранит свою историю.', clearHistory: 'Очистить историю', clearHistoryConfirm: 'Очистить историю?', deleteChatConfirm: 'Удалить чат? Это действие нельзя отменить. Чат будет удалён у всех участников.', deleteGroupChatConfirm: 'Удалить чат? Это действие нельзя отменить. Чат будет удалён у всех участников.', pinChat: 'Закрепить чат', unpinChat: 'Открепить чат', chatCleared: 'Очищено', typeYourStoryPlaceholder: 'Напишите историю...', uploadMedia: 'Загрузить медиа', chooseBackground: 'Цвет фона', viewedBy: 'Просмотрели', storyDetails: 'Информация', viewCountSuffix: 'посмотрели эту историю', storyPrivacyNote: 'Истории зашифрованы и исчезнут через 24 часа. Сообщения о прочтении видны только автору.', storiesEditor: 'Редактор историй', tools: 'Инструменты', privacyNote: 'Выберите, кто может просматривать вашу новую историю.', allUsers: 'Все пользователи', onlyContacts: 'Только контакты', selectedContacts: 'Выбранные контакты', yourStory: 'Ваша история', stickers: 'Стикеры', brush: 'Кисть', filters: 'Фильтры', report: 'Пожаловаться', groupSettings: 'Настройки группы', editGroupName: 'Изменить название', addMember: 'Добавить участника', removeMember: 'Удалить из группы', leaveGroup: 'Покинуть группу', adminBadge: 'Админ', groupDescription: 'Описание', noDescription: 'Нет описания', memberBadge: 'Участник', screenShare: 'Демонстрация экрана', stopScreenShare: 'Остановить демонстрацию', switchCamera: 'Выбрать камеру', showInChat: 'Показать в чате', minimize: 'Свернуть', volume: 'Громкость', mute: 'Выключить микрофон', unmute: 'Включить микрофон', noiseSuppressionOn: 'Шумоподавление включено', noiseSuppressionOff: 'Шумоподавление выключено', selectMicrophone: 'Выбрать микрофон', microphone: 'Микрофон', rightClickVolume: 'ПКМ для регулировки громкости', participants: 'участников', joinCall: 'Присоединиться к звонку', activeCall: 'Активный звонок', groupNameRequired: 'Введите название группы', confirmRemoveMember: 'Удалить этого участника из группы?', yes: 'Да', no: 'Нет', you: 'вы', // Stories Editor cropVideo: 'Обрезка видео', cropTool: 'Обрезка', trimVideo: 'Обрезать видео', trim: 'Обрезать', reset: 'Сбросить', startCreation: 'Начать создание', brushTool: 'Кисти', textTool: 'Текст', stickersTool: 'Стикеры', filtersTool: 'Коррекция', textContent: 'Контент', typography: 'Типографика', textSize: 'Размер', textColor: 'Цвет текста', brushThickness: 'Толщина', clearCanvas: 'Очистить холст', correctionMaster: 'Мастер коррекции', brightness: 'Яркость', contrast: 'Контраст', saturation: 'Насыщенность', sepia: 'Сепия', bgColor: 'Цвет фона', clickToChooseColor: 'Нажмите для выбора цвета', done: 'Готово', stop: 'Остановить', zoomHint: 'Колесико мыши для зума', secSelected: 'сек выбрано', muted: 'Без звука', unmuted: 'Со звуком', muteVideo: 'Отключить звук', unmuteVideo: 'Включить звук', interactive: 'Интерактив', apply: 'Применить', zoom: 'Масштаб', rotation: 'Поворот', // User profile mediaTab: 'Медиа', gifs: 'GIF', filesTab: 'Файлы', linksTab: 'Ссылки', profileTitle: 'Профиль', removeAvatar: 'Удалить аватар', namePlaceholder: 'Имя', notSpecified: 'Не указано', onKnotSince: 'На Knot с', joined: 'С нами с', cancel: 'Отмена', confirm: 'Подтвердить', save: 'Сохранить', sharedPhotos: 'Общие фото и видео будут здесь', sharedFiles: 'Общие файлы будут здесь', sharedLinks: 'Общие ссылки будут здесь', profileNotFound: 'Профиль не найден', storiesTab: 'Истории', publicationsTab: 'Публикации', noStories: 'Публикаций пока нет', noBio: 'Информация отсутствует', goToMessage: 'Перейти к сообщению', story: 'История', commonGroups: 'Общие группы', more: 'Ещё', empty: 'Пусто', acceptRequest: 'Принять запрос', // Typing typingText: 'печатает', // Emoji emojiFrequent: 'Часто', emojiGestures: 'Жесты', emojiEmotions: 'Эмоции', emojiObjects: 'Предметы', emojiFood: 'Еда', emojiNature: 'Природа', // Auth login: 'Вход', register: 'Регистрация', latinOnly: '(латиница, нельзя изменить)', displayNameLabel: 'Отображаемое имя', displayNamePlaceholder: 'Ваше имя (любой язык)', password: 'Пароль', passwordPlaceholder: 'Введите пароль', bioPlaceholder: 'Расскажите о себе (необязательно)', loginBtn: 'Войти', createAccount: 'Создать аккаунт', testAccounts: 'Тестовые аккаунты: evgeniy, anastasia, artem, polina', passwordForAll: 'Пароль для всех:', dontHaveAccount: 'Нет аккаунта?', alreadyHaveAccount: 'Уже есть аккаунт?', passwordRequirements: 'Минимум 8 символов, буквы и цифры', registerNow: 'Зарегистрироваться', loginNow: 'Войти', // File/upload fileTooLarge: 'Файл слишком большой (макс. 200МБ)', dropFileHere: 'Отпустите файл здесь', uploading: 'Загрузка...', uploadError: 'Ошибка загрузки файла', changePhoto: 'Сменить фото', remove: 'Удалить', // Formatting formatBold: 'Жирный', formatBoldHint: '**текст**', formatItalic: 'Курсив', formatItalicHint: '_текст_', formatStrike: 'Зачёркнут', formatStrikeHint: '~текст~', formatMono: 'Моноширинный', formatMonoHint: '`текст`', // Draft draft: 'Черновик:', // Date datePlaceholder: 'дд.мм.гггг', // GIF / Emoji tenorKeyRequired: 'Для GIF нужен Tenor API ключ', openConsoleRun: 'Откройте консоль и выполните:', searchGifs: 'Поиск GIF...', trending: 'Популярные', // Misc error: 'Ошибка', // Friends friends: 'Контакты', friendRequests: 'Заявки в контакты', friendsList: 'Список контактов', noFriends: 'Пока нет контактов', addFriend: 'Добавить в контакты', removeFriend: 'Удалить из контактов', requestSent: 'Заявка отправлена', searchFriends: 'Поиск по @username (мин. 3 символа)', searchResults: 'Результаты поиска', noSearchResults: 'Пользователи не найдены', minCharsHint: 'Введите минимум 3 символа после @', selectContactToChat: 'Выберите контакт из списка, чтобы начать общение, или воспользуйтесь поиском для поиска новых людей.', backToChats: 'Назад к чатам', // Story viewers storyViewers: 'Кто просмотрел', noViewers: 'Пока никто не посмотрел', replyToStory: 'Ответить на историю...', send: 'Отправить', // Favorites favorites: 'Избранное', favoritesDescription: 'Сохраняйте важные сообщения здесь', // Privacy privacy: 'Приватность', hideStoryViews: 'Скрывать просмотры историй', hideStoryViewsDesc: 'Другие не увидят, что вы смотрели их историю', // Scheduled scheduledFor: 'Запланировано на', messageScheduled: 'Сообщение запланировано', scheduledDelivered: 'Сообщение отправлено для', scheduledDeliveredAt: 'в', scheduleIn1h: 'Через 1 час', scheduleIn3h: 'Через 3 часа', scheduleTomorrow: 'Завтра в 9:00', scheduleCustom: 'Выбрать дату и время', scheduleTime: 'Время', scheduleDate: 'Дата', // Last seen lastSeenAt: 'был(а)', justNow: 'только что', loadStoriesError: 'Ошибка загрузки историй', loadChatsError: 'Ошибка загрузки чатов', loadMessagesError: 'Ошибка загрузки сообщений', unreadMessages: 'Непрочитанные сообщения', attachmentDiscardConfirm: 'У вас есть прикрепленные вложения. Если вы перейдете в другой чат, они будут потеряны. Продолжить?', }, en: { myProfile: 'My Profile', settings: 'Settings', aboutApp: 'About', logout: 'Log Out', name: 'Name', username: 'Username', aboutMe: 'About me', birthday: 'Birthday', enterName: 'Enter name', tellAboutYourself: 'Tell about yourself', removePhoto: 'Remove photo', cropPhoto: 'Crop Photo', saveChanges: 'Save Changes', displayName: 'Display Name', language: 'Language', chats: 'Chats', calls: 'Calls', contacts: 'Contacts', archive: 'Archive', interfaceLang: 'Interface language', theme: 'Theme', russian: 'Русский', english: 'English', about: 'About', version: 'Version', modernMessenger: 'A modern messenger focused', onPrivacy: 'on privacy and convenience', modernMessengerShort: 'Knot Messenger', settingsDesc: 'Manage your profile and app settings', appSettings: 'App Settings', enterDisplayName: 'How should we call you?', tellAboutBio: 'Tell us a bit about yourself...', storageAndData: 'Storage and Data', importTelegram: 'Import Telegram History', importTelegramDesc: 'Move messages and media from Telegram', importSuccess: 'Import completed', importStarted: 'Import started in background', importSelectArchive: 'Upload archive', importSelectArchiveDesc: 'Export chat from Telegram (HTML format, incl. media) and upload the resulting ZIP archive.', importLimit: 'Limit: up to 1 GB', importSelectFile: 'Select ZIP archive', importParticipants: 'Participant mapping', importParticipantsDesc: 'Assign participants from the archive to Knot users.', importInArchive: 'In archive', importSelectContact: '-- Select contact --', importGroupName: 'Chat name', importGroupNameHint: 'e.g., My Group', importStart: 'Start import', importRestart: 'Start over', importCompletedDesc: 'We successfully created the chat and started importing messages in the background.', searchChats: 'Search chats...', chat: 'Chat', group: 'Group', noChats: 'No chats — create one!', nothingFound: 'Nothing found', selectChat: 'Select a chat to start messaging', selectChatTitle: 'Select a chat', selectChatSubtext: 'Start communicating right now. All your messages are protected with end-to-end encryption.', newMessage: 'New message', noMessages: 'No messages — write the first one!', typing: 'typing...', online: 'online', wasRecently: 'was recently', members: 'members', files: 'files', clearAll: 'Clear all', maxFilesLimit: 'Maximum 20 files', searchingHistory: 'Searching history...', messageNotFound: 'Message not found', messagePlaceholder: 'Message...', message: 'Message...', addCaption: 'Add a caption...', searchMessages: 'Search messages...', searchMessagesBtn: 'Search messages', userProfile: 'User profile', userProfileUpper: 'USER PROFILE', enableSound: 'Enable sound', disableSound: 'Mute', deleteChat: 'Delete chat', messageDeleted: 'Message deleted', reply: 'Reply', copy: 'Copy', edit: 'Edit', delete: 'Delete', deleteForMe: 'Delete for me', deleteForAll: 'Delete for everyone', deleteAlsoFor: 'Delete also for', editing: 'Editing', replyTo: 'Reply', media: 'Media', download: 'Download', edited: 'edit.', selected: 'selected', fileLabel: 'File', kb: 'KB', voice: '🎤 Voice', photo: '🖼 Photo', video: '🎬 Video', file: 'File', call: 'Call', videoCall: 'Video call', incomingCall: 'Incoming call', incomingVideoCall: 'Incoming video call', calling: 'Calling...', isCalling: 'is calling...', groupCall: 'Group call', comingSoon: 'Coming soon', accept: 'Accept', decline: 'Decline', endCall: 'End call', callEnded: 'Call ended', callDeclined: 'Call declined', audioCall: 'Audio call', missedCall: 'Missed call', declinedCall: 'Declined call', cancelledCall: 'Cancelled call', completedCall: 'Call completed', photoVideo: 'Photo / video', fileBtn: 'File', sendError: 'Send error', newChat: 'New chat', add: 'Add', menu: 'Menu', months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], weekDays: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], clear: 'Clear', today: 'Today', newChatTitle: 'New Chat', selectMembers: 'Select members', newGroup: 'New Group', groupNamePlaceholder: 'Group name...', membersCount: 'Members', createGroup: 'Create Group', upTo200: 'Up to 200 members', findUser: 'Find user by name or @username...', addMembers: 'Add members...', usersNotFound: 'Users not found', enterNameOrUsername: 'Enter name or @username', next: 'Next', pinMessage: 'Pin', unpinMessage: 'Unpin', pinnedMessage: 'Pinned message', forwardMessage: 'Forward message', forward: 'Forward', forwardedFrom: 'Forwarded from', replyWithQuote: 'Reply with quote', select: 'Select', sending: 'Sending...', scheduleMessage: 'Schedule', scheduleSend: 'Send scheduled', scheduled: 'Scheduled', myStory: 'My story', newStory: 'New story', textStory: 'Text', imageStory: 'Photo', mediaStory: 'Media', typeYourStory: 'Write your story...', publishStory: 'Publish', stories: 'Stories', clearChat: 'Clear chat', clearChatConfirm: 'Clear chat history for yourself? The other person will keep their history.', clearHistory: 'Clear history', clearHistoryConfirm: 'Clear history?', deleteChatConfirm: 'Delete this chat? This action cannot be undone. The chat will be removed for all participants.', deleteGroupChatConfirm: 'Delete this chat? This action cannot be undone. The chat will be removed for all participants.', pinChat: 'Pin chat', unpinChat: 'Unpin chat', chatCleared: 'Chat cleared', poll: 'Poll', pollTab: 'Polls', createPoll: 'Create Poll', pollQuestion: 'Question', pollQuestionPlaceholder: 'Ask a question...', pollOptions: 'Options', pollOption: 'Option', addOption: 'Add Option', pollSettings: 'Settings', anonymousVoting: 'Anonymous Voting', multipleAnswers: 'Multiple Answers', singleAnswer: 'Single Answer', anonymous: 'Anonymous', votes: 'votes', pollButton: 'Poll', groupSettings: 'Group settings', editGroupName: 'Edit name', addMember: 'Add member', removeMember: 'Remove from group', leaveGroup: 'Leave group', adminBadge: 'Admin', groupDescription: 'Description', noDescription: 'No description', memberBadge: 'Member', screenShare: 'Screen share', stopScreenShare: 'Stop sharing', switchCamera: 'Switch camera', showInChat: 'Show in chat', minimize: 'Minimize', volume: 'Volume', mute: 'Mute', unmute: 'Unmute', noiseSuppressionOn: 'Noise suppression on', noiseSuppressionOff: 'Noise suppression off', selectMicrophone: 'Select microphone', microphone: 'Microphone', rightClickVolume: 'Right-click to adjust volume', participants: 'participants', joinCall: 'Join call', activeCall: 'Active call', groupNameRequired: 'Enter a group name', confirmRemoveMember: 'Remove this member from the group?', yes: 'Yes', no: 'No', you: 'you', // Stories Editor cropVideo: 'Video Crop', cropTool: 'Crop', trimVideo: 'Trim Video', trim: 'Trim', reset: 'Reset', startCreation: 'Start Creation', brushTool: 'Brush', textTool: 'Text', stickersTool: 'Stickers', filtersTool: 'Filters', textContent: 'Content', typography: 'Typography', textSize: 'Size', textColor: 'Color', brushThickness: 'Thickness', clearCanvas: 'Clear Canvas', correctionMaster: 'Correction Master', brightness: 'Brightness', contrast: 'Contrast', saturation: 'Saturation', sepia: 'Sepia', bgColor: 'Background', clickToChooseColor: 'Click to choose color', done: 'Done', stop: 'Stop', zoomHint: 'Mouse wheel to zoom', secSelected: 'sec selected', muted: 'Muted', unmuted: 'Unmuted', muteVideo: 'Mute Video', unmuteVideo: 'Unmute Video', interactive: 'Interactive', apply: 'Apply', zoom: 'Zoom', rotation: 'Rotation', // User profile mediaTab: 'Media', gifs: 'GIF', filesTab: 'Files', linksTab: 'Links', profileTitle: 'Profile', removeAvatar: 'Remove avatar', namePlaceholder: 'Name', notSpecified: 'Not specified', onKnotSince: 'On Knot since', joined: 'Joined', cancel: 'Cancel', confirm: 'Confirm', save: 'Save', sharedPhotos: 'Shared photos and videos will appear here', sharedFiles: 'Shared files will appear here', sharedLinks: 'Shared links will appear here', profileNotFound: 'Profile not found', storiesTab: 'Stories', publicationsTab: 'Publications', noStories: 'No stories yet', noBio: 'No information shared yet', goToMessage: 'Go to message', story: 'Story', commonGroups: 'Common groups', more: 'More', empty: 'Empty', acceptRequest: 'Accept Request', typingText: 'typing', emojiFrequent: 'Frequent', emojiGestures: 'Gestures', emojiEmotions: 'Emotions', emojiObjects: 'Objects', emojiFood: 'Food', emojiNature: 'Nature', login: 'Login', register: 'Register', latinOnly: '(latin only, cannot be changed)', displayNameLabel: 'Display name', displayNamePlaceholder: 'Your name (any language)', password: 'Password', passwordPlaceholder: 'Enter password', bioPlaceholder: 'Tell about yourself (optional)', loginBtn: 'Login', createAccount: 'Create account', testAccounts: 'Test accounts: evgeniy, anastasia, artem, polina', passwordForAll: 'Password for all:', dontHaveAccount: "Don't have an account?", alreadyHaveAccount: 'Already have an account?', passwordRequirements: 'At least 8 characters, letters and numbers', registerNow: 'Register', loginNow: 'Login', fileTooLarge: 'File too large (max 200MB)', dropFileHere: 'Drop file here', uploading: 'Uploading...', uploadError: 'File upload error', changePhoto: 'Change photo', remove: 'Remove', formatBold: 'Bold', formatBoldHint: '**text**', formatItalic: 'Italic', formatItalicHint: '_text_', formatStrike: 'Strikethrough', formatStrikeHint: '~text~', formatMono: 'Monospace', formatMonoHint: '`text`', draft: 'Draft:', datePlaceholder: 'mm/dd/yyyy', tenorKeyRequired: 'Tenor API key required for GIFs', openConsoleRun: 'Open console and run:', searchGifs: 'Search GIFs...', trending: 'Trending', error: 'Error', friends: 'Contacts', friendRequests: 'Contact requests', friendsList: 'Contacts list', noFriends: 'No contacts yet', addFriend: 'Add to contacts', removeFriend: 'Remove from contacts', requestSent: 'Request sent', searchFriends: 'Search by @username (min. 3 chars)', searchResults: 'Search Results', noSearchResults: 'No users found', minCharsHint: 'Enter at least 3 characters after @', selectContactToChat: 'Select a contact from the list to start a conversation or use search to find new people.', backToChats: 'Back to Chats', storyViewers: 'Who viewed', noViewers: 'No one viewed yet', replyToStory: 'Reply to story...', send: 'Send', favorites: 'Favorites', favoritesDescription: 'Save important messages here', privacy: 'Privacy', hideStoryViews: 'Hide story views', hideStoryViewsDesc: 'Others won\'t see that you viewed their story', scheduledFor: 'Scheduled for', messageScheduled: 'Message scheduled', scheduledDelivered: 'Message sent to', scheduledDeliveredAt: 'at', scheduleIn1h: 'In 1 hour', scheduleIn3h: 'In 3 hours', scheduleTomorrow: 'Tomorrow at 9:00', scheduleCustom: 'Choose date & time', scheduleTime: 'Time', scheduleDate: 'Date', lastSeenAt: 'was', justNow: 'just now', loadStoriesError: 'Error loading stories', loadChatsError: 'Error loading chats', loadMessagesError: 'Error loading messages', unreadMessages: 'Unread messages', typeYourStoryPlaceholder: 'Write your story...', uploadMedia: 'Upload media', chooseBackground: 'Background', viewedBy: 'Viewed by', storyDetails: 'Details', viewCountSuffix: 'people viewed this story', storyPrivacyNote: 'Stories are encrypted and disappear in 24 hours. View receipts are only visible to you.', storiesEditor: 'Stories Editor', tools: 'Tools', privacyNote: 'Choose who can view your new story.', allUsers: 'All users', onlyContacts: 'Only contacts', selectedContacts: 'Selected contacts', yourStory: 'Your story', stickers: 'Stickers', brush: 'Brush', filters: 'Filters', report: 'Report', attachmentDiscardConfirm: 'You have attached files. If you switch to another chat, they will be lost. Continue?', }, } as const; interface LangState { lang: Lang; setLang: (lang: Lang) => void; t: (key: keyof typeof translations['ru']) => any; } export const useLang = create((set, get) => ({ lang: (localStorage.getItem(LANG_KEY) as Lang) || 'ru', setLang: (lang) => { localStorage.setItem(LANG_KEY, lang); set({ lang }); }, t: (key) => { const { lang } = get(); return translations[lang][key] || translations['ru'][key] || key; }, }));