i18n.go
·
1261 lines
·
77.1 KB
| 1 | package i18n |
| 2 | |
| 3 | type Lang string |
| 4 | |
| 5 | const ( |
| 6 | RU Lang = "ru" |
| 7 | EN Lang = "en" |
| 8 | ) |
| 9 | |
| 10 | func Normalize(code string) Lang { |
| 11 | switch code { |
| 12 | case "en", "EN": |
| 13 | return EN |
| 14 | default: |
| 15 | return RU |
| 16 | } |
| 17 | } |
| 18 | |
| 19 | var translations = map[Lang]map[string]string{ |
| 20 | RU: { |
| 21 | // Навигация и общее |
| 22 | "app.tagline": "Лёгкий self-hosted Git-хостинг", |
| 23 | "nav.home": "Главная", |
| 24 | "nav.repositories": "Репозитории", |
| 25 | "nav.explore": "Обзор", |
| 26 | "nav.settings": "Настройки", |
| 27 | "nav.admin": "Админка", |
| 28 | "nav.agents": "Для AI-агентов", |
| 29 | "nav.login": "Войти", |
| 30 | "nav.register": "Регистрация", |
| 31 | "nav.logout": "Выйти", |
| 32 | "nav.new_repo": "Создать", |
| 33 | "nav.command_palette": "Поиск и команды", |
| 34 | "nav.search_placeholder": "Поиск...", |
| 35 | "nav.theme": "Тема", |
| 36 | "nav.lang": "Язык", |
| 37 | "common.copy": "Копировать", |
| 38 | "common.copied": "Скопировано", |
| 39 | "common.copy_failed": "Не удалось скопировать", |
| 40 | "common.cancel": "Отмена", |
| 41 | "common.save": "Сохранить", |
| 42 | "common.delete": "Удалить", |
| 43 | "common.close": "Закрыть", |
| 44 | "common.never": "Никогда", |
| 45 | "common.newer": "Новее", |
| 46 | "common.older": "Старее", |
| 47 | "common.up": "Наверх", |
| 48 | |
| 49 | // Темы (только 3) |
| 50 | "theme.light": "Светлая", |
| 51 | "theme.dark": "Тёмная", |
| 52 | "theme.system": "Авто", |
| 53 | |
| 54 | // Лендинг |
| 55 | "landing.badge": "Один бинарник · SQLite · Ноль зависимостей", |
| 56 | "landing.hero.title": "Лёгкий self-hosted Git-хостинг", |
| 57 | "landing.hero.subtitle": "Один бинарник на Go со встроенным SQLite. Поднимается за минуту, потребляет минимум памяти и не перегружен лишним.", |
| 58 | "landing.hero.cta_start": "Начать", |
| 59 | "landing.features.title": "Принципы", |
| 60 | "landing.feat1.title": "Один бинарник", |
| 61 | "landing.feat1.desc": "Шаблоны, стили, шрифты, миграции и иконки вшиты через go:embed.", |
| 62 | "landing.feat2.title": "SQLite (WAL)", |
| 63 | "landing.feat2.desc": "Вся база — один файл data/polar.db без CGO. Бэкап простым копированием.", |
| 64 | "landing.feat3.title": "Быстрый отклик", |
| 65 | "landing.feat3.desc": "Мгновенный старт, серверный рендеринг и < 30 МБ памяти в простое.", |
| 66 | "landing.feat4.title": "Приватность", |
| 67 | "landing.feat4.desc": "Публичные и приватные репозитории, Argon2id и токены доступа для Git HTTP.", |
| 68 | // Авторизация |
| 69 | "auth.login.title": "Вход", |
| 70 | "auth.register.title": "Регистрация", |
| 71 | "auth.register.disabled": "Публичная регистрация отключена администратором.", |
| 72 | "auth.username": "Имя пользователя", |
| 73 | "auth.username_hint": "2–32 символа: латиница, цифры, дефис, подчёркивание", |
| 74 | "auth.username_or_email": "Логин или Email", |
| 75 | "auth.email": "Email", |
| 76 | "auth.password": "Пароль", |
| 77 | "auth.password_hint": "Минимум 8 символов", |
| 78 | "auth.submit_login": "Войти", |
| 79 | "auth.submit_register": "Создать аккаунт", |
| 80 | "auth.no_account": "Нет аккаунта?", |
| 81 | "auth.have_account": "Уже есть аккаунт?", |
| 82 | "auth.invalid_creds": "Неверный логин или пароль", |
| 83 | |
| 84 | // Репозитории |
| 85 | "repo.new.title": "Новый репозиторий", |
| 86 | "repo.name": "Название", |
| 87 | "repo.name_hint": "Латинские буквы, цифры, точка, дефис, подчёркивание", |
| 88 | "repo.description": "Описание", |
| 89 | "repo.description_ph": "Краткое описание проекта (необязательно)", |
| 90 | "repo.visibility": "Доступ", |
| 91 | "repo.public": "Публичный", |
| 92 | "repo.public_desc": "Виден всем, клонирование без авторизации", |
| 93 | "repo.private": "Приватный", |
| 94 | "repo.private_desc": "Доступен только владельцу", |
| 95 | "repo.create_btn": "Создать репозиторий", |
| 96 | "repo.filter_ph": "Фильтр репозиториев...", |
| 97 | "repo.empty_list": "Репозиториев пока нет", |
| 98 | "repo.empty_list_sub": "Создайте первый репозиторий, чтобы отправить код.", |
| 99 | "repo.empty.title": "Репозиторий пуст", |
| 100 | "repo.empty.new_cmd": "Создать новый репозиторий в командной строке", |
| 101 | "repo.empty.push_cmd": "Отправить существующий репозиторий", |
| 102 | "repo.tab.code": "Код", |
| 103 | "repo.tab.commits": "Коммиты", |
| 104 | "repo.tab.branches": "Ветки и теги", |
| 105 | "repo.tab.issues": "Задачи", |
| 106 | "repo.tab.pulls": "Пул-реквесты", |
| 107 | "repo.tab.releases": "Релизы", |
| 108 | "repo.tab.activity": "Активность", |
| 109 | "repo.tab.settings": "Настройки", |
| 110 | "repo.features": "Возможности репозитория", |
| 111 | "repo.clone": "Клонировать", |
| 112 | "repo.download_zip": "Скачать ZIP", |
| 113 | "repo.branches": "Ветки", |
| 114 | "repo.tags": "Теги", |
| 115 | "repo.default_branch": "Ветка по умолчанию", |
| 116 | "repo.find_file": "Поиск файла...", |
| 117 | "repo.files": "Файлы", |
| 118 | "repo.readme": "README", |
| 119 | "repo.raw": "Raw", |
| 120 | "repo.history": "История", |
| 121 | "repo.lines": "строк", |
| 122 | "repo.lines_one": "строка", |
| 123 | "repo.lines_few": "строки", |
| 124 | "repo.lines_many": "строк", |
| 125 | "repo.binary_notice": "Бинарный файл — предпросмотр недоступен", |
| 126 | "repo.download_raw": "Скачать файл", |
| 127 | "repo.browse_at_commit": "Файлы на момент коммита", |
| 128 | "repo.files_changed": "файлов изменено", |
| 129 | "repo.files_changed_one": "файл изменён", |
| 130 | "repo.files_changed_few": "файла изменено", |
| 131 | "repo.files_changed_many": "файлов изменено", |
| 132 | "repo.no_commits": "Коммитов пока нет", |
| 133 | "repo.danger_zone": "Опасная зона", |
| 134 | "repo.delete": "Удалить репозиторий", |
| 135 | "repo.delete_desc": "Удаление необратимо: все файлы и история git будут стёрты.", |
| 136 | "repo.delete_confirm": "Введите название репозитория для подтверждения", |
| 137 | "repo.rename": "Переименовать", |
| 138 | "repo.save": "Сохранить", |
| 139 | "repo.branch.new": "Новая ветка", |
| 140 | "repo.branch.name_ph": "Имя ветки (напр. feat/ui)", |
| 141 | "repo.branch.from": "От ветки / коммита", |
| 142 | "repo.branch.create": "Создать ветку", |
| 143 | "repo.branch.default": "по умолчанию", |
| 144 | "repo.tag.new": "Новый тег / релиз", |
| 145 | "repo.tag.name_ph": "Тег (напр. v1.0.0)", |
| 146 | "repo.tag.msg_ph": "Описание тега (необязательно)", |
| 147 | "repo.tag.create": "Создать тег", |
| 148 | "repo.tags.empty": "Тегов пока нет", |
| 149 | |
| 150 | // Pull Requests |
| 151 | "pulls.title": "Пул-реквесты", |
| 152 | "pulls.new": "Новый пул-реквест", |
| 153 | "pulls.empty": "Пул-реквестов пока нет", |
| 154 | "pulls.open": "Открыт", |
| 155 | "pulls.closed": "Закрыт", |
| 156 | "pulls.merged": "Слит", |
| 157 | "pulls.compare": "Сравнение веток", |
| 158 | "pulls.base": "Базовая ветка", |
| 159 | "pulls.head": "Ветка изменений", |
| 160 | "pulls.title_ph": "Заголовок пул-реквеста...", |
| 161 | "pulls.desc_ph": "Опишите предлагаемые изменения (Markdown)...", |
| 162 | "pulls.create_btn": "Создать пул-реквест", |
| 163 | "pulls.merge_btn": "Слить пул-реквест", |
| 164 | "pulls.can_merge": "Ветки можно объединить автоматически.", |
| 165 | "pulls.cannot_merge": "Невозможно объединить автоматически: обнаружены конфликты.", |
| 166 | "pulls.already_merged": "Ветка изменений уже объединена с базовой.", |
| 167 | "pulls.close_btn": "Закрыть PR", |
| 168 | "pulls.reopen_btn": "Открыть заново", |
| 169 | "pulls.comment_btn": "Прокомментировать", |
| 170 | "pulls.conversation": "Обсуждение", |
| 171 | "pulls.files_changed": "Изменения", |
| 172 | "pulls.commits": "Коммиты", |
| 173 | "pulls.able_to_merge": "Можно слить автоматически", |
| 174 | "pulls.body": "Описание", |
| 175 | "pulls.body_ph": "Опишите предлагаемые изменения (Markdown)...", |
| 176 | "pulls.branches_identical": "Ветки идентичны — сравнивать нечего", |
| 177 | "pulls.cannot_merge_warning": "Обнаружены конфликты — автоматическое слияние невозможно", |
| 178 | "pulls.closed_desc": "Ветка изменений не была объединена с базовой.", |
| 179 | "pulls.closed_message": "Пул-реквест закрыт", |
| 180 | "pulls.comment_ph": "Напишите комментарий (поддерживается Markdown)...", |
| 181 | "pulls.compare_branches": "Сравнение веток", |
| 182 | "pulls.conflicts_desc": "Разрешите конфликты локально и запушьте изменения в ветку.", |
| 183 | "pulls.conflicts_title": "Есть конфликты слияния", |
| 184 | "pulls.into": "в", |
| 185 | "pulls.merge_clean": "Конфликтов нет — изменения можно объединить.", |
| 186 | "pulls.merged_message": "Пул-реквест слит", |
| 187 | "pulls.no_changes": "Файлы не изменены", |
| 188 | "pulls.no_commits": "В этом пул-реквесте пока нет коммитов", |
| 189 | "pulls.only_write_merge": "Сливать пул-реквесты могут только пользователи с правом записи.", |
| 190 | "pulls.status.closed": "Закрыт", |
| 191 | "pulls.status.merged": "Слит", |
| 192 | "pulls.status.open": "Открыт", |
| 193 | "pulls.wants_to_merge": "хочет слить", |
| 194 | |
| 195 | // Releases |
| 196 | "releases.title": "Релизы", |
| 197 | "releases.new": "Новый релиз", |
| 198 | "releases.assets_upload": "Файлы релиза", |
| 199 | "releases.assets_upload_hint": "Необязательно. До 20 файлов, каждый до 100 МБ.", |
| 200 | "releases.asset_delete": "Удалить файл", |
| 201 | "releases.asset_delete_confirm": "Удалить этот файл? Действие необратимо.", |
| 202 | "releases.empty": "Релизов пока нет", |
| 203 | "releases.tag_select": "Тег", |
| 204 | "releases.title_ph": "Название релиза", |
| 205 | "releases.desc_ph": "Описание релиза, список изменений (Markdown)...", |
| 206 | "releases.prerelease": "Пре-релиз (нестабильная сборка)", |
| 207 | "releases.publish": "Опубликовать релиз", |
| 208 | "releases.delete": "Удалить релиз", |
| 209 | "releases.edit": "Редактировать релиз", |
| 210 | "releases.edit_title": "Редактирование релиза", |
| 211 | "releases.save_btn": "Сохранить изменения", |
| 212 | "releases.current_assets": "Текущие файлы", |
| 213 | "releases.add_assets": "Добавить файлы", |
| 214 | "releases.tag_locked": "Тег нельзя изменить после публикации.", |
| 215 | "releases.assets": "Файлы", |
| 216 | "releases.source_zip": "Исходный код (zip)", |
| 217 | "releases.source_tar": "Исходный код (tar.gz)", |
| 218 | "releases.body": "Описание", |
| 219 | "releases.body_ph": "Опишите релиз, список изменений (Markdown)...", |
| 220 | "releases.count": "релизов", |
| 221 | "releases.count_one": "релиз", |
| 222 | "releases.count_few": "релиза", |
| 223 | "releases.count_many": "релизов", |
| 224 | "releases.delete_confirm": "Удалить этот релиз? Действие необратимо.", |
| 225 | "releases.is_prerelease": "Пре-релиз (нестабильная сборка)", |
| 226 | "releases.publish_btn": "Опубликовать релиз", |
| 227 | "releases.tag_desc": "Существующий тег или новый — он будет создан автоматически.", |
| 228 | "releases.tag_name": "Тег", |
| 229 | "releases.tags": "тегов", |
| 230 | "releases.tags_one": "тег", |
| 231 | "releases.tags_few": "тега", |
| 232 | "releases.tags_many": "тегов", |
| 233 | "releases.target": "Ветка", |
| 234 | "releases.target_desc": "Ветка или коммит, на который будет указывать тег.", |
| 235 | |
| 236 | // Activity |
| 237 | "activity.title": "Активность", |
| 238 | "activity.pulse": "Сводка активности", |
| 239 | "activity.empty": "Активности пока нет", |
| 240 | "activity.commits": "коммитов", |
| 241 | "activity.open_prs": "открытых PR", |
| 242 | "activity.merged_prs": "слитых PR", |
| 243 | "activity.open_issues": "открытых задач", |
| 244 | "activity.releases": "релизов", |
| 245 | "activity.issues": "открыто и закрыто", |
| 246 | "activity.on_default_branch": "в ветке по умолчанию", |
| 247 | "activity.published_releases": "опубликованные релизы", |
| 248 | "activity.pull_requests": "открыто и слито", |
| 249 | "activity.recent_feed": "Лента активности", |
| 250 | "activity.badge_commit": "коммит", |
| 251 | "activity.badge_release": "релиз", |
| 252 | |
| 253 | // Задачи (Issues) |
| 254 | "issue.new": "Новая задача", |
| 255 | "issue.title": "Заголовок", |
| 256 | "issue.title_ph": "Кратко опишите задачу или проблему", |
| 257 | "issue.body": "Описание", |
| 258 | "issue.body_ph": "Подробное описание (поддерживается Markdown)...", |
| 259 | "issue.create": "Создать задачу", |
| 260 | "issue.open": "Открытые", |
| 261 | "issue.closed": "Закрытые", |
| 262 | "issue.status.open": "Открыта", |
| 263 | "issue.status.closed": "Закрыта", |
| 264 | "issue.close_btn": "Закрыть задачу", |
| 265 | "issue.reopen_btn": "Переоткрыть", |
| 266 | "issue.comment_ph": "Напишите комментарий (поддерживается Markdown)...", |
| 267 | "issue.comment_btn": "Отправить", |
| 268 | "issue.empty": "Задач в этом списке нет", |
| 269 | |
| 270 | // Настройки пользователя, профиль и токены |
| 271 | "settings.title": "Настройки", |
| 272 | "settings.profile": "Профиль", |
| 273 | "settings.avatar": "Аватар", |
| 274 | "settings.avatar_upload": "Выбрать изображение", |
| 275 | "settings.avatar_remove": "Удалить аватар", |
| 276 | "settings.avatar_hint": "PNG, JPG, WebP или GIF — автоматически кадрируется до 256×256", |
| 277 | "settings.full_name": "Отображаемое имя", |
| 278 | "settings.full_name_ph": "Ваше имя или ник", |
| 279 | "settings.bio": "О себе", |
| 280 | "settings.bio_ph": "Короткая подпись в профиле", |
| 281 | "settings.location": "Локация", |
| 282 | "settings.location_ph": "Город, страна", |
| 283 | "settings.website": "Сайт", |
| 284 | "settings.website_ph": "https://example.com", |
| 285 | "profile.edit": "Редактировать профиль", |
| 286 | "profile.joined": "Регистрация", |
| 287 | "profile.public_repos": "Публичные", |
| 288 | "profile.private_repos": "Приватные", |
| 289 | "profile.total_repos": "Репозитории", |
| 290 | "settings.tokens": "Токены доступа", |
| 291 | "settings.tokens.desc": "Используйте токен вместо пароля для git clone и git push по HTTP.", |
| 292 | "settings.token.name": "Название токена (например, Ноутбук)", |
| 293 | "settings.token.create": "Создать", |
| 294 | "settings.token.revoke": "Отозвать", |
| 295 | "settings.token.created_once": "Скопируйте токен сейчас — он показывается только один раз:", |
| 296 | "settings.token.col_name": "Название", |
| 297 | "settings.token.col_prefix": "Префикс", |
| 298 | "settings.token.col_created": "Создан", |
| 299 | "settings.token.col_used": "Использован", |
| 300 | "settings.token.empty": "Токенов доступа пока нет", |
| 301 | "settings.password.current": "Текущий пароль", |
| 302 | "settings.password.new": "Новый пароль", |
| 303 | "settings.password.update": "Обновить пароль", |
| 304 | |
| 305 | // Админка |
| 306 | "admin.title": "Администрирование", |
| 307 | "admin.features": "Модули и доступ", |
| 308 | "admin.users": "Пользователи", |
| 309 | "admin.registration": "Публичная регистрация", |
| 310 | "admin.registration.desc": "Разрешить самостоятельную регистрацию новых аккаунтов", |
| 311 | "admin.explore": "Раздел «Обзор» (Explore)", |
| 312 | "admin.explore.desc": "Показывать каталог публичных репозиториев в сайдбаре и по адресу /explore", |
| 313 | "admin.landing": "Приветственная страница", |
| 314 | "admin.landing.desc": "Показывать лендинг на главной странице (если отключено — переход сразу к репозиториям или входу)", |
| 315 | "admin.anon_read": "Гостевой просмотр", |
| 316 | "admin.anon_read.desc": "Разрешить неавторизованным пользователям просматривать публичные репозитории и профили", |
| 317 | "admin.issues": "Трекер задач (Issues)", |
| 318 | "admin.issues.desc": "Включить вкладку «Задачи» в репозиториях", |
| 319 | "admin.enabled": "Включено", |
| 320 | "admin.disabled": "Отключено", |
| 321 | "admin.enable_btn": "Включить", |
| 322 | "admin.disable_btn": "Отключить", |
| 323 | "admin.col.user": "Пользователь", |
| 324 | "admin.col.repos": "Репозитории", |
| 325 | "admin.col.role": "Роль", |
| 326 | "admin.col.joined": "Дата", |
| 327 | "admin.role.admin": "Админ", |
| 328 | "admin.role.user": "Участник", |
| 329 | |
| 330 | // Командная палитра и хоткеи |
| 331 | "palette.placeholder": "Поиск репозитория, файла или команды...", |
| 332 | "palette.group.nav": "Навигация", |
| 333 | "palette.group.themes": "Тема оформления", |
| 334 | "palette.group.repos": "Репозитории", |
| 335 | "shortcuts.title": "Горячие клавиши", |
| 336 | "shortcuts.palette": "Командная палитра", |
| 337 | "shortcuts.search": "Фокус на поиск", |
| 338 | "shortcuts.home": "На главную", |
| 339 | "shortcuts.files": "Фильтр файлов", |
| 340 | "shortcuts.sidebar": "Скрыть / показать сайдбар", |
| 341 | "shortcuts.shortcuts": "Это окно шорткатов", |
| 342 | "shortcuts.context_menu": "Открыть контекстное меню", |
| 343 | "shortcuts.theme": "Переключить тему", |
| 344 | "shortcuts.copy_url": "Копировать адрес страницы", |
| 345 | "shortcuts.close": "Закрыть меню или диалог", |
| 346 | "shortcuts.profile": "Мой профиль", |
| 347 | "shortcuts.new_repo": "Новый репозиторий", |
| 348 | "shortcuts.unavailable": "Этот шорткат здесь недоступен", |
| 349 | "shortcuts.group.general": "Общее", |
| 350 | "shortcuts.group.navigation": "Навигация", |
| 351 | "shortcuts.group.repo": "Репозиторий", |
| 352 | "nav.toggle_sidebar": "Сайдбар (Ctrl+B)", |
| 353 | |
| 354 | // Контекстное меню |
| 355 | "contextmenu.title": "Контекстное меню", |
| 356 | "contextmenu.selection": "Выделение", |
| 357 | "contextmenu.copy_selection": "Копировать выделенное", |
| 358 | "contextmenu.search_selection": "Искать выделенное", |
| 359 | "contextmenu.link": "Ссылка", |
| 360 | "contextmenu.open_link": "Открыть в новой вкладке", |
| 361 | "contextmenu.copy_link": "Копировать адрес ссылки", |
| 362 | "contextmenu.copy_link_text": "Копировать текст ссылки", |
| 363 | "contextmenu.image": "Изображение", |
| 364 | "contextmenu.open_image": "Открыть изображение", |
| 365 | "contextmenu.copy_image": "Копировать адрес изображения", |
| 366 | "contextmenu.save_image": "Сохранить изображение", |
| 367 | "contextmenu.page": "Страница", |
| 368 | "contextmenu.back": "Назад", |
| 369 | "contextmenu.forward": "Вперёд", |
| 370 | "contextmenu.reload": "Обновить", |
| 371 | "contextmenu.copy_url": "Копировать адрес страницы", |
| 372 | |
| 373 | // Флеш-сообщения |
| 374 | "flash.welcome": "Добро пожаловать в Polar, @%s!", |
| 375 | "flash.profile_updated": "Профиль обновлён.", |
| 376 | "flash.password_updated": "Пароль успешно изменён.", |
| 377 | "flash.token_revoked": "Токен доступа отозван.", |
| 378 | "flash.settings_updated": "Настройки сохранены.", |
| 379 | "flash.error": "Ошибка: %s", |
| 380 | "flash.comment_error": "Не удалось отправить комментарий: %s", |
| 381 | "flash.pr_created": "Пул-реквест #%d создан.", |
| 382 | "flash.pr_closed": "Пул-реквест #%d закрыт.", |
| 383 | "flash.pr_reopened": "Пул-реквест #%d открыт заново.", |
| 384 | "flash.pr_merged": "Пул-реквест #%d слит.", |
| 385 | "flash.pr_merged_state": "Нельзя изменить состояние слитого пул-реквеста.", |
| 386 | "flash.pr_merge_open_only": "Слить можно только открытый пул-реквест.", |
| 387 | "flash.pr_merge_failed": "Не удалось слить: %s", |
| 388 | "flash.release_tag_empty": "Имя тега не может быть пустым.", |
| 389 | "flash.release_tag_failed": "Не удалось создать тег: %s", |
| 390 | "flash.release_create_failed": "Не удалось создать релиз: %s", |
| 391 | "flash.release_published": "Релиз %s опубликован.", |
| 392 | "flash.release_delete_failed": "Не удалось удалить релиз: %s", |
| 393 | "flash.release_deleted": "Релиз удалён.", |
| 394 | "flash.release_updated": "Релиз %s обновлён.", |
| 395 | "flash.release_update_failed": "Не удалось обновить релиз: %s", |
| 396 | "flash.release_updated_with_assets": "Релиз %s обновлён, файлов добавлено: %d.", |
| 397 | "flash.release_updated_assets_failed": "Релиз %s обновлён, но часть файлов не удалось сохранить.", |
| 398 | "flash.release_published_with_assets": "Релиз %s опубликован, файлов прикреплено: %d.", |
| 399 | "flash.release_published_assets_failed": "Релиз %s опубликован, но часть файлов не удалось сохранить.", |
| 400 | "flash.release_asset_too_many": "Слишком много файлов: максимум %d.", |
| 401 | "flash.release_asset_too_big": "Файл слишком большой — лимит 100 МБ на файл.", |
| 402 | "flash.release_asset_deleted": "Файл удалён.", |
| 403 | "flash.release_asset_delete_failed": "Не удалось удалить файл: %s", |
| 404 | "file.new_file": "Новый файл", |
| 405 | "file.new_folder": "Новая папка", |
| 406 | "file.path": "Путь", |
| 407 | "file.path_ph": "напр. src/main.go", |
| 408 | "file.folder_ph": "напр. docs", |
| 409 | "file.branch": "Ветка", |
| 410 | "file.content": "Содержимое", |
| 411 | "file.content_ph": "Текст файла…", |
| 412 | "file.message": "Сообщение коммита", |
| 413 | "file.create_file": "Создать файл", |
| 414 | "file.create_folder": "Создать папку", |
| 415 | "file.folder_hint": "Git не хранит пустые папки — Polar добавит туда .gitkeep.", |
| 416 | "flash.file_created": "Файл создан.", |
| 417 | "flash.folder_created": "Папка создана.", |
| 418 | "flash.file_exists": "Файл с таким путём уже существует.", |
| 419 | "flash.path_invalid": "Некорректный путь.", |
| 420 | "flash.file_create_failed": "Не удалось создать файл.", |
| 421 | "flash.folder_create_failed": "Не удалось создать папку.", |
| 422 | "file.upload_file": "Загрузить файлы", |
| 423 | "file.upload_dest": "Папка назначения", |
| 424 | "file.upload_dest_ph": "напр. docs/images (необязательно)", |
| 425 | "file.upload_pick": "Выберите файлы или перетащите сюда", |
| 426 | "file.upload_hint": "До 25 файлов, до 50 МБ суммарно.", |
| 427 | "file.upload_submit": "Загрузить", |
| 428 | "file.upload_replace_hint": "Существующие файлы будут перезаписаны.", |
| 429 | "flash.upload_done": "Загружено файлов: %d.", |
| 430 | "flash.upload_none": "Файлы не выбраны.", |
| 431 | "flash.upload_failed": "Не удалось загрузить файлы.", |
| 432 | "flash.upload_too_big": "Слишком большой объём — лимит 50 МБ.", |
| 433 | "flash.upload_too_many": "Слишком много файлов: максимум %d.", "flash.repo_settings_saved": "Настройки репозитория сохранены.", |
| 434 | "flash.repo_rename_failed": "Не удалось переименовать: %s", |
| 435 | "flash.repo_renamed": "Репозиторий переименован в %s.", |
| 436 | "flash.repo_confirm_mismatch": "Введённое имя не совпадает с названием репозитория.", |
| 437 | "flash.repo_deleted": "Репозиторий %s удалён.", |
| 438 | "flash.branch_created": "Ветка %s создана.", |
| 439 | "flash.branch_create_failed": "Не удалось создать ветку: %s", |
| 440 | "flash.branch_default_delete": "Нельзя удалить ветку по умолчанию.", |
| 441 | "flash.branch_deleted": "Ветка %s удалена.", |
| 442 | "flash.branch_delete_failed": "Не удалось удалить ветку: %s", |
| 443 | "flash.tag_created": "Тег %s создан.", |
| 444 | "flash.tag_create_failed": "Не удалось создать тег: %s", |
| 445 | "flash.tag_deleted": "Тег %s удалён.", |
| 446 | "flash.tag_delete_failed": "Не удалось удалить тег: %s", |
| 447 | "flash.issue_closed": "Задача #%d закрыта.", |
| 448 | "flash.issue_reopened": "Задача #%d открыта заново.", |
| 449 | |
| 450 | // Ошибочные страницы |
| 451 | "err.not_found": "Не найдено", |
| 452 | "err.forbidden": "Доступ запрещён", |
| 453 | "err.session_error": "Ошибка сессии", |
| 454 | "err.session_create": "Не удалось создать сессию.", |
| 455 | "err.settings_error": "Ошибка настроек", |
| 456 | "err.settings_save": "Не удалось сохранить настройку.", |
| 457 | "err.explore_disabled": "Раздел «Обзор» отключён на этом сервере.", |
| 458 | "err.activity_disabled": "Активность отключена для этого репозитория.", |
| 459 | "err.pulls_disabled": "Пул-реквесты отключены для этого репозитория.", |
| 460 | "err.releases_disabled": "Релизы отключены для этого репозитория.", |
| 461 | "err.release_not_found": "Релиз не найден", |
| 462 | "err.release_not_found_desc": "Не удалось найти релиз.", |
| 463 | "err.asset_not_found": "Файл не найден", |
| 464 | "err.asset_not_found_desc": "Запрошенный файл релиза не найден.", |
| 465 | "err.issues_disabled": "Задачи отключены для этого репозитория.", |
| 466 | "err.repo_not_found": "Репозиторий не найден", |
| 467 | "err.repo_not_found_desc": "Репозиторий не существует или у вас нет к нему доступа.", |
| 468 | "err.repo_private_desc": "Репозиторий не существует или является приватным.", |
| 469 | "err.access_denied": "Доступ запрещён", |
| 470 | "err.repo_write_denied": "У вас нет прав на изменение этого репозитория.", |
| 471 | "err.invalid_repo_path": "Некорректный путь репозитория", |
| 472 | "err.path_not_found": "Путь не найден", |
| 473 | "err.path_not_found_desc": "Не удалось найти путь в репозитории для ссылки %s", |
| 474 | "err.file_not_found": "Файл не найден", |
| 475 | "err.file_not_found_desc": "Запрошенный файл не найден в %s", |
| 476 | "err.commit_not_found": "Коммит не найден", |
| 477 | "err.commit_not_found_desc": "Не удалось найти коммит %s", |
| 478 | "err.pr_not_found": "Пул-реквест не найден", |
| 479 | "err.pr_not_found_desc": "Не удалось найти пул-реквест.", |
| 480 | "err.pr_state_forbidden": "Вы не можете изменить состояние этого пул-реквеста.", |
| 481 | "err.pr_merge_forbidden": "У вас нет прав на слияние пул-реквестов.", |
| 482 | "err.issue_not_found": "Задача не найдена", |
| 483 | "err.issue_not_found_desc": "Не удалось найти задачу.", |
| 484 | "err.issue_state_forbidden": "Вы не можете изменить состояние этой задачи.", |
| 485 | "err.delete_error": "Ошибка удаления", |
| 486 | "err.repo_delete_failed": "Не удалось удалить репозиторий.", |
| 487 | "err.user_not_found": "Пользователь @%s не существует.", |
| 488 | "err.archive_error": "Ошибка архива", |
| 489 | "err.archive_tar_failed": "Не удалось создать tar.gz архив для %s", |
| 490 | "err.archive_zip_failed": "Не удалось создать zip архив для %s", |
| 491 | |
| 492 | // Форки |
| 493 | "fork.forked_from": "форк от", |
| 494 | "fork.forks": "Форки", |
| 495 | "fork.forks_btn": "Форки", |
| 496 | "fork.fork_btn": "Форк", |
| 497 | "fork.fork_btn_desc": "Создать форк этого репозитория", |
| 498 | "fork.your_fork": "Ваш форк", |
| 499 | "fork.your_fork_desc": "Перейти к вашему форку", |
| 500 | "forks.title": "Форки", |
| 501 | "forks.empty": "Пока никто не форкал этот репозиторий.", |
| 502 | |
| 503 | // Коллабораторы |
| 504 | "collab.title": "Коллабораторы", |
| 505 | "collab.desc": "Люди с доступом к репозиторию", |
| 506 | "collab.owner": "Владелец", |
| 507 | "collab.role": "Роль", |
| 508 | "collab.role_read": "Чтение", |
| 509 | "collab.role_write": "Запись", |
| 510 | "collab.username": "Пользователь", |
| 511 | "collab.username_ph": "username", |
| 512 | "collab.add": "Добавить", |
| 513 | "collab.remove": "Убрать доступ", |
| 514 | "collab.empty": "Коллабораторов пока нет.", |
| 515 | |
| 516 | // Ревью |
| 517 | "reviews.title": "Ревью", |
| 518 | "reviews.approved": "Одобрено", |
| 519 | "reviews.changes_requested": "Запрошены изменения", |
| 520 | "reviews.body_ph": "Комментарий к ревью (необязательно)", |
| 521 | "reviews.approve": "Одобрить", |
| 522 | "reviews.request_changes": "Запросить изменения", |
| 523 | |
| 524 | // Device flow (RFC 8628) |
| 525 | "device.title": "Подключение устройства", |
| 526 | "device.badge": "Git", |
| 527 | "device.desc": "Введите код, который показал git или скрипт-помощник, чтобы выдать устройству доступ к вашему аккаунту.", |
| 528 | "device.check": "Проверить", |
| 529 | "device.authorize_for": "Выдать доступ по коду", |
| 530 | "device.scope_hint": "Доступ даётся на чтение и запись репозиториев, к которым у вас есть права, и действует только для этого устройства.", |
| 531 | "device.approve": "Разрешить", |
| 532 | "device.deny": "Отклонить", |
| 533 | "device.signin_to_approve": "Войдите, чтобы подтвердить доступ", |
| 534 | "device.helper_hint": "Подсказка: настройте credential helper, чтобы код запрашивался автоматически — см. README.", |
| 535 | "device.code_unknown": "Код не найден. Проверьте, что он введён верно.", |
| 536 | "device.code_used": "Этот код уже использован или истёк.", |
| 537 | "device.approved_now": "Готово! Устройство подключено — вернитесь в терминал.", |
| 538 | "device.denied_now": "Запрос отклонён. Устройство не получит доступ.", |
| 539 | |
| 540 | // Flash: форки, коллабораторы, ревью, device flow |
| 541 | "flash.fork_self": "Это ваш репозиторий — форк не нужен.", |
| 542 | "flash.fork_exists": "У вас уже есть форк этого репозитория.", |
| 543 | "flash.fork_created": "Форк создан.", |
| 544 | "flash.fork_failed": "Не удалось создать форк: %s", |
| 545 | "flash.collab_added": "@%s добавлен в коллабораторы.", |
| 546 | "flash.collab_removed": "Доступ коллаборатора отозван.", |
| 547 | "flash.collab_failed": "Не удалось изменить коллаборатора: %s", |
| 548 | "flash.review_self": "Нельзя ревьюить собственный пул-реквест.", |
| 549 | "flash.review_closed": "Ревью доступно только для открытых пул-реквестов.", |
| 550 | "flash.review_failed": "Не удалось сохранить ревью: %s", |
| 551 | "flash.review_approved": "Ревью сохранено: одобрено.", |
| 552 | "flash.review_changes_requested": "Ревью сохранено: запрошены изменения.", |
| 553 | "flash.device_code_required": "Введите код устройства.", |
| 554 | "flash.device_code_invalid": "Код не найден, истёк или уже использован.", |
| 555 | "flash.device_approved": "Устройство авторизовано — можно возвращаться к git.", |
| 556 | "flash.device_denied": "Запрос отклонён.", |
| 557 | |
| 558 | // Прочее |
| 559 | "issues.new": "Новая задача", |
| 560 | "pulls.head_repo": "Из репозитория", |
| 561 | "repo.about": "О репозитории", |
| 562 | "repo.clone_title": "Клонирование", |
| 563 | "repo.created": "Создан", |
| 564 | "repo.updated": "Обновлён", |
| 565 | "repo.view_file": "Открыть", |
| 566 | "err.collab_forbidden": "Управлять коллабораторами может только владелец или администратор.", |
| 567 | "err.pr_head_repo_invalid": "Выбран недопустимый репозиторий-источник.", |
| 568 | |
| 569 | // Media, account deletion & administration |
| 570 | "auth.pending_approval": "Аккаунт ожидает подтверждения администратора.", |
| 571 | "auth.register.pending_notice": "После регистрации аккаунт должен подтвердить администратор.", |
| 572 | "settings.background": "Фон профиля", |
| 573 | "settings.background_upload": "Выбрать фон", |
| 574 | "settings.background_remove": "Убрать фон", |
| 575 | "settings.background_hint": "PNG, JPG, WebP или GIF. Изображение мягко растворяется по краям.", |
| 576 | "settings.delete_account": "Удаление аккаунта", |
| 577 | "settings.delete_account_desc": "Аккаунт и все его репозитории будут удалены без возможности восстановления.", |
| 578 | "settings.delete_account_confirm": "Введите имя пользователя", |
| 579 | "settings.delete_password": "Текущий пароль", |
| 580 | "settings.delete_account_button": "Удалить аккаунт навсегда", |
| 581 | "settings.delete_mismatch": "Имя пользователя не совпадает.", |
| 582 | "settings.delete_last_admin": "Нельзя удалить последнего администратора.", |
| 583 | "repo.avatar": "Аватар репозитория", |
| 584 | "repo.avatar_upload": "Выбрать изображение", |
| 585 | "repo.avatar_remove": "Удалить аватар", |
| 586 | "repo.avatar_hint": "Квадратное изображение до 2 МБ. Без аватара используется изображение владельца.", |
| 587 | "repo.background": "Фон репозитория", |
| 588 | "repo.background_upload": "Выбрать фон", |
| 589 | "repo.background_remove": "Убрать фон", |
| 590 | "repo.background_hint": "PNG, JPG, WebP или GIF до 6 МБ. Изображение мягко растворяется в цвет текущей темы.", |
| 591 | "admin.registration.public": "Публичная регистрация", |
| 592 | "admin.registration.confirm": "Регистрация с подтверждением", |
| 593 | "admin.registration.closed": "Без регистрации", |
| 594 | "admin.registration.public_desc": "Аккаунт активируется сразу.", |
| 595 | "admin.registration.confirm_desc": "Аккаунт активируется после одобрения администратором.", |
| 596 | "admin.registration.closed_desc": "Самостоятельная регистрация новых аккаунтов закрыта.", |
| 597 | "admin.registration.mode": "Новые аккаунты", |
| 598 | "admin.repos": "Репозитории", |
| 599 | "admin.col.status": "Статус", |
| 600 | "admin.col.actions": "Действия", |
| 601 | "admin.pending": "Ожидает", |
| 602 | "admin.approved": "Подтверждён", |
| 603 | "admin.approve": "Подтвердить", |
| 604 | "admin.make_admin": "Сделать админом", |
| 605 | "admin.remove_admin": "Снять админа", |
| 606 | "admin.delete_user": "Удалить", |
| 607 | "admin.delete_repo": "Удалить", |
| 608 | "admin.repo_visibility": "Доступ", |
| 609 | "admin.delete_user_title": "Удалить аккаунт", |
| 610 | "admin.delete_user_desc": "Все репозитории и данные пользователя будут удалены без возможности восстановления.", |
| 611 | "admin.delete_repo_title": "Удалить репозиторий", |
| 612 | "admin.delete_repo_desc": "Git-данные, релизы и файлы будут удалены без возможности восстановления.", |
| 613 | "admin.confirm_user": "Введите имя пользователя", |
| 614 | "admin.confirm_repo": "Введите название репозитория", |
| 615 | "flash.image_invalid": "Изображение слишком большое или имеет неподдерживаемый формат.", |
| 616 | "flash.image_save_failed": "Не удалось сохранить изображение. Попробуйте ещё раз.", |
| 617 | "flash.account_deleted": "Аккаунт и все его репозитории удалены.", |
| 618 | "flash.account_delete_failed": "Не удалось удалить аккаунт.", |
| 619 | "flash.admin_user_approved": "Аккаунт @%s подтверждён.", |
| 620 | "flash.admin_user_missing": "Пользователь не найден.", |
| 621 | "flash.admin_user_update_failed": "Не удалось обновить пользователя.", |
| 622 | "flash.admin_self_role": "Нельзя менять собственную роль через админку.", |
| 623 | "flash.admin_last_admin": "Нельзя удалить или понизить последнего администратора.", |
| 624 | "flash.admin_role_updated": "Роль @%s обновлена.", |
| 625 | "flash.admin_delete_self": "Удалить собственный аккаунт можно только в настройках профиля.", |
| 626 | "flash.admin_delete_mismatch": "Подтверждение не совпадает.", |
| 627 | "flash.admin_user_delete_failed": "Не удалось удалить пользователя.", |
| 628 | "flash.admin_user_deleted": "Пользователь @%s и его репозитории удалены.", |
| 629 | "flash.admin_repo_missing": "Репозиторий не найден.", |
| 630 | "flash.admin_repo_delete_failed": "Не удалось удалить репозиторий.", |
| 631 | "flash.admin_repo_deleted": "Репозиторий %s/%s удалён.", |
| 632 | "flash.admin_registration_invalid": "Некорректный режим регистрации."}, |
| 633 | EN: { |
| 634 | // Navigation & Common |
| 635 | "app.tagline": "Lightweight self-hosted Git hosting", |
| 636 | "nav.home": "Home", |
| 637 | "nav.repositories": "Repositories", |
| 638 | "nav.explore": "Explore", |
| 639 | "nav.settings": "Settings", |
| 640 | "nav.admin": "Admin", |
| 641 | "nav.agents": "For AI agents", |
| 642 | "nav.login": "Sign in", |
| 643 | "nav.register": "Sign up", |
| 644 | "nav.logout": "Sign out", |
| 645 | "nav.new_repo": "New", |
| 646 | "nav.command_palette": "Search & commands", |
| 647 | "nav.search_placeholder": "Search...", |
| 648 | "nav.theme": "Theme", |
| 649 | "nav.lang": "Language", |
| 650 | "common.copy": "Copy", |
| 651 | "common.copied": "Copied", |
| 652 | "common.copy_failed": "Could not copy", |
| 653 | "common.cancel": "Cancel", |
| 654 | "common.save": "Save", |
| 655 | "common.delete": "Delete", |
| 656 | "common.close": "Close", |
| 657 | "common.never": "Never", |
| 658 | "common.newer": "Newer", |
| 659 | "common.older": "Older", |
| 660 | "common.up": "Up", |
| 661 | |
| 662 | // Themes (only 3) |
| 663 | "theme.light": "Light", |
| 664 | "theme.dark": "Dark", |
| 665 | "theme.system": "System", |
| 666 | |
| 667 | // Landing |
| 668 | "landing.badge": "Single Binary · SQLite · Zero Dependencies", |
| 669 | "landing.hero.title": "Lightweight self-hosted Git hosting", |
| 670 | "landing.hero.subtitle": "A single Go binary backed by SQLite. Deploys in a minute, uses minimal memory, and stays out of your way.", |
| 671 | "landing.hero.cta_start": "Get Started", |
| 672 | "landing.features.title": "Principles", |
| 673 | "landing.feat1.title": "Single Binary", |
| 674 | "landing.feat1.desc": "Templates, styles, fonts, migrations, and icons are compiled in via go:embed.", |
| 675 | "landing.feat2.title": "SQLite (WAL)", |
| 676 | "landing.feat2.desc": "Your entire database is a single data/polar.db file without CGO. Back up by copying.", |
| 677 | "landing.feat3.title": "Fast & Quiet", |
| 678 | "landing.feat3.desc": "Instant cold start, server-side rendering, and < 30 MB idle memory.", |
| 679 | "landing.feat4.title": "Private by Default", |
| 680 | "landing.feat4.desc": "Public and private repositories, Argon2id passwords, and Git HTTP access tokens.", |
| 681 | |
| 682 | // Auth |
| 683 | "auth.login.title": "Sign in", |
| 684 | "auth.register.title": "Create account", |
| 685 | "auth.register.disabled": "Public registration is disabled by the administrator.", |
| 686 | "auth.username": "Username", |
| 687 | "auth.username_hint": "2–32 characters: letters, digits, hyphen, underscore", |
| 688 | "auth.username_or_email": "Username or Email", |
| 689 | "auth.email": "Email", |
| 690 | "auth.password": "Password", |
| 691 | "auth.password_hint": "At least 8 characters", |
| 692 | "auth.submit_login": "Sign in", |
| 693 | "auth.submit_register": "Create account", |
| 694 | "auth.no_account": "No account?", |
| 695 | "auth.have_account": "Have an account?", |
| 696 | "auth.invalid_creds": "Invalid username/email or password", |
| 697 | |
| 698 | // Repositories |
| 699 | "repo.new.title": "New repository", |
| 700 | "repo.name": "Name", |
| 701 | "repo.name_hint": "Letters, digits, '.', '-', '_'", |
| 702 | "repo.description": "Description", |
| 703 | "repo.description_ph": "Short description (optional)", |
| 704 | "repo.visibility": "Visibility", |
| 705 | "repo.public": "Public", |
| 706 | "repo.public_desc": "Anyone can view and clone this repository", |
| 707 | "repo.private": "Private", |
| 708 | "repo.private_desc": "Accessible only to you", |
| 709 | "repo.create_btn": "Create repository", |
| 710 | "repo.filter_ph": "Filter repositories...", |
| 711 | "repo.empty_list": "No repositories yet", |
| 712 | "repo.empty_list_sub": "Create your first repository to push code.", |
| 713 | "repo.empty.title": "Repository is empty", |
| 714 | "repo.empty.new_cmd": "Create a new repository on the command line", |
| 715 | "repo.empty.push_cmd": "Push an existing repository", |
| 716 | "repo.tab.code": "Code", |
| 717 | "repo.tab.commits": "Commits", |
| 718 | "repo.tab.branches": "Branches & Tags", |
| 719 | "repo.tab.issues": "Issues", |
| 720 | "repo.tab.pulls": "Pull requests", |
| 721 | "repo.tab.releases": "Releases", |
| 722 | "repo.tab.activity": "Activity", |
| 723 | "repo.tab.settings": "Settings", |
| 724 | "repo.features": "Repository Features", |
| 725 | "repo.clone": "Clone", |
| 726 | "repo.download_zip": "Download ZIP", |
| 727 | "repo.branches": "Branches", |
| 728 | "repo.tags": "Tags", |
| 729 | "repo.default_branch": "Default branch", |
| 730 | "repo.find_file": "Filter files...", |
| 731 | "repo.files": "Files", |
| 732 | "repo.readme": "README", |
| 733 | "repo.raw": "Raw", |
| 734 | "repo.history": "History", |
| 735 | "repo.lines": "lines", |
| 736 | "repo.lines_one": "line", |
| 737 | "repo.lines_few": "lines", |
| 738 | "repo.lines_many": "lines", |
| 739 | "repo.binary_notice": "Binary file — inline preview unavailable", |
| 740 | "repo.download_raw": "Download file", |
| 741 | "repo.browse_at_commit": "Browse files", |
| 742 | "repo.files_changed": "files changed", |
| 743 | "repo.files_changed_one": "file changed", |
| 744 | "repo.files_changed_few": "files changed", |
| 745 | "repo.files_changed_many": "files changed", |
| 746 | "repo.no_commits": "No commits yet", |
| 747 | "repo.danger_zone": "Danger Zone", |
| 748 | "repo.delete": "Delete repository", |
| 749 | "repo.delete_desc": "Once deleted, the repository and its git history cannot be recovered.", |
| 750 | "repo.delete_confirm": "Type the repository name to confirm", |
| 751 | "repo.rename": "Rename", |
| 752 | "repo.save": "Save", |
| 753 | "repo.branch.new": "New branch", |
| 754 | "repo.branch.name_ph": "Branch name (e.g. feat/ui)", |
| 755 | "repo.branch.from": "From branch / ref", |
| 756 | "repo.branch.create": "Create branch", |
| 757 | "repo.branch.default": "default", |
| 758 | "repo.tag.new": "New tag / release", |
| 759 | "repo.tag.name_ph": "Tag (e.g. v1.0.0)", |
| 760 | "repo.tag.msg_ph": "Tag note (optional)", |
| 761 | "repo.tag.create": "Create tag", |
| 762 | "repo.tags.empty": "No tags yet", |
| 763 | |
| 764 | // Pull Requests |
| 765 | "pulls.title": "Pull requests", |
| 766 | "pulls.new": "New pull request", |
| 767 | "pulls.empty": "No pull requests yet", |
| 768 | "pulls.open": "Open", |
| 769 | "pulls.closed": "Closed", |
| 770 | "pulls.merged": "Merged", |
| 771 | "pulls.compare": "Comparing changes", |
| 772 | "pulls.base": "base", |
| 773 | "pulls.head": "compare", |
| 774 | "pulls.title_ph": "Pull request title...", |
| 775 | "pulls.desc_ph": "Describe your changes (Markdown supported)...", |
| 776 | "pulls.create_btn": "Create pull request", |
| 777 | "pulls.merge_btn": "Merge pull request", |
| 778 | "pulls.can_merge": "Able to merge automatically.", |
| 779 | "pulls.cannot_merge": "Can't automatically merge: conflicts detected.", |
| 780 | "pulls.already_merged": "The head branch is already merged into base.", |
| 781 | "pulls.close_btn": "Close PR", |
| 782 | "pulls.reopen_btn": "Reopen PR", |
| 783 | "pulls.comment_btn": "Comment", |
| 784 | "pulls.conversation": "Conversation", |
| 785 | "pulls.files_changed": "Files changed", |
| 786 | "pulls.commits": "Commits", |
| 787 | "pulls.able_to_merge": "Able to merge automatically", |
| 788 | "pulls.body": "Description", |
| 789 | "pulls.body_ph": "Describe your changes (Markdown supported)...", |
| 790 | "pulls.branches_identical": "Branches are identical — nothing to compare", |
| 791 | "pulls.cannot_merge_warning": "Conflicts detected — automatic merge is not possible", |
| 792 | "pulls.closed_desc": "The head branch was not merged into base.", |
| 793 | "pulls.closed_message": "Pull request closed", |
| 794 | "pulls.comment_ph": "Write a comment (Markdown supported)...", |
| 795 | "pulls.compare_branches": "Comparing branches", |
| 796 | "pulls.conflicts_desc": "Resolve the conflicts locally and push to the head branch.", |
| 797 | "pulls.conflicts_title": "Merge conflicts detected", |
| 798 | "pulls.into": "into", |
| 799 | "pulls.merge_clean": "No conflicts — changes can be merged.", |
| 800 | "pulls.merged_message": "Pull request merged", |
| 801 | "pulls.no_changes": "No files changed", |
| 802 | "pulls.no_commits": "No commits in this pull request yet", |
| 803 | "pulls.only_write_merge": "Only users with write access can merge pull requests.", |
| 804 | "pulls.status.closed": "Closed", |
| 805 | "pulls.status.merged": "Merged", |
| 806 | "pulls.status.open": "Open", |
| 807 | "pulls.wants_to_merge": "wants to merge", |
| 808 | |
| 809 | // Releases |
| 810 | "releases.title": "Releases", |
| 811 | "releases.new": "Draft a new release", |
| 812 | "releases.assets_upload": "Release files", |
| 813 | "releases.assets_upload_hint": "Optional. Up to 20 files, 100 MB each.", |
| 814 | "releases.asset_delete": "Delete file", |
| 815 | "releases.asset_delete_confirm": "Delete this file? This cannot be undone.", |
| 816 | "releases.empty": "No releases yet", |
| 817 | "releases.tag_select": "Tag", |
| 818 | "releases.title_ph": "Release title", |
| 819 | "releases.desc_ph": "Describe this release, release notes (Markdown)...", |
| 820 | "releases.prerelease": "This is a pre-release", |
| 821 | "releases.publish": "Publish release", |
| 822 | "releases.delete": "Delete release", |
| 823 | "releases.edit": "Edit release", |
| 824 | "releases.edit_title": "Edit release", |
| 825 | "releases.save_btn": "Save changes", |
| 826 | "releases.current_assets": "Current files", |
| 827 | "releases.add_assets": "Add files", |
| 828 | "releases.tag_locked": "The tag cannot be changed after publishing.", |
| 829 | "releases.assets": "Assets", |
| 830 | "releases.source_zip": "Source code (zip)", |
| 831 | "releases.source_tar": "Source code (tar.gz)", |
| 832 | "releases.body": "Description", |
| 833 | "releases.body_ph": "Describe this release, release notes (Markdown)...", |
| 834 | "releases.count": "releases", |
| 835 | "releases.count_one": "release", |
| 836 | "releases.count_few": "releases", |
| 837 | "releases.count_many": "releases", |
| 838 | "releases.delete_confirm": "Delete this release? This cannot be undone.", |
| 839 | "releases.is_prerelease": "This is a pre-release", |
| 840 | "releases.publish_btn": "Publish release", |
| 841 | "releases.tag_desc": "An existing tag or a new one — it will be created automatically.", |
| 842 | "releases.tag_name": "Tag", |
| 843 | "releases.tags": "tags", |
| 844 | "releases.tags_one": "tag", |
| 845 | "releases.tags_few": "tags", |
| 846 | "releases.tags_many": "tags", |
| 847 | "releases.target": "Branch", |
| 848 | "releases.target_desc": "Branch or commit the tag will point to.", |
| 849 | |
| 850 | // Activity |
| 851 | "activity.title": "Activity", |
| 852 | "activity.pulse": "Activity overview", |
| 853 | "activity.empty": "No recent activity recorded.", |
| 854 | "activity.commits": "commits", |
| 855 | "activity.open_prs": "open PRs", |
| 856 | "activity.merged_prs": "merged PRs", |
| 857 | "activity.open_issues": "open issues", |
| 858 | "activity.releases": "releases", |
| 859 | "activity.issues": "opened and closed", |
| 860 | "activity.on_default_branch": "on the default branch", |
| 861 | "activity.published_releases": "published releases", |
| 862 | "activity.pull_requests": "opened and merged", |
| 863 | "activity.recent_feed": "Activity feed", |
| 864 | "activity.badge_commit": "commit", |
| 865 | "activity.badge_release": "release", |
| 866 | |
| 867 | // Issues |
| 868 | "issue.new": "New issue", |
| 869 | "issue.title": "Title", |
| 870 | "issue.title_ph": "Brief summary of the issue", |
| 871 | "issue.body": "Description", |
| 872 | "issue.body_ph": "Detailed description (Markdown supported)...", |
| 873 | "issue.create": "Create issue", |
| 874 | "issue.open": "Open", |
| 875 | "issue.closed": "Closed", |
| 876 | "issue.status.open": "Open", |
| 877 | "issue.status.closed": "Closed", |
| 878 | "issue.close_btn": "Close issue", |
| 879 | "issue.reopen_btn": "Reopen", |
| 880 | "issue.comment_ph": "Write a comment (Markdown supported)...", |
| 881 | "issue.comment_btn": "Comment", |
| 882 | "issue.empty": "No issues in this list", |
| 883 | |
| 884 | // Settings, Profile & Tokens |
| 885 | "settings.title": "Settings", |
| 886 | "settings.profile": "Profile", |
| 887 | "settings.avatar": "Avatar", |
| 888 | "settings.avatar_upload": "Choose image", |
| 889 | "settings.avatar_remove": "Remove avatar", |
| 890 | "settings.avatar_hint": "PNG, JPG, WebP, or GIF — automatically cropped to 256×256", |
| 891 | "settings.full_name": "Display name", |
| 892 | "settings.full_name_ph": "Your name", |
| 893 | "settings.bio": "Bio", |
| 894 | "settings.bio_ph": "Short profile bio", |
| 895 | "settings.location": "Location", |
| 896 | "settings.location_ph": "City, Country", |
| 897 | "settings.website": "Website", |
| 898 | "settings.website_ph": "https://example.com", |
| 899 | "profile.edit": "Edit profile", |
| 900 | "profile.joined": "Joined", |
| 901 | "profile.public_repos": "Public", |
| 902 | "profile.private_repos": "Private", |
| 903 | "profile.total_repos": "Repositories", |
| 904 | "settings.tokens": "Access Tokens", |
| 905 | "settings.tokens.desc": "Use a token instead of your password for git clone and git push over HTTP.", |
| 906 | "settings.token.name": "Token name (e.g., Laptop)", |
| 907 | "settings.token.create": "Create", |
| 908 | "settings.token.revoke": "Revoke", |
| 909 | "settings.token.created_once": "Copy this token now — it will only be shown once:", |
| 910 | "settings.token.col_name": "Name", |
| 911 | "settings.token.col_prefix": "Prefix", |
| 912 | "settings.token.col_created": "Created", |
| 913 | "settings.token.col_used": "Last used", |
| 914 | "settings.token.empty": "No access tokens yet", |
| 915 | "settings.password.current": "Current password", |
| 916 | "settings.password.new": "New password", |
| 917 | "settings.password.update": "Update password", |
| 918 | |
| 919 | // Admin |
| 920 | "admin.title": "Administration", |
| 921 | "admin.features": "Features & Access", |
| 922 | "admin.users": "Users", |
| 923 | "admin.registration": "Public registration", |
| 924 | "admin.registration.desc": "Allow new users to create accounts", |
| 925 | "admin.explore": "Explore page", |
| 926 | "admin.explore.desc": "Show public repository directory in sidebar and at /explore", |
| 927 | "admin.landing": "Landing page", |
| 928 | "admin.landing.desc": "Show landing page on root URL (if disabled, redirects to repos or sign in)", |
| 929 | "admin.anon_read": "Anonymous read access", |
| 930 | "admin.anon_read.desc": "Allow unauthenticated guests to browse public repositories and profiles", |
| 931 | "admin.issues": "Issue tracker", |
| 932 | "admin.issues.desc": "Enable the Issues tab inside repositories", |
| 933 | "admin.enabled": "Enabled", |
| 934 | "admin.disabled": "Disabled", |
| 935 | "admin.enable_btn": "Enable", |
| 936 | "admin.disable_btn": "Disable", |
| 937 | "admin.col.user": "User", |
| 938 | "admin.col.repos": "Repos", |
| 939 | "admin.col.role": "Role", |
| 940 | "admin.col.joined": "Joined", |
| 941 | "admin.role.admin": "Admin", |
| 942 | "admin.role.user": "User", |
| 943 | |
| 944 | // Command Palette & Shortcuts |
| 945 | "palette.placeholder": "Search repositories, files, or commands...", |
| 946 | "palette.group.nav": "Navigation", |
| 947 | "palette.group.themes": "Theme", |
| 948 | "palette.group.repos": "Repositories", |
| 949 | "shortcuts.title": "Keyboard shortcuts", |
| 950 | "shortcuts.palette": "Command palette", |
| 951 | "shortcuts.search": "Focus search", |
| 952 | "shortcuts.home": "Go home", |
| 953 | "shortcuts.files": "Filter files", |
| 954 | "shortcuts.sidebar": "Toggle sidebar", |
| 955 | "shortcuts.shortcuts": "Show this dialog", |
| 956 | "shortcuts.context_menu": "Open context menu", |
| 957 | "shortcuts.theme": "Cycle theme", |
| 958 | "shortcuts.copy_url": "Copy page URL", |
| 959 | "shortcuts.close": "Close menu or dialog", |
| 960 | "shortcuts.profile": "Your profile", |
| 961 | "shortcuts.new_repo": "New repository", |
| 962 | "shortcuts.unavailable": "This shortcut is unavailable here", |
| 963 | "shortcuts.group.general": "General", |
| 964 | "shortcuts.group.navigation": "Navigation", |
| 965 | "shortcuts.group.repo": "Repository", |
| 966 | "nav.toggle_sidebar": "Sidebar (Ctrl+B)", |
| 967 | |
| 968 | // Context menu |
| 969 | "contextmenu.title": "Context menu", |
| 970 | "contextmenu.selection": "Selection", |
| 971 | "contextmenu.copy_selection": "Copy selection", |
| 972 | "contextmenu.search_selection": "Search selection", |
| 973 | "contextmenu.link": "Link", |
| 974 | "contextmenu.open_link": "Open in new tab", |
| 975 | "contextmenu.copy_link": "Copy link address", |
| 976 | "contextmenu.copy_link_text": "Copy link text", |
| 977 | "contextmenu.image": "Image", |
| 978 | "contextmenu.open_image": "Open image in new tab", |
| 979 | "contextmenu.copy_image": "Copy image address", |
| 980 | "contextmenu.save_image": "Save image", |
| 981 | "contextmenu.page": "Page", |
| 982 | "contextmenu.back": "Back", |
| 983 | "contextmenu.forward": "Forward", |
| 984 | "contextmenu.reload": "Reload", |
| 985 | "contextmenu.copy_url": "Copy page URL", |
| 986 | |
| 987 | // Flash messages |
| 988 | "flash.welcome": "Welcome to Polar, @%s!", |
| 989 | "flash.profile_updated": "Profile updated.", |
| 990 | "flash.password_updated": "Password changed successfully.", |
| 991 | "flash.token_revoked": "Access token revoked.", |
| 992 | "flash.settings_updated": "Settings saved.", |
| 993 | "flash.error": "Error: %s", |
| 994 | "flash.comment_error": "Could not post the comment: %s", |
| 995 | "flash.pr_created": "Pull request #%d created.", |
| 996 | "flash.pr_closed": "Pull request #%d closed.", |
| 997 | "flash.pr_reopened": "Pull request #%d reopened.", |
| 998 | "flash.pr_merged": "Pull request #%d merged.", |
| 999 | "flash.pr_merged_state": "Cannot change the state of a merged pull request.", |
| 1000 | "flash.pr_merge_open_only": "Only an open pull request can be merged.", |
| 1001 | "flash.pr_merge_failed": "Could not merge: %s", |
| 1002 | "flash.release_tag_empty": "Tag name cannot be empty.", |
| 1003 | "flash.release_tag_failed": "Could not create the tag: %s", |
| 1004 | "flash.release_create_failed": "Could not create the release: %s", |
| 1005 | "flash.release_published": "Release %s published.", |
| 1006 | "flash.release_delete_failed": "Could not delete the release: %s", |
| 1007 | "flash.release_deleted": "Release deleted.", |
| 1008 | "flash.release_updated": "Release %s updated.", |
| 1009 | "flash.release_update_failed": "Could not update the release: %s", |
| 1010 | "flash.release_updated_with_assets": "Release %s updated with %d new file(s).", |
| 1011 | "flash.release_updated_assets_failed": "Release %s updated, but some files could not be saved.", |
| 1012 | "flash.release_published_with_assets": "Release %s published with %d attached file(s).", |
| 1013 | "flash.release_published_assets_failed": "Release %s published, but some files could not be saved.", |
| 1014 | "flash.release_asset_too_many": "Too many files: %d max.", |
| 1015 | "flash.release_asset_too_big": "File is too large — 100 MB per-file limit.", |
| 1016 | "flash.release_asset_deleted": "File deleted.", |
| 1017 | "flash.release_asset_delete_failed": "Could not delete the file: %s", |
| 1018 | "file.new_file": "New file", |
| 1019 | "file.new_folder": "New folder", |
| 1020 | "file.path": "Path", |
| 1021 | "file.path_ph": "e.g. src/main.go", |
| 1022 | "file.folder_ph": "e.g. docs", |
| 1023 | "file.branch": "Branch", |
| 1024 | "file.content": "Content", |
| 1025 | "file.content_ph": "File contents…", |
| 1026 | "file.message": "Commit message", |
| 1027 | "file.create_file": "Create file", |
| 1028 | "file.create_folder": "Create folder", |
| 1029 | "file.folder_hint": "Git does not track empty folders — Polar adds a .gitkeep placeholder.", |
| 1030 | "flash.file_created": "File created.", |
| 1031 | "flash.folder_created": "Folder created.", |
| 1032 | "flash.file_exists": "A file with that path already exists.", |
| 1033 | "flash.path_invalid": "Invalid path.", |
| 1034 | "flash.file_create_failed": "Could not create the file.", |
| 1035 | "flash.folder_create_failed": "Could not create the folder.", |
| 1036 | "file.upload_file": "Upload files", |
| 1037 | "file.upload_dest": "Destination folder", |
| 1038 | "file.upload_dest_ph": "e.g. docs/images (optional)", |
| 1039 | "file.upload_pick": "Choose files or drag them here", |
| 1040 | "file.upload_hint": "Up to 25 files, 50 MB in total.", |
| 1041 | "file.upload_submit": "Upload", |
| 1042 | "file.upload_replace_hint": "Existing files will be overwritten.", |
| 1043 | "flash.upload_done": "Uploaded %d file(s).", |
| 1044 | "flash.upload_none": "No files selected.", |
| 1045 | "flash.upload_failed": "Could not upload the files.", |
| 1046 | "flash.upload_too_big": "Upload is too large — 50 MB limit.", |
| 1047 | "flash.upload_too_many": "Too many files: %d max.", "flash.repo_settings_saved": "Repository settings saved.", |
| 1048 | "flash.repo_rename_failed": "Could not rename: %s", |
| 1049 | "flash.repo_renamed": "Repository renamed to %s.", |
| 1050 | "flash.repo_confirm_mismatch": "The name you typed does not match the repository name.", |
| 1051 | "flash.repo_deleted": "Repository %s deleted.", |
| 1052 | "flash.branch_created": "Branch %s created.", |
| 1053 | "flash.branch_create_failed": "Could not create the branch: %s", |
| 1054 | "flash.branch_default_delete": "The default branch cannot be deleted.", |
| 1055 | "flash.branch_deleted": "Branch %s deleted.", |
| 1056 | "flash.branch_delete_failed": "Could not delete the branch: %s", |
| 1057 | "flash.tag_created": "Tag %s created.", |
| 1058 | "flash.tag_create_failed": "Could not create the tag: %s", |
| 1059 | "flash.tag_deleted": "Tag %s deleted.", |
| 1060 | "flash.tag_delete_failed": "Could not delete the tag: %s", |
| 1061 | "flash.issue_closed": "Issue #%d closed.", |
| 1062 | "flash.issue_reopened": "Issue #%d reopened.", |
| 1063 | |
| 1064 | // Error pages |
| 1065 | "err.not_found": "Not found", |
| 1066 | "err.forbidden": "Access denied", |
| 1067 | "err.session_error": "Session error", |
| 1068 | "err.session_create": "Could not create a session.", |
| 1069 | "err.settings_error": "Settings error", |
| 1070 | "err.settings_save": "Could not save the setting.", |
| 1071 | "err.explore_disabled": "Explore is disabled on this server.", |
| 1072 | "err.activity_disabled": "Activity is disabled for this repository.", |
| 1073 | "err.pulls_disabled": "Pull requests are disabled for this repository.", |
| 1074 | "err.releases_disabled": "Releases are disabled for this repository.", |
| 1075 | "err.release_not_found": "Release not found", |
| 1076 | "err.release_not_found_desc": "Could not find the release.", |
| 1077 | "err.asset_not_found": "File not found", |
| 1078 | "err.asset_not_found_desc": "The requested release file was not found.", |
| 1079 | "err.issues_disabled": "Issues are disabled for this repository.", |
| 1080 | "err.repo_not_found": "Repository not found", |
| 1081 | "err.repo_not_found_desc": "The repository does not exist or you do not have access to it.", |
| 1082 | "err.repo_private_desc": "The repository does not exist or is private.", |
| 1083 | "err.access_denied": "Access denied", |
| 1084 | "err.repo_write_denied": "You do not have permission to modify this repository.", |
| 1085 | "err.invalid_repo_path": "Invalid repository path", |
| 1086 | "err.path_not_found": "Path not found", |
| 1087 | "err.path_not_found_desc": "Could not find the path in the repository for ref %s", |
| 1088 | "err.file_not_found": "File not found", |
| 1089 | "err.file_not_found_desc": "The requested file was not found in %s", |
| 1090 | "err.commit_not_found": "Commit not found", |
| 1091 | "err.commit_not_found_desc": "Could not find commit %s", |
| 1092 | "err.pr_not_found": "Pull request not found", |
| 1093 | "err.pr_not_found_desc": "Could not find the pull request.", |
| 1094 | "err.pr_state_forbidden": "You cannot change the state of this pull request.", |
| 1095 | "err.pr_merge_forbidden": "You do not have permission to merge pull requests.", |
| 1096 | "err.issue_not_found": "Issue not found", |
| 1097 | "err.issue_not_found_desc": "Could not find the issue.", |
| 1098 | "err.issue_state_forbidden": "You cannot change the state of this issue.", |
| 1099 | "err.delete_error": "Delete error", |
| 1100 | "err.repo_delete_failed": "Could not delete the repository.", |
| 1101 | "err.user_not_found": "User @%s does not exist.", |
| 1102 | "err.archive_error": "Archive error", |
| 1103 | "err.archive_tar_failed": "Could not create a tar.gz archive for %s", |
| 1104 | "err.archive_zip_failed": "Could not create a zip archive for %s", |
| 1105 | |
| 1106 | // Forks |
| 1107 | "fork.forked_from": "forked from", |
| 1108 | "fork.forks": "Forks", |
| 1109 | "fork.forks_btn": "Forks", |
| 1110 | "fork.fork_btn": "Fork", |
| 1111 | "fork.fork_btn_desc": "Create a fork of this repository", |
| 1112 | "fork.your_fork": "Your fork", |
| 1113 | "fork.your_fork_desc": "Go to your fork", |
| 1114 | "forks.title": "Forks", |
| 1115 | "forks.empty": "Nobody has forked this repository yet.", |
| 1116 | |
| 1117 | // Collaborators |
| 1118 | "collab.title": "Collaborators", |
| 1119 | "collab.desc": "People with access to this repository", |
| 1120 | "collab.owner": "Owner", |
| 1121 | "collab.role": "Role", |
| 1122 | "collab.role_read": "Read", |
| 1123 | "collab.role_write": "Write", |
| 1124 | "collab.username": "User", |
| 1125 | "collab.username_ph": "username", |
| 1126 | "collab.add": "Add", |
| 1127 | "collab.remove": "Revoke access", |
| 1128 | "collab.empty": "No collaborators yet.", |
| 1129 | |
| 1130 | // Reviews |
| 1131 | "reviews.title": "Reviews", |
| 1132 | "reviews.approved": "Approved", |
| 1133 | "reviews.changes_requested": "Changes requested", |
| 1134 | "reviews.body_ph": "Review comment (optional)", |
| 1135 | "reviews.approve": "Approve", |
| 1136 | "reviews.request_changes": "Request changes", |
| 1137 | |
| 1138 | // Device flow (RFC 8628) |
| 1139 | "device.title": "Device authorization", |
| 1140 | "device.badge": "Git", |
| 1141 | "device.desc": "Enter the code shown by git or the credential helper to grant this device access to your account.", |
| 1142 | "device.check": "Check", |
| 1143 | "device.authorize_for": "Grant access to code", |
| 1144 | "device.scope_hint": "Access covers repositories you can already reach and is bound to this device only.", |
| 1145 | "device.approve": "Approve", |
| 1146 | "device.deny": "Deny", |
| 1147 | "device.signin_to_approve": "Sign in to approve access", |
| 1148 | "device.helper_hint": "Tip: configure the credential helper so the code is requested automatically — see the README.", |
| 1149 | "device.code_unknown": "Code not found. Double-check the code you entered.", |
| 1150 | "device.code_used": "This code has already been used or expired.", |
| 1151 | "device.approved_now": "All set! The device is authorized — return to your terminal.", |
| 1152 | "device.denied_now": "Request denied. The device will not get access.", |
| 1153 | |
| 1154 | // Flash: forks, collaborators, reviews, device flow |
| 1155 | "flash.fork_self": "This repository is yours — no fork needed.", |
| 1156 | "flash.fork_exists": "You already have a fork of this repository.", |
| 1157 | "flash.fork_created": "Fork created.", |
| 1158 | "flash.fork_failed": "Could not create fork: %s", |
| 1159 | "flash.collab_added": "@%s added as a collaborator.", |
| 1160 | "flash.collab_removed": "Collaborator access revoked.", |
| 1161 | "flash.collab_failed": "Could not update collaborator: %s", |
| 1162 | "flash.review_self": "You cannot review your own pull request.", |
| 1163 | "flash.review_closed": "Reviews are only available on open pull requests.", |
| 1164 | "flash.review_failed": "Could not save the review: %s", |
| 1165 | "flash.review_approved": "Review saved: approved.", |
| 1166 | "flash.review_changes_requested": "Review saved: changes requested.", |
| 1167 | "flash.device_code_required": "Enter the device code.", |
| 1168 | "flash.device_code_invalid": "Code not found, expired, or already used.", |
| 1169 | "flash.device_approved": "Device authorized — you can return to git.", |
| 1170 | "flash.device_denied": "Request denied.", |
| 1171 | |
| 1172 | // Misc |
| 1173 | "issues.new": "New issue", |
| 1174 | "pulls.head_repo": "From repository", |
| 1175 | "repo.about": "About", |
| 1176 | "repo.clone_title": "Clone", |
| 1177 | "repo.created": "Created", |
| 1178 | "repo.updated": "Updated", |
| 1179 | "repo.view_file": "Open", |
| 1180 | "err.collab_forbidden": "Only the owner or an administrator can manage collaborators.", |
| 1181 | "err.pr_head_repo_invalid": "The selected source repository is not allowed.", |
| 1182 | |
| 1183 | // Media, account deletion & administration |
| 1184 | "auth.pending_approval": "This account is waiting for administrator approval.", |
| 1185 | "auth.register.pending_notice": "An administrator must approve the account after sign-up.", |
| 1186 | "settings.background": "Profile background", |
| 1187 | "settings.background_upload": "Choose background", |
| 1188 | "settings.background_remove": "Remove background", |
| 1189 | "settings.background_hint": "PNG, JPG, WebP, or GIF. The image fades gently at the edges.", |
| 1190 | "settings.delete_account": "Delete account", |
| 1191 | "settings.delete_account_desc": "The account and all of its repositories will be permanently deleted.", |
| 1192 | "settings.delete_account_confirm": "Type your username to confirm", |
| 1193 | "settings.delete_password": "Current password", |
| 1194 | "settings.delete_account_button": "Delete account permanently", |
| 1195 | "settings.delete_mismatch": "The username does not match.", |
| 1196 | "settings.delete_last_admin": "The last administrator account cannot be deleted.", |
| 1197 | "repo.avatar": "Repository avatar", |
| 1198 | "repo.avatar_upload": "Choose image", |
| 1199 | "repo.avatar_remove": "Remove avatar", |
| 1200 | "repo.avatar_hint": "A square image up to 2 MB. The owner avatar is used when empty.", |
| 1201 | "repo.background": "Repository background", |
| 1202 | "repo.background_upload": "Choose background", |
| 1203 | "repo.background_remove": "Remove background", |
| 1204 | "repo.background_hint": "PNG, JPG, WebP, or GIF up to 6 MB. The image fades into the current theme.", |
| 1205 | "admin.registration.public": "Public Registration", |
| 1206 | "admin.registration.confirm": "Confirm-only Registration", |
| 1207 | "admin.registration.closed": "No Registration", |
| 1208 | "admin.registration.public_desc": "Accounts become active immediately.", |
| 1209 | "admin.registration.confirm_desc": "Accounts become active after administrator approval.", |
| 1210 | "admin.registration.closed_desc": "New accounts cannot be created by visitors.", |
| 1211 | "admin.registration.mode": "New accounts", |
| 1212 | "admin.repos": "Repositories", |
| 1213 | "admin.col.status": "Status", |
| 1214 | "admin.col.actions": "Actions", |
| 1215 | "admin.pending": "Pending", |
| 1216 | "admin.approved": "Approved", |
| 1217 | "admin.approve": "Approve", |
| 1218 | "admin.make_admin": "Make admin", |
| 1219 | "admin.remove_admin": "Remove admin", |
| 1220 | "admin.delete_user": "Delete", |
| 1221 | "admin.delete_repo": "Delete", |
| 1222 | "admin.repo_visibility": "Access", |
| 1223 | "admin.delete_user_title": "Delete account", |
| 1224 | "admin.delete_user_desc": "All repositories and user data will be permanently deleted.", |
| 1225 | "admin.delete_repo_title": "Delete repository", |
| 1226 | "admin.delete_repo_desc": "Git data, releases, and uploaded files will be permanently deleted.", |
| 1227 | "admin.confirm_user": "Type the username", |
| 1228 | "admin.confirm_repo": "Type the repository name", |
| 1229 | "flash.image_invalid": "The image is too large or uses an unsupported format.", |
| 1230 | "flash.image_save_failed": "The image could not be saved. Please try again.", |
| 1231 | "flash.account_deleted": "The account and all of its repositories were deleted.", |
| 1232 | "flash.account_delete_failed": "Could not delete the account.", |
| 1233 | "flash.admin_user_approved": "Account @%s approved.", |
| 1234 | "flash.admin_user_missing": "User not found.", |
| 1235 | "flash.admin_user_update_failed": "Could not update the user.", |
| 1236 | "flash.admin_self_role": "You cannot change your own role from the admin panel.", |
| 1237 | "flash.admin_last_admin": "The last administrator cannot be removed or demoted.", |
| 1238 | "flash.admin_role_updated": "The role for @%s was updated.", |
| 1239 | "flash.admin_delete_self": "Delete your own account from profile settings.", |
| 1240 | "flash.admin_delete_mismatch": "The confirmation does not match.", |
| 1241 | "flash.admin_user_delete_failed": "Could not delete the user.", |
| 1242 | "flash.admin_user_deleted": "User @%s and their repositories were deleted.", |
| 1243 | "flash.admin_repo_missing": "Repository not found.", |
| 1244 | "flash.admin_repo_delete_failed": "Could not delete the repository.", |
| 1245 | "flash.admin_repo_deleted": "Repository %s/%s deleted.", |
| 1246 | "flash.admin_registration_invalid": "Invalid registration mode."}, |
| 1247 | } |
| 1248 | |
| 1249 | func T(lang Lang, key string) string { |
| 1250 | dict, ok := translations[Normalize(string(lang))] |
| 1251 | if !ok { |
| 1252 | dict = translations[RU] |
| 1253 | } |
| 1254 | if val, ok := dict[key]; ok { |
| 1255 | return val |
| 1256 | } |
| 1257 | if val, ok := translations[RU][key]; ok { |
| 1258 | return val |
| 1259 | } |
| 1260 | return key |
| 1261 | } |
| 1262 |