feat(frontend): storage, trash, policy, stories, shares, jobs, bots, media, login and notes speak russian and english
This commit is contained in:
1 parent
e5a5edcaae
commit
4a5c92f0e9
51 files changed
+1504
-588
No files matched your search
@@ -0,0 +1,29 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const bots = {
|
||||
"bots.account": { en: "account {id}", ru: "аккаунт {id}" },
|
||||
"bots.add": { en: "Add", ru: "Добавить" },
|
||||
"bots.badToken": {
|
||||
en: "That doesn't look like a bot token",
|
||||
ru: "Не похоже на токен бота",
|
||||
},
|
||||
"bots.disconnect": { en: "Disconnect", ru: "Отключить" },
|
||||
"bots.empty": { en: "No bots yet.", ru: "Ботов пока нет." },
|
||||
"bots.history": {
|
||||
en: "The past comes from the queue of undelivered updates Telegram keeps for the bot. Bots can't read chat history, so nothing older than that queue can be reached. In private chats the bot sees everyone who wrote to it; in groups it sees everything only with privacy mode off. Disconnecting removes the token and the session, the archive stays.",
|
||||
ru: "Прошлое подтягивается из очереди недоставленных апдейтов, которую Telegram держит для бота; история диалогов боту запрещена, глубже этой очереди заглянуть нельзя. В личке бот видит каждого, кто ему написал; в группах всё, но только при выключенном privacy mode. Отключение убирает токен и сессию, архив остаётся.",
|
||||
},
|
||||
"bots.login": {
|
||||
en: "The bot signs in over MTProto with a separate authorization. It doesn't take getUpdates away from whoever runs the same bot through the Bot API, and needs no webhook. From then on it's a regular archive account: chats, messages, media and group members show up in the same place as the other accounts' chats.",
|
||||
ru: "Бот входит по MTProto отдельной авторизацией. Это не отнимает getUpdates у того, кто держит того же бота через Bot API, и не требует вебхука. Дальше он становится обычным аккаунтом архива: чаты, сообщения, медиа и участники групп видны там же, где переписка остальных аккаунтов.",
|
||||
},
|
||||
"bots.status.error": { en: "error", ru: "ошибка" },
|
||||
"bots.status.ok": { en: "listening", ru: "слушает" },
|
||||
"bots.status.pending": { en: "connecting", ru: "подключается" },
|
||||
"bots.status.removed": { en: "disconnected", ru: "отключён" },
|
||||
"bots.status.unauthorized": { en: "token rejected", ru: "токен отклонён" },
|
||||
"bots.token": {
|
||||
en: "Bot token from @BotFather",
|
||||
ru: "Токен бота от @BotFather",
|
||||
},
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,84 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const jobs = {
|
||||
"jobs.backfill": { en: "Backfill", ru: "Бэкфилл" },
|
||||
"jobs.backfillFailed": {
|
||||
en: "Could not start the backfill",
|
||||
ru: "Не удалось запустить бэкфилл",
|
||||
},
|
||||
"jobs.backfillHint": {
|
||||
en: "A full backfill rereads the whole chat history from the very beginning. The button in the chat header only loads messages newer than the last saved one.",
|
||||
ru: "Полный бэкфилл перечитывает всю историю чата с самого начала. Кнопка в шапке чата догружает только сообщения новее последнего сохранённого.",
|
||||
},
|
||||
"jobs.backfillStarted": {
|
||||
en: "Full backfill started",
|
||||
ru: "Полный бэкфилл запущен",
|
||||
},
|
||||
"jobs.chat": { en: "chat {id}", ru: "чат {id}" },
|
||||
"jobs.contactsFailed": {
|
||||
en: "Could not sync contacts",
|
||||
ru: "Не удалось синхронизировать контакты",
|
||||
},
|
||||
"jobs.contactsHint": {
|
||||
en: "Contacts are synced separately, then search finds people you haven't chatted with yet.",
|
||||
ru: "Контакты подтягиваются отдельно, тогда в поиске появятся люди, с которыми ещё не было переписки.",
|
||||
},
|
||||
"jobs.contactsStarted": {
|
||||
en: "Contact sync started",
|
||||
ru: "Синхронизация контактов запущена",
|
||||
},
|
||||
"jobs.dialogs": { en: "Chats", ru: "Диалоги" },
|
||||
"jobs.dialogsHint": {
|
||||
en: "Sync pulls in every chat of the account, so old chats show up and can be backfilled.",
|
||||
ru: "Синхронизация подтягивает все диалоги аккаунта: старые чаты станут видны и доступны для бэкфилла.",
|
||||
},
|
||||
"jobs.downloadMedia": { en: "Download media", ru: "Скачивать медиа" },
|
||||
"jobs.empty": { en: "No jobs", ru: "Задач нет" },
|
||||
"jobs.floodWaits": { en: "flood wait {count}", ru: "flood-wait {count}" },
|
||||
"jobs.kind.backfill": { en: "Backfill", ru: "Бэкфилл" },
|
||||
"jobs.kind.backfill_stories": {
|
||||
en: "Stories backfill",
|
||||
ru: "Бэкфилл сторис",
|
||||
},
|
||||
"jobs.kind.enrich_chat": { en: "Chat enrichment", ru: "Обогащение чата" },
|
||||
"jobs.kind.fetch_avatar": { en: "Avatar", ru: "Аватар" },
|
||||
"jobs.kind.fetch_custom_emoji": { en: "Custom emoji", ru: "Кастом-эмодзи" },
|
||||
"jobs.kind.fetch_media": { en: "Media download", ru: "Докачка медиа" },
|
||||
"jobs.kind.fetch_read_info": { en: "Read time", ru: "Время прочтения" },
|
||||
"jobs.kind.full": { en: "{kind} (full)", ru: "{kind} (полный)" },
|
||||
"jobs.kind.newer": { en: "{kind} (new only)", ru: "{kind} (новые)" },
|
||||
"jobs.kind.sync_contacts": {
|
||||
en: "Contact sync",
|
||||
ru: "Синхронизация контактов",
|
||||
},
|
||||
"jobs.kind.sync_dialogs": { en: "Chat sync", ru: "Синхронизация диалогов" },
|
||||
"jobs.kind.transcribe": { en: "Transcription", ru: "Расшифровка" },
|
||||
"jobs.noChat": { en: "No chat selected", ru: "Чат не выбран" },
|
||||
"jobs.processed": { en: "processed {count}", ru: "обработано {count}" },
|
||||
"jobs.startBackfill": {
|
||||
en: "Start full backfill",
|
||||
ru: "Запустить полный бэкфилл",
|
||||
},
|
||||
"jobs.status.canceled": { en: "Canceled", ru: "Отменено" },
|
||||
"jobs.status.done": { en: "Done", ru: "Готово" },
|
||||
"jobs.status.failed": { en: "Failed", ru: "Ошибка" },
|
||||
"jobs.status.paused": { en: "Paused", ru: "Пауза" },
|
||||
"jobs.status.pending": { en: "Queued", ru: "В очереди" },
|
||||
"jobs.status.running": { en: "Running", ru: "Выполняется" },
|
||||
"jobs.stop": { en: "Stop", ru: "Стоп" },
|
||||
"jobs.stopFailed": {
|
||||
en: "Could not stop the job",
|
||||
ru: "Не удалось остановить задачу",
|
||||
},
|
||||
"jobs.syncContacts": { en: "Sync contacts", ru: "Синхронизировать контакты" },
|
||||
"jobs.syncDialogs": { en: "Sync chats", ru: "Синхронизировать диалоги" },
|
||||
"jobs.syncFailed": {
|
||||
en: "Could not sync chats",
|
||||
ru: "Не удалось синхронизировать диалоги",
|
||||
},
|
||||
"jobs.syncStarted": {
|
||||
en: "Chat sync started",
|
||||
ru: "Синхронизация диалогов запущена",
|
||||
},
|
||||
"jobs.title": { en: "Jobs", ru: "Задачи" },
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,49 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const login = {
|
||||
"login.added": { en: "Account added", ru: "Аккаунт добавлен" },
|
||||
"login.byPhone": {
|
||||
en: "Log in by phone number",
|
||||
ru: "Войти по номеру телефона",
|
||||
},
|
||||
"login.code": { en: "Code", ru: "Код подтверждения" },
|
||||
"login.continue": { en: "Next", ru: "Продолжить" },
|
||||
"login.failed": { en: "Could not log in", ru: "Не удалось войти" },
|
||||
"login.hint.code": {
|
||||
en: "The code was sent to Telegram on this number.",
|
||||
ru: "Код отправлен в Telegram на этот номер.",
|
||||
},
|
||||
"login.hint.password": {
|
||||
en: "The account is protected with two-step verification.",
|
||||
ru: "Аккаунт защищён двухэтапной аутентификацией.",
|
||||
},
|
||||
"login.hint.phone": {
|
||||
en: "Phone number in international format, for example +79991234567.",
|
||||
ru: "Номер телефона в международном формате, например +79991234567.",
|
||||
},
|
||||
"login.hint.qr": {
|
||||
en: "In Telegram open Settings → Devices → Link Desktop Device and point the camera at the code.",
|
||||
ru: "Telegram → Настройки → Устройства → Подключить устройство, и наведите камеру на код.",
|
||||
},
|
||||
"login.invalid": { en: "Invalid token", ru: "Неверный токен" },
|
||||
"login.password": { en: "Cloud password", ru: "Облачный пароль" },
|
||||
"login.passwordPlaceholder": { en: "Password", ru: "Пароль" },
|
||||
"login.phone": { en: "Phone number", ru: "Номер телефона" },
|
||||
"login.qr": { en: "QR code", ru: "QR-код" },
|
||||
"login.qrFailed": {
|
||||
en: "Could not get the QR code",
|
||||
ru: "Не удалось получить QR-код",
|
||||
},
|
||||
"login.qrLabel": {
|
||||
en: "QR code to log in to Telegram",
|
||||
ru: "QR-код для входа в Telegram",
|
||||
},
|
||||
"login.sendCode": { en: "Send code", ru: "Отправить код" },
|
||||
"login.submit": { en: "Log in", ru: "Войти" },
|
||||
"login.subtitle": {
|
||||
en: "Enter your access token to continue.",
|
||||
ru: "Введите токен доступа, чтобы продолжить.",
|
||||
},
|
||||
"login.title": { en: "Add account", ru: "Добавить аккаунт" },
|
||||
"login.token": { en: "Access token", ru: "Токен доступа" },
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,51 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const media = {
|
||||
"media.attachment": { en: "Attachment", ru: "Вложение" },
|
||||
"media.downloadToArchive": {
|
||||
en: "Download to archive",
|
||||
ru: "Скачать в архив",
|
||||
},
|
||||
"media.hideTranscription": {
|
||||
en: "Hide transcription",
|
||||
ru: "Скрыть расшифровку",
|
||||
},
|
||||
"media.loadFailed": {
|
||||
en: "Could not load the media",
|
||||
ru: "Не удалось загрузить медиа",
|
||||
},
|
||||
"media.missing": { en: "File not found.", ru: "Файл не найден." },
|
||||
"media.notDownloaded": {
|
||||
en: "The file isn't in the archive yet.",
|
||||
ru: "Файл ещё не скачан в архив.",
|
||||
},
|
||||
"media.playRound": {
|
||||
en: "Play video message",
|
||||
ru: "Воспроизвести кружок",
|
||||
},
|
||||
"media.playVoice": {
|
||||
en: "Play voice message",
|
||||
ru: "Воспроизвести голосовое",
|
||||
},
|
||||
"media.queued": {
|
||||
en: "Download queued",
|
||||
ru: "Скачивание поставлено в очередь",
|
||||
},
|
||||
"media.queueFailed": {
|
||||
en: "Could not queue the download",
|
||||
ru: "Не удалось поставить в очередь",
|
||||
},
|
||||
"media.showTranscription": {
|
||||
en: "Show transcription",
|
||||
ru: "Показать расшифровку",
|
||||
},
|
||||
"media.transcribeFailed": {
|
||||
en: "Could not transcribe",
|
||||
ru: "Не удалось расшифровать",
|
||||
},
|
||||
"media.transcription": { en: "Transcription", ru: "Расшифровка" },
|
||||
"media.unit.B": { en: "B", ru: "Б" },
|
||||
"media.unit.GB": { en: "GB", ru: "ГБ" },
|
||||
"media.unit.KB": { en: "KB", ru: "КБ" },
|
||||
"media.unit.MB": { en: "MB", ru: "МБ" },
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,11 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const notes = {
|
||||
"notes.add": { en: "Add note", ru: "Добавить заметку" },
|
||||
"notes.edit": { en: "Edit", ru: "Изменить" },
|
||||
"notes.placeholder": {
|
||||
en: "Note on the message…",
|
||||
ru: "Заметка к сообщению…",
|
||||
},
|
||||
"notes.title": { en: "Notes", ru: "Заметки" },
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,146 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const policy = {
|
||||
"policy.add.chat": { en: "Rule for a chat", ru: "Правило для чата" },
|
||||
"policy.add.folder": { en: "Rule for a folder", ru: "Правило для папки" },
|
||||
"policy.chip.allOff": { en: "All off", ru: "Всё выключено" },
|
||||
"policy.chip.allOn": { en: "All on", ru: "Всё включено" },
|
||||
"policy.chip.settings": {
|
||||
en: { one: "{count} setting", other: "{count} settings" },
|
||||
ru: {
|
||||
few: "{count} настройки",
|
||||
many: "{count} настроек",
|
||||
one: "{count} настройка",
|
||||
other: "{count} настройки",
|
||||
},
|
||||
},
|
||||
"policy.default.channel": { en: "Channels", ru: "Каналы" },
|
||||
"policy.default.dm": { en: "Private chats", ru: "Личные чаты" },
|
||||
"policy.default.group": { en: "Groups", ru: "Группы" },
|
||||
"policy.except.backfill": { en: "backfill", ru: "бэкфилла" },
|
||||
"policy.except.media": { en: "media", ru: "медиа" },
|
||||
"policy.except.messages": { en: "messages", ru: "сообщений" },
|
||||
"policy.except.presence": { en: "online status", ru: "присутствия" },
|
||||
"policy.except.profile_history": {
|
||||
en: "profile history",
|
||||
ru: "истории профиля",
|
||||
},
|
||||
"policy.except.reactions": { en: "reactions", ru: "реакций" },
|
||||
"policy.except.self_destruct_media": {
|
||||
en: "disappearing media",
|
||||
ru: "исчезающих",
|
||||
},
|
||||
"policy.except.stories": { en: "stories", ru: "сторис" },
|
||||
"policy.except.stt": { en: "transcription", ru: "расшифровки" },
|
||||
"policy.except.track_edits_deletes": {
|
||||
en: "edits and deletions",
|
||||
ru: "правок и удалений",
|
||||
},
|
||||
"policy.folder": { en: "Folder {id}", ru: "Папка {id}" },
|
||||
"policy.hint.chatInherit": {
|
||||
en: "Now follows {from}. Change anything and the chat gets its own rule.",
|
||||
ru: "Сейчас как {from}. Измени что-нибудь, и у чата появится своё правило.",
|
||||
},
|
||||
"policy.hint.chatRule": {
|
||||
en: "Without a rule it would follow {from}: {summary}.",
|
||||
ru: "Без правила было бы как {from}: {summary}.",
|
||||
},
|
||||
"policy.hint.folderNone": {
|
||||
en: "The folder has no rule, its chats follow the defaults. Pick a set to create one.",
|
||||
ru: "У папки нет правила, чаты идут по умолчаниям. Выбери набор, чтобы его создать.",
|
||||
},
|
||||
"policy.hint.folderRule": {
|
||||
en: "Applies to the folder's chats that have no rule of their own.",
|
||||
ru: "Действует на чаты папки, у которых нет своего правила.",
|
||||
},
|
||||
"policy.kind.chat": {
|
||||
en: "Chat capture policy",
|
||||
ru: "Политика захвата чата",
|
||||
},
|
||||
"policy.kind.folder": {
|
||||
en: "Folder capture policy",
|
||||
ru: "Политика захвата папки",
|
||||
},
|
||||
"policy.loadFailed": {
|
||||
en: "Could not load the policy.",
|
||||
ru: "Не удалось загрузить политику.",
|
||||
},
|
||||
"policy.parent.channel": { en: "the channel defaults", ru: "у каналов" },
|
||||
"policy.parent.default": { en: "the defaults", ru: "по умолчанию" },
|
||||
"policy.parent.dm": { en: "the private chat defaults", ru: "у личных чатов" },
|
||||
"policy.parent.folder": {
|
||||
en: "the “{title}” folder",
|
||||
ru: "у папки «{title}»",
|
||||
},
|
||||
"policy.parent.group": { en: "the group defaults", ru: "у групп" },
|
||||
"policy.parent.untitled": { en: "untitled", ru: "без названия" },
|
||||
"policy.rule.deleteFailed": {
|
||||
en: "Could not delete the rule",
|
||||
ru: "Не удалось удалить правило",
|
||||
},
|
||||
"policy.rule.drop": { en: "Remove", ru: "Убрать" },
|
||||
"policy.rule.dropFailed": {
|
||||
en: "Could not remove the rule",
|
||||
ru: "Не удалось убрать правило",
|
||||
},
|
||||
"policy.rule.loadFailed": {
|
||||
en: "Could not load the rule",
|
||||
ru: "Не удалось загрузить правило",
|
||||
},
|
||||
"policy.rule.new": { en: "New rule", ru: "Новое правило" },
|
||||
"policy.rule.redundant": { en: "Changes nothing", ru: "Ничего не меняет" },
|
||||
"policy.rule.remove": { en: "Delete rule", ru: "Удалить правило" },
|
||||
"policy.rule.removeConfirm": {
|
||||
en: "Delete the rule?",
|
||||
ru: "Удалить правило?",
|
||||
},
|
||||
"policy.rule.saveFailed": {
|
||||
en: "Could not save the rule",
|
||||
ru: "Не удалось сохранить правило",
|
||||
},
|
||||
"policy.section.chats": { en: "Chats", ru: "Чаты" },
|
||||
"policy.section.chatsHint": {
|
||||
en: "What differs from the folder or the default. Chats beat folders.",
|
||||
ru: "Что меняют против папки или умолчания. Важнее папок.",
|
||||
},
|
||||
"policy.section.defaults": { en: "Defaults", ru: "По умолчанию" },
|
||||
"policy.section.folders": { en: "Folders", ru: "Папки" },
|
||||
"policy.section.foldersHint": {
|
||||
en: "What gets saved. If several folders match, the first one wins.",
|
||||
ru: "Что сохраняют. Из подходящих папок побеждает первая.",
|
||||
},
|
||||
"policy.summary.all": { en: "Everything", ru: "Всё" },
|
||||
"policy.summary.except": {
|
||||
en: "Everything except {list}",
|
||||
ru: "Всё, кроме {list}",
|
||||
},
|
||||
"policy.summary.messagesOnly": {
|
||||
en: "Messages only",
|
||||
ru: "Только сообщения",
|
||||
},
|
||||
"policy.summary.more": {
|
||||
en: "{names} and {count} more",
|
||||
ru: "{names} и ещё {count}",
|
||||
},
|
||||
"policy.summary.none": { en: "Nothing", ru: "Ничего" },
|
||||
"policy.summary.pair": { en: "{a} and {b}", ru: "{a} и {b}" },
|
||||
"policy.toggle.backfill": { en: "Backfill", ru: "Бэкфилл" },
|
||||
"policy.toggle.media": { en: "Media", ru: "Медиа" },
|
||||
"policy.toggle.messages": { en: "Messages", ru: "Сообщения" },
|
||||
"policy.toggle.presence": { en: "Online status", ru: "Присутствие" },
|
||||
"policy.toggle.profile_history": {
|
||||
en: "Profile history",
|
||||
ru: "История профиля",
|
||||
},
|
||||
"policy.toggle.reactions": { en: "Reactions", ru: "Реакции" },
|
||||
"policy.toggle.self_destruct_media": {
|
||||
en: "Disappearing media",
|
||||
ru: "Исчезающие",
|
||||
},
|
||||
"policy.toggle.stories": { en: "Stories", ru: "Сторис" },
|
||||
"policy.toggle.stt": { en: "Transcription", ru: "Расшифровка" },
|
||||
"policy.toggle.track_edits_deletes": {
|
||||
en: "Edits and deletions",
|
||||
ru: "Правки, удаления",
|
||||
},
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,139 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const shares = {
|
||||
"shares.checkFailed": {
|
||||
en: "Could not check the link",
|
||||
ru: "Не удалось проверить ссылку",
|
||||
},
|
||||
"shares.copied": { en: "Link copied", ru: "Ссылка скопирована" },
|
||||
"shares.copy": { en: "Copy link", ru: "Копировать ссылку" },
|
||||
"shares.copyFailed": {
|
||||
en: "Could not copy the link",
|
||||
ru: "Не удалось скопировать ссылку",
|
||||
},
|
||||
"shares.days": {
|
||||
en: { one: "{count} day", other: "{count} days" },
|
||||
ru: {
|
||||
few: "{count} дня",
|
||||
many: "{count} дней",
|
||||
one: "{count} день",
|
||||
other: "{count} дня",
|
||||
},
|
||||
},
|
||||
"shares.downloads": {
|
||||
en: { one: "{count} download", other: "{count} downloads" },
|
||||
ru: {
|
||||
few: "{count} скачивания",
|
||||
many: "{count} скачиваний",
|
||||
one: "{count} скачивание",
|
||||
other: "{count} скачивания",
|
||||
},
|
||||
},
|
||||
"shares.downloadsOf": { en: "{count} of {max}", ru: "{count} из {max}" },
|
||||
"shares.empty.hint": {
|
||||
en: "Share a file from the media menu",
|
||||
ru: "Откройте доступ к файлу из меню медиа",
|
||||
},
|
||||
"shares.empty.title": { en: "Nothing shared", ru: "Ничего не открыто" },
|
||||
"shares.expired": { en: "expired {date}", ru: "истекла {date}" },
|
||||
"shares.file": { en: "file", ru: "файл" },
|
||||
"shares.footnote": {
|
||||
en: {
|
||||
one: "{count} link · preview crawlers don't count as downloads",
|
||||
other: "{count} links · preview crawlers don't count as downloads",
|
||||
},
|
||||
ru: {
|
||||
few: "{count} ссылки · превью-краулеры не списывают скачивания",
|
||||
many: "{count} ссылок · превью-краулеры не списывают скачивания",
|
||||
one: "{count} ссылка · превью-краулеры не списывают скачивания",
|
||||
other: "{count} ссылки · превью-краулеры не списывают скачивания",
|
||||
},
|
||||
},
|
||||
"shares.forever": { en: "no expiry", ru: "бессрочно" },
|
||||
"shares.forget": { en: "Remove from list", ru: "Убрать из списка" },
|
||||
"shares.forgetFailed": {
|
||||
en: "Could not remove the entry",
|
||||
ru: "Не удалось удалить запись",
|
||||
},
|
||||
"shares.hours": {
|
||||
en: { one: "{count} hour", other: "{count} hours" },
|
||||
ru: {
|
||||
few: "{count} часа",
|
||||
many: "{count} часов",
|
||||
one: "{count} час",
|
||||
other: "{count} часа",
|
||||
},
|
||||
},
|
||||
"shares.keep": { en: "As is", ru: "Как есть" },
|
||||
"shares.lastDownload": {
|
||||
en: "Last download: {date}",
|
||||
ru: "Последнее скачивание: {date}",
|
||||
},
|
||||
"shares.lifetime": { en: "Link lifetime", ru: "Срок жизни ссылки" },
|
||||
"shares.limit": { en: "Download limit", ru: "Лимит скачиваний" },
|
||||
"shares.listFailed": {
|
||||
en: "Could not load the links",
|
||||
ru: "Не удалось загрузить список ссылок",
|
||||
},
|
||||
"shares.newLink": { en: "New link", ru: "Новая ссылка" },
|
||||
"shares.noChat": { en: "No chat", ru: "Без чата" },
|
||||
"shares.noExpiry": { en: "No expiry", ru: "Бессрочно" },
|
||||
"shares.noLimit": { en: "No limit", ru: "Без лимита" },
|
||||
"shares.opened": { en: "Link sharing is on", ru: "Доступ по ссылке открыт" },
|
||||
"shares.openFailed": {
|
||||
en: "Could not share the file",
|
||||
ru: "Не удалось открыть доступ",
|
||||
},
|
||||
"shares.private": {
|
||||
en: "Only you can access it now",
|
||||
ru: "Сейчас доступен только вам",
|
||||
},
|
||||
"shares.publicHint": {
|
||||
en: "Anyone with the link can open the file. You can revoke it at any time.",
|
||||
ru: "Файл откроется всем, у кого есть ссылка. Отозвать можно в любой момент.",
|
||||
},
|
||||
"shares.publish": { en: "Create link", ru: "Открыть доступ" },
|
||||
"shares.qr.hide": { en: "Hide QR code", ru: "Скрыть QR-код" },
|
||||
"shares.qr.label": {
|
||||
en: "QR code of the file link",
|
||||
ru: "QR-код ссылки на файл",
|
||||
},
|
||||
"shares.qr.show": { en: "Show QR code", ru: "Показать QR-код" },
|
||||
"shares.raw.after": {
|
||||
en: " downloads it under its real name. Telegram preview crawlers don't count as downloads.",
|
||||
ru: " скачает под настоящим именем. Превью-краулеры Telegram скачивания не списывают.",
|
||||
},
|
||||
"shares.raw.before": {
|
||||
en: "The link serves the file as is: images and videos open right in the browser, ",
|
||||
ru: "Ссылка отдаёт файл как есть: картинки и видео откроются прямо в браузере, ",
|
||||
},
|
||||
"shares.reissue": { en: "Issue a new link", ru: "Выдать новую ссылку" },
|
||||
"shares.reissued": { en: "New link issued", ru: "Выдана новая ссылка" },
|
||||
"shares.reissueFailed": {
|
||||
en: "Could not reissue the link",
|
||||
ru: "Не удалось перевыпустить ссылку",
|
||||
},
|
||||
"shares.revoke": { en: "Revoke", ru: "Отозвать" },
|
||||
"shares.revoked": { en: "revoked", ru: "отозвана" },
|
||||
"shares.revokedToast": { en: "Access revoked", ru: "Доступ отозван" },
|
||||
"shares.revokeFailed": {
|
||||
en: "Could not revoke access",
|
||||
ru: "Не удалось отозвать доступ",
|
||||
},
|
||||
"shares.state.active": { en: "Active", ru: "Открыт" },
|
||||
"shares.state.exhausted": { en: "Limit reached", ru: "Лимит исчерпан" },
|
||||
"shares.state.expired": { en: "Expired", ru: "Истёк" },
|
||||
"shares.state.revoked": { en: "Revoked", ru: "Отозван" },
|
||||
"shares.tab.active": { en: "Active", ru: "Открытые" },
|
||||
"shares.tab.all": { en: "All", ru: "Все" },
|
||||
"shares.toMessage": { en: "Go to message", ru: "К сообщению" },
|
||||
"shares.until": { en: "until {date}", ru: "до {date}" },
|
||||
"shares.updated": {
|
||||
en: "Link settings updated",
|
||||
ru: "Настройки ссылки обновлены",
|
||||
},
|
||||
"shares.updateFailed": {
|
||||
en: "Could not update the link",
|
||||
ru: "Не удалось обновить ссылку",
|
||||
},
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,17 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const social = {
|
||||
"social.callbacks": { en: "Callback data", ru: "Callback-данные" },
|
||||
"social.callbacks.empty": {
|
||||
en: "No callback buttons",
|
||||
ru: "Нет callback-кнопок",
|
||||
},
|
||||
"social.links": { en: "Links", ru: "Ссылки" },
|
||||
"social.links.empty": { en: "No links", ru: "Нет ссылок" },
|
||||
"social.reactions": { en: "Reactions", ru: "Реакции" },
|
||||
"social.reactions.empty": { en: "No reactions", ru: "Нет реакций" },
|
||||
"social.reactions.removed": {
|
||||
en: "removed · {date}",
|
||||
ru: "снято · {date}",
|
||||
},
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,234 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const storage = {
|
||||
"storage.blocked": {
|
||||
en: "A file is used in a story or avatar and stayed on disk",
|
||||
ru: "Файл занят в сторис или аватаре и остался на диске",
|
||||
},
|
||||
"storage.cantRefetch": {
|
||||
en: "{count} can't be downloaded again",
|
||||
ru: "{count} не скачать заново",
|
||||
},
|
||||
"storage.chatFiles": { en: "All chat files", ru: "Все файлы чата" },
|
||||
"storage.deselect": { en: "Deselect", ru: "Снять" },
|
||||
"storage.empty.all": {
|
||||
en: "No downloaded files on disk.",
|
||||
ru: "На диске нет скачанных файлов.",
|
||||
},
|
||||
"storage.empty.chat": {
|
||||
en: "No downloaded files in this chat.",
|
||||
ru: "В этом чате нет скачанных файлов.",
|
||||
},
|
||||
"storage.empty.group": {
|
||||
en: "No files in this group.",
|
||||
ru: "В этой группе нет файлов.",
|
||||
},
|
||||
"storage.failed": { en: "Something went wrong", ru: "Не получилось" },
|
||||
"storage.files": {
|
||||
en: { one: "{n} file", other: "{n} files" },
|
||||
ru: {
|
||||
few: "{n} файла",
|
||||
many: "{n} файлов",
|
||||
one: "{n} файл",
|
||||
other: "{n} файла",
|
||||
},
|
||||
},
|
||||
"storage.freed": {
|
||||
en: "{size} will be freed in 7 days",
|
||||
ru: "{size} освободится через 7 дней",
|
||||
},
|
||||
"storage.gone": { en: "Can't be downloaded again", ru: "Не скачать заново" },
|
||||
"storage.group.audio": { en: "Audio", ru: "Аудио" },
|
||||
"storage.group.file": { en: "Files", ru: "Файлы" },
|
||||
"storage.group.other": { en: "Photos and other", ru: "Фото и прочее" },
|
||||
"storage.group.video": { en: "Videos", ru: "Видео" },
|
||||
"storage.group.voice": {
|
||||
en: "Voice and video messages",
|
||||
ru: "Кружки и голосовые",
|
||||
},
|
||||
"storage.heaviest": { en: "Largest", ru: "Самые тяжёлые" },
|
||||
"storage.heavy": {
|
||||
en: "{files} over {threshold} = {size}",
|
||||
ru: "{files} крупнее {threshold} = {size}",
|
||||
},
|
||||
"storage.hero.chat": {
|
||||
en: "{files} in this chat",
|
||||
ru: "{files} в этом чате",
|
||||
},
|
||||
"storage.hero.disk": { en: "{files} on disk", ru: "{files} на диске" },
|
||||
"storage.hero.trash": {
|
||||
en: "{files} · {size} more in the trash",
|
||||
ru: "{files} · ещё {size} в корзине",
|
||||
},
|
||||
"storage.inChat": { en: "in this chat", ru: "в этом чате" },
|
||||
"storage.inFolder": {
|
||||
en: {
|
||||
one: "in {count} chat of the folder",
|
||||
other: "in {count} chats of the folder",
|
||||
},
|
||||
ru: {
|
||||
few: "в {count} чатах папки",
|
||||
many: "в {count} чатах папки",
|
||||
one: "в {count} чате папки",
|
||||
other: "в {count} чатах папки",
|
||||
},
|
||||
},
|
||||
"storage.inMessages": {
|
||||
en: { one: "in {count} message", other: "in {count} messages" },
|
||||
ru: {
|
||||
few: "в {count} сообщениях",
|
||||
many: "в {count} сообщениях",
|
||||
one: "в {count} сообщении",
|
||||
other: "в {count} сообщениях",
|
||||
},
|
||||
},
|
||||
"storage.inTrash": { en: "{files} in the trash", ru: "{files} в корзине" },
|
||||
"storage.listing.chats": { en: "Chats", ru: "Чаты" },
|
||||
"storage.listing.files": { en: "Files", ru: "Файлы" },
|
||||
"storage.loadFailed": {
|
||||
en: "Could not load the storage.",
|
||||
ru: "Не удалось загрузить хранилище.",
|
||||
},
|
||||
"storage.menu.chatFiles": { en: "Chat files", ru: "Файлы чата" },
|
||||
"storage.menu.openChat": { en: "Open chat", ru: "Перейти в чат" },
|
||||
"storage.menu.policy": { en: "Capture policy", ru: "Политика захвата" },
|
||||
"storage.purge.days": {
|
||||
en: { one: "in {count} day", other: "in {count} days" },
|
||||
ru: "через {count} дн.",
|
||||
},
|
||||
"storage.purge.today": { en: "today", ru: "сегодня" },
|
||||
"storage.purge.tomorrow": { en: "tomorrow", ru: "завтра" },
|
||||
"storage.restore": { en: "Restore", ru: "Вернуть" },
|
||||
"storage.restoreFailed": {
|
||||
en: "Could not restore the files",
|
||||
ru: "Не удалось вернуть файлы",
|
||||
},
|
||||
"storage.scope.confirm": {
|
||||
en: {
|
||||
one: "{files}, {size}, will move to the trash and stop downloading on its own.",
|
||||
other:
|
||||
"{files}, {size}, will move to the trash and stop downloading on their own.",
|
||||
},
|
||||
ru: {
|
||||
few: "{files}, {size}, уйдут в корзину и перестанут скачиваться сами.",
|
||||
many: "{files}, {size}, уйдут в корзину и перестанут скачиваться сами.",
|
||||
one: "{files}, {size}, уйдёт в корзину и перестанет скачиваться сам.",
|
||||
other: "{files}, {size}, уйдут в корзину и перестанут скачиваться сами.",
|
||||
},
|
||||
},
|
||||
"storage.scope.downloaded": {
|
||||
en: "{size} already downloaded",
|
||||
ru: "{size} уже скачано",
|
||||
},
|
||||
"storage.scope.gone": {
|
||||
en: "{count} of them can't be downloaded again",
|
||||
ru: "{count} из них потом не скачать заново",
|
||||
},
|
||||
"storage.scope.kept": {
|
||||
en: {
|
||||
one: "{files} more is in other chats too, it will stay",
|
||||
other: "{files} more are in other chats too, they will stay",
|
||||
},
|
||||
ru: {
|
||||
few: "Ещё {files} есть и в других чатах, они останутся",
|
||||
many: "Ещё {files} есть и в других чатах, они останутся",
|
||||
one: "Ещё {files} есть и в других чатах, он останется",
|
||||
other: "Ещё {files} есть и в других чатах, они останутся",
|
||||
},
|
||||
},
|
||||
"storage.scope.keptOnly": {
|
||||
en: {
|
||||
one: "{files} is in other chats too, remove it from the list below",
|
||||
other: "{files} are in other chats too, remove them from the list below",
|
||||
},
|
||||
ru: {
|
||||
few: "{files} есть и в других чатах, убрать их можно из списка ниже",
|
||||
many: "{files} есть и в других чатах, убрать их можно из списка ниже",
|
||||
one: "{files} есть и в других чатах, убрать его можно из списка ниже",
|
||||
other: "{files} есть и в других чатах, убрать их можно из списка ниже",
|
||||
},
|
||||
},
|
||||
"storage.scope.trashFailed": {
|
||||
en: "Could not move the files to the trash",
|
||||
ru: "Не удалось переместить файлы в корзину",
|
||||
},
|
||||
"storage.select": { en: "Select {name}", ru: "Выбрать {name}" },
|
||||
"storage.toTrash": { en: "Move to trash", ru: "В корзину" },
|
||||
"storage.trash": { en: "Trash", ru: "Корзина" },
|
||||
"storage.trash.clear": { en: "Empty trash", ru: "Очистить корзину" },
|
||||
"storage.trash.clearRest": {
|
||||
en: "Whatever is still in Telegram can be downloaded again later. Files from messages deleted there will be gone for good.",
|
||||
ru: "То, что ещё есть в Telegram, потом можно скачать заново. Файлы из удалённых там сообщений пропадут насовсем.",
|
||||
},
|
||||
"storage.trash.clearTitle": { en: "Empty trash?", ru: "Очистить корзину?" },
|
||||
"storage.trash.deleteFailed": {
|
||||
en: "Could not delete the files",
|
||||
ru: "Не удалось удалить файлы",
|
||||
},
|
||||
"storage.trash.deleteForever": {
|
||||
en: "Delete permanently",
|
||||
ru: "Удалить насовсем",
|
||||
},
|
||||
"storage.trash.deleteTitle": {
|
||||
en: "Delete permanently?",
|
||||
ru: "Удалить насовсем?",
|
||||
},
|
||||
"storage.trash.empty": { en: "The trash is empty.", ru: "Корзина пуста." },
|
||||
"storage.trash.goneWarn": {
|
||||
en: {
|
||||
one: "{files} can't be downloaded again: it's no longer in Telegram.",
|
||||
other:
|
||||
"{files} can't be downloaded again: they're no longer in Telegram.",
|
||||
},
|
||||
ru: {
|
||||
few: "{files} скачать заново нельзя: в Telegram их уже нет.",
|
||||
many: "{files} скачать заново нельзя: в Telegram их уже нет.",
|
||||
one: "{files} скачать заново нельзя: в Telegram его уже нет.",
|
||||
other: "{files} скачать заново нельзя: в Telegram их уже нет.",
|
||||
},
|
||||
},
|
||||
"storage.trash.laterAll": {
|
||||
en: {
|
||||
one: "You can download it from Telegram again later.",
|
||||
other: "You can download them from Telegram again later.",
|
||||
},
|
||||
ru: {
|
||||
few: "Потом их можно скачать из Telegram заново.",
|
||||
many: "Потом их можно скачать из Telegram заново.",
|
||||
one: "Потом его можно скачать из Telegram заново.",
|
||||
other: "Потом их можно скачать из Telegram заново.",
|
||||
},
|
||||
},
|
||||
"storage.trash.laterRest": {
|
||||
en: "The rest can be downloaded from Telegram again.",
|
||||
ru: "Остальные можно скачать из Telegram заново.",
|
||||
},
|
||||
"storage.trash.loadFailed": {
|
||||
en: "Could not load the trash.",
|
||||
ru: "Не удалось загрузить корзину.",
|
||||
},
|
||||
"storage.trash.note": {
|
||||
en: "Files stay here for 7 days, then they're deleted from disk. Until then you can restore them.",
|
||||
ru: "Файлы лежат здесь 7 дней, потом удаляются с диска. До этого их можно вернуть.",
|
||||
},
|
||||
"storage.trash.nothing": { en: "empty", ru: "пусто" },
|
||||
"storage.trash.restoreAll": { en: "Restore all", ru: "Вернуть всё" },
|
||||
"storage.trash.title": { en: "Trash: {size}", ru: "Корзина: {size}" },
|
||||
"storage.trash.willDelete": {
|
||||
en: {
|
||||
one: "{files}, {size}, will be deleted from disk.",
|
||||
other: "{files}, {size}, will be deleted from disk.",
|
||||
},
|
||||
ru: {
|
||||
few: "{files}, {size}, будут удалены с диска.",
|
||||
many: "{files}, {size}, будут удалены с диска.",
|
||||
one: "{files}, {size}, будет удалён с диска.",
|
||||
other: "{files}, {size}, будут удалены с диска.",
|
||||
},
|
||||
},
|
||||
"storage.trashFailed": {
|
||||
en: "Could not move to the trash",
|
||||
ru: "Не удалось переместить в корзину",
|
||||
},
|
||||
"storage.zero": { en: "0 B", ru: "0 Б" },
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,39 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const stories = {
|
||||
"stories.author": { en: "Author's profile", ru: "Профиль автора" },
|
||||
"stories.backfillFailed": {
|
||||
en: "Could not start loading stories",
|
||||
ru: "Не удалось запустить загрузку сторис",
|
||||
},
|
||||
"stories.backfillStarted": {
|
||||
en: "Loading older stories",
|
||||
ru: "Загружаем старые сторис",
|
||||
},
|
||||
"stories.download": { en: "Download story", ru: "Скачать сторис" },
|
||||
"stories.downloadFailed": {
|
||||
en: "Could not download the story",
|
||||
ru: "Не удалось скачать сторис",
|
||||
},
|
||||
"stories.empty": { en: "No stories", ru: "Нет сторис" },
|
||||
"stories.emptyHint": {
|
||||
en: "Press “Load older” to fetch the archive",
|
||||
ru: "Нажмите «Загрузить старые», чтобы забрать архив",
|
||||
},
|
||||
"stories.from": { en: "Story from {date}", ru: "Сторис от {date}" },
|
||||
"stories.loadOlder": { en: "Load older", ru: "Загрузить старые" },
|
||||
"stories.loadOlderStories": {
|
||||
en: "Load older stories",
|
||||
ru: "Загрузить старые сторис",
|
||||
},
|
||||
"stories.mute": { en: "Mute", ru: "Выключить звук" },
|
||||
"stories.openChat": { en: "Open a chat", ru: "Откройте чат" },
|
||||
"stories.paused": { en: "Paused", ru: "Пауза" },
|
||||
"stories.title": { en: "Stories", ru: "Сторис" },
|
||||
"stories.unavailable": { en: "Media unavailable", ru: "Медиа недоступно" },
|
||||
"stories.undated": {
|
||||
en: "Story with no date",
|
||||
ru: "Сторис от неизвестной даты",
|
||||
},
|
||||
"stories.unmute": { en: "Unmute", ru: "Включить звук" },
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,24 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const track = {
|
||||
"track.empty": { en: "No messages here yet", ru: "Здесь пока нет сообщений" },
|
||||
"track.failed": {
|
||||
en: "Could not turn on tracking",
|
||||
ru: "Не удалось включить отслеживание",
|
||||
},
|
||||
"track.hint": {
|
||||
en: "Turn on tracking to collect messages, media and stats for this chat.",
|
||||
ru: "Включите отслеживание, чтобы собирать сообщения, медиа и статистику по этому чату.",
|
||||
},
|
||||
"track.loadHistory": { en: "Load history", ru: "Загрузить историю" },
|
||||
"track.start": { en: "Start tracking", ru: "Начать отслеживать" },
|
||||
"track.started": {
|
||||
en: "Tracking is on, loading the history",
|
||||
ru: "Отслеживание включено, история загружается",
|
||||
},
|
||||
"track.thisChat": { en: "This chat", ru: "Этот чат" },
|
||||
"track.tracked": {
|
||||
en: "{title} is tracked, new messages and stats are collected automatically.",
|
||||
ru: "{title} отслеживается, новые сообщения и статистика собираются автоматически.",
|
||||
},
|
||||
} satisfies Messages;
|
||||
@@ -0,0 +1,27 @@
|
||||
import type { Messages } from "#lib/i18n/types.js";
|
||||
|
||||
export const ui = {
|
||||
"ui.chat": { en: "Chat {id}", ru: "Чат {id}" },
|
||||
"ui.copy": { en: "Copy", ru: "Скопировать" },
|
||||
"ui.download": { en: "Download", ru: "Скачать" },
|
||||
"ui.downloadFailed": {
|
||||
en: "Could not download the file",
|
||||
ru: "Не удалось скачать файл",
|
||||
},
|
||||
"ui.downloadFile": { en: "Download file", ru: "Скачать файл" },
|
||||
"ui.gotIt": { en: "Got it", ru: "Понятно" },
|
||||
"ui.jumpToMessage": { en: "Go to message", ru: "Перейти к сообщению" },
|
||||
"ui.loading": { en: "Loading…", ru: "Загрузка…" },
|
||||
"ui.next": { en: "Next", ru: "Вперёд" },
|
||||
"ui.noMessage": { en: "No message selected", ru: "Сообщение не выбрано" },
|
||||
"ui.nothingFound": { en: "No results.", ru: "Ничего не найдено." },
|
||||
"ui.open": { en: "Open", ru: "Открыть" },
|
||||
"ui.pause": { en: "Pause", ru: "Пауза" },
|
||||
"ui.play": { en: "Play", ru: "Воспроизвести" },
|
||||
"ui.previous": { en: "Previous", ru: "Назад" },
|
||||
"ui.refresh": { en: "Refresh", ru: "Обновить" },
|
||||
"ui.retry": { en: "Retry", ru: "Повторить" },
|
||||
"ui.searchChat": { en: "Search chats", ru: "Поиск чата" },
|
||||
"ui.shareLink": { en: "Share by link", ru: "Доступ по ссылке" },
|
||||
"ui.showMore": { en: "Show more", ru: "Показать ещё" },
|
||||
} satisfies Messages;
|
||||
Reference in new issue
Block a user