feat(i18n): complete message parity across all 25 locales
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 37s
CI / tests-unit (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m50s
CI / tests-ui (push) Successful in 2m29s
CI / preflight (push) Skipped
CI / deploy (push) Failing after 1m37s
Gitea Actions Runner Test / test-job (push) Successful in 1s
CI / check (push) Successful in 37s
CI / tests-unit (push) Successful in 1m49s
CI / tests-integration (push) Successful in 1m50s
CI / tests-ui (push) Successful in 2m29s
CI / preflight (push) Skipped
CI / deploy (push) Failing after 1m37s
The admin.studio.nitroCleanup section (102 keys) only existed in en and nl, so 23 locales fell back to English for the entire Nitro Cleanup panel. The referrals and dailyRewards keys were missing from the same 23 locales, and en itself was missing 6 keys that nl had. Add the missing keys to every locale with translations, so all 25 locales now carry the same 6063 keys.
This commit is contained in:
1 parent
944527e078
commit
bc00ecf08c
24 files changed
+4483
-182
No files matched your search
+196
-7
@@ -818,7 +818,7 @@
|
||||
"rateLimit": "Too many attempts. Please wait before trying again."
|
||||
},
|
||||
"title": "Связанные аккаунты",
|
||||
"subtitle": "Привяжите аккаунт в соцсетях, чтобы войти в систему одним щелчком мыши",
|
||||
"subtitle": "Свяжите социальный аккаунт для входа одним нажатием",
|
||||
"login": {
|
||||
"title": "Sign in",
|
||||
"subtitle": "С возвращением! Войдите в систему, чтобы войти в отель.",
|
||||
@@ -880,7 +880,9 @@
|
||||
"hidePassword": "Hide",
|
||||
"accountDetails": "Account details",
|
||||
"credentials": "Credentials & security",
|
||||
"newestCitizens": "Newest citizens"
|
||||
"newestCitizens": "Newest citizens",
|
||||
"ageVerified": "Мне 18+ и я согласен с возрастным требованием.",
|
||||
"invitedBy": "Приглашён пользователем {username}"
|
||||
},
|
||||
"forgot": {
|
||||
"title": "Сбросить пароль",
|
||||
@@ -1046,7 +1048,9 @@
|
||||
"cmsErrors": "CMS errors",
|
||||
"themeBuilder": "Theme builder",
|
||||
"openSidebar": "Open menu",
|
||||
"closeSidebar": "Close menu"
|
||||
"closeSidebar": "Close menu",
|
||||
"referrals": "Рефералы",
|
||||
"dailyRewards": "Ежедневные награды"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Панель управления",
|
||||
@@ -4334,7 +4338,9 @@
|
||||
"importAudit": "Audit",
|
||||
"themeBuilder": "Theme Builder",
|
||||
"studio": "Studio",
|
||||
"cmsErrors": "CMS errors"
|
||||
"cmsErrors": "CMS errors",
|
||||
"referrals": "Рефералы",
|
||||
"dailyRewards": "Ежедневные награды"
|
||||
},
|
||||
"events": "Events",
|
||||
"eventsSubtitle": "Hotel events and event types",
|
||||
@@ -5841,6 +5847,64 @@
|
||||
"NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.",
|
||||
"Rename": "Rename"
|
||||
}
|
||||
},
|
||||
"referrals": {
|
||||
"title": "Рефералы",
|
||||
"subtitle": "Система приглашений",
|
||||
"referralsToday": "Рефералы сегодня",
|
||||
"referralsTotal": "Всего рефералов",
|
||||
"invitedTotal": "Приглашений насчитано",
|
||||
"claims": "Награды получены",
|
||||
"settings": "Настройки награды",
|
||||
"needed": "Необходимые рефералы",
|
||||
"rewardAmount": "Сумма награды",
|
||||
"rewardCurrency": "Валюта награды",
|
||||
"blockSameIp": "Отклонять рефералов с текущим IP пригласившего",
|
||||
"save": "Сохранить настройки",
|
||||
"saving": "Сохранение…",
|
||||
"saved": "Настройки рефералов сохранены.",
|
||||
"saveError": "Настройки рефералов не удалось сохранить.",
|
||||
"recent": "Недавние рефералы",
|
||||
"unavailable": "Данные о рефералах временно недоступны.",
|
||||
"empty": "Рефералов пока нет.",
|
||||
"inviter": "Пригласивший",
|
||||
"invitee": "Приглашённый пользователь",
|
||||
"ip": "IP",
|
||||
"date": "Дата"
|
||||
},
|
||||
"dailyRewards": {
|
||||
"title": "Ежедневные награды за вход",
|
||||
"subtitle": "Расписание ежедневных наград за вход",
|
||||
"enabled": "Статус функции",
|
||||
"yes": "Включено",
|
||||
"no": "Выключено",
|
||||
"scheduleDays": "Дни расписания",
|
||||
"claimsToday": "Получений сегодня",
|
||||
"claimsTotal": "Всего получений",
|
||||
"status": "Статус функции",
|
||||
"statusHint": "При выключении карта награды скрывается, а новые получения отклоняются.",
|
||||
"disable": "Выключить",
|
||||
"enable": "Включить",
|
||||
"schedule": "Расписание наград",
|
||||
"day": "День {day}",
|
||||
"reward": "Награда",
|
||||
"amount": "Сумма",
|
||||
"actions": "Действия",
|
||||
"addDay": "День",
|
||||
"add": "Добавить день",
|
||||
"save": "Сохранить",
|
||||
"saving": "Сохранение…",
|
||||
"saved": "Расписание наград сохранено.",
|
||||
"cancel": "Отмена",
|
||||
"edit": "Редактировать",
|
||||
"delete": "Удалить",
|
||||
"created": "День награды добавлен.",
|
||||
"updated": "День награды обновлён.",
|
||||
"deleted": "День награды удалён.",
|
||||
"saveError": "День награды не удалось сохранить.",
|
||||
"deleteError": "День награды не удалось удалить.",
|
||||
"confirmDeleteTitle": "Удалить день награды",
|
||||
"confirmDeleteBody": "Этот день награды больше не будет выдаваться. Прошлые получения остаются записанными."
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
@@ -6221,8 +6285,27 @@
|
||||
"empty": "You're all caught up. No actions waiting.",
|
||||
"unavailable": "Some actions could not be checked. Available actions are shown above.",
|
||||
"retry": "Try again",
|
||||
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again."
|
||||
}
|
||||
"rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.",
|
||||
"dailyReward": "Ваша ежедневная награда готова к получению"
|
||||
},
|
||||
"dailyClaimed": "Ежедневная награда получена — до завтра!",
|
||||
"dailyErrors": {
|
||||
"already_claimed": "Вы уже получили сегодняшнюю ежедневную награду.",
|
||||
"disabled": "Ежедневные награды сейчас выключены.",
|
||||
"bad_config": "Расписание ежедневных наград настроено неправильно. Свяжитесь с персоналом.",
|
||||
"ratelimit": "Слишком много попыток. Подождите немного и попробуйте снова.",
|
||||
"error": "Ежедневную награду не удалось получить. Попробуйте ещё раз."
|
||||
},
|
||||
"dailyRewardTitle": "Ежедневные награды",
|
||||
"dailyRewardHint": "Входите каждый день и получайте награду — серии растут до больших дней.",
|
||||
"dailyRewardDay": "День {day}",
|
||||
"dailyRewardStreak": "{count, plural, one {Серия: # день} few {Серия: # дня} many {Серия: # дней} other {Серия: # дня}}",
|
||||
"dailyRewardNextClaim": "Следующее получение: {amount} {currency}",
|
||||
"dailyRewardTomorrow": "Завтра: {amount} {currency}",
|
||||
"dailyRewardClaim": "Получить ежедневную награду",
|
||||
"dailyRewardClaimedToday": "Получено сегодня — возвращайтесь завтра за следующей наградой.",
|
||||
"dailyRewardDisabled": "Ежедневные награды сейчас выключены. Вы можете исследовать отель.",
|
||||
"dailyRewardUnavailable": "Расписание ежедневных наград не удалось загрузить. Попробуйте ещё раз."
|
||||
},
|
||||
"housekeeping": {
|
||||
"preview": {
|
||||
@@ -6473,7 +6556,9 @@
|
||||
"sprite": "· sprite",
|
||||
"Git": "Git:"
|
||||
}
|
||||
}
|
||||
},
|
||||
"connected": "Связано",
|
||||
"unavailable": "Недоступно"
|
||||
},
|
||||
"emails": {
|
||||
"verify": {
|
||||
@@ -6500,6 +6585,110 @@
|
||||
},
|
||||
"admin": {
|
||||
"studio": {
|
||||
"nitroCleanup": {
|
||||
"alreadyRunning": "Сканирование уже выполняется — подключено к нему.",
|
||||
"ageUnknown": "возраст неизвестен",
|
||||
"ageBelow": "< 1д",
|
||||
"scanButton": "Сканировать ресурсы мебели",
|
||||
"scanningAssets": "Сканирование ресурсов…",
|
||||
"cancelButton": "Отмена",
|
||||
"deleteSelected": "Удалить выбранные ({count})",
|
||||
"deleting": "Удаление…",
|
||||
"redownloadBroken": "Скачать повреждённые заново",
|
||||
"redownloading": "Повторное скачивание…",
|
||||
"autoClean": "Автоматически чистить старые поддельные",
|
||||
"cleaning": "Очистка…",
|
||||
"exportManifest": "Экспортировать манифест",
|
||||
"exporting": "Экспорт…",
|
||||
"phaseStems": "Загрузка стеблей мебели…",
|
||||
"phaseReaddir": "Чтение каталогов ресурсов…",
|
||||
"phaseValidate": "Проверка пакетов .nitro…",
|
||||
"phaseScanning": "Сканирование…",
|
||||
"scanProgressFiles": "{count} файлов",
|
||||
"repairProgress": "ok {ok}, не удалось {failed}",
|
||||
"attachedNotice": "Сканирование продолжается в фоне — результаты появятся по завершении.",
|
||||
"sessionCancelled": "Сканирование отменено.",
|
||||
"onlyOldLabel": "Показывать только файлы старше",
|
||||
"onlyOldAgeLabel": "Минимальный возраст в днях для отображения",
|
||||
"onlyOldToggle": "Скрыть недавние файлы",
|
||||
"daysLabel": "дней",
|
||||
"autoAgeLabel": "Минимальный возраст в днях для автоочистки",
|
||||
"loadingResult": "Загрузка результата сканирования…",
|
||||
"scannedStat": "файлов ресурсов просканировано",
|
||||
"cachedNotice": "(в кэше — каталоги не изменились)",
|
||||
"fakeStat": "Поддельные nitro (нет соответствующего элемента)",
|
||||
"brokenStat": "Повреждённые nitro (нечитаемые)",
|
||||
"groupEmpty": "Ничего не найдено",
|
||||
"selectedCount": "выбрано {count}",
|
||||
"copiesBadge": "{count} копий",
|
||||
"groupFakeLabel": "Поддельные nitro",
|
||||
"groupFakeDescription": "Эти файлы не соответствуют ни одному элементу в items_base — остатки удалённой или переименованной мебели.",
|
||||
"groupBrokenLabel": "Повреждённые nitro",
|
||||
"groupBrokenDescription": "Эти файлы принадлежат элементу, но не могут быть прочитаны как допустимый пакет Nitro.",
|
||||
"groupSwfLabel": "Осиротевшие SWF",
|
||||
"groupSwfDescription": "Файлы .swf, не соответствующие ни одному элементу в items_base.",
|
||||
"groupIconLabel": "Осиротевшие иконки",
|
||||
"groupIconDescription": "Файлы иконок, не соответствующие ни одному элементу в items_base.",
|
||||
"warningText": "Удаление повреждённого .nitro оставляет элемент в базе без пакета — лучше скачать его заново или позволить аудиту каталога получить его позже. Строки базы никогда не удаляются этим инструментом.",
|
||||
"onlyAssetsTouched": "Изменяются только файлы ресурсов — FurnitureData.json и строки базы остаются нетронутыми.",
|
||||
"emptyHint": "Просканируйте каждый каталог ресурсов мебели, чтобы найти поддельные и повреждённые пакеты nitro, а также осиротевшие SWF и иконки. Удалите их, скачайте повреждённые заново или автоматически очистите старые остатки.",
|
||||
"noResult": "Пока нет результата сканирования — сначала запустите сканирование ресурсов мебели.",
|
||||
"scanFailed": "Сканирование не удалось.",
|
||||
"confirmDeleteTitle": "Удалить {count} файл(ов) ресурсов?",
|
||||
"confirmDeleteDescription": "Файлы будут удалены из каждого каталога (public + зеркальные gamedata). Строки базы никогда не изменяются.",
|
||||
"confirmDeleteLabel": "Удалить",
|
||||
"confirmRepairTitle": "Скачать заново {count} повреждённый(ых) пакет(ов) .nitro?",
|
||||
"confirmRepairDescription": "Пакеты будут получены заново из настроенных источников nitro и записаны поверх каждого каталога (public + зеркальные gamedata).",
|
||||
"confirmRepairLabel": "Скачать заново",
|
||||
"confirmAutoCleanTitle": "Автоматически очистить поддельные nitro старше {days} дней?",
|
||||
"confirmAutoCleanDescription": "Удаляются только поддельные файлы .nitro (нет соответствующего элемента) старше порога. Повреждённые пакеты и недавние файлы никогда не изменяются.",
|
||||
"confirmAutoCleanLabel": "Автоочистка",
|
||||
"toastDeletePartial": "Удалено {copies} копий, но некоторые файлы не удалось удалить",
|
||||
"toastDeleteDone": "Удалено {copies} копий файлов ({deleted} файлов)",
|
||||
"toastRepairDone": "Отремонтировано {count} пакетов .nitro",
|
||||
"toastRepairFailed": "Не удалось получить ни одного пакета ({failed} не удалось)",
|
||||
"toastRepairCancelled": "Ремонт отменён",
|
||||
"toastAutoCleanDone": "Очищено {deleted} старых поддельных файлов .nitro ({copies} копий). Пропущено {recent} недавних + {broken} повреждённых.",
|
||||
"toastAutoCleanNothing": "Нечего достаточно старого для удаления (пропущено {recent} недавних, {broken} повреждённых)",
|
||||
"toastManifestDownload": "Манифест сканирования скачан",
|
||||
"gamedataTitle": "Очистка игровых данных",
|
||||
"gamedataHint": "Сначала предпросмотр: это перезаписывает FurnitureData.json, FigureMap.json и FigureData.json. В отличие от инструментов ресурсов выше, удаляет строки, которые ни на что не ссылаются — проверьте количество перед запуском.",
|
||||
"gamedataScan": "Предпросмотр игровых данных",
|
||||
"gamedataScanning": "Сканирование…",
|
||||
"gamedataRun": "Запустить выбранные",
|
||||
"gamedataRunning": "Очистка…",
|
||||
"gamedataNoResult": "Пока нет предпросмотра — сначала просканируйте файлы JSON игровых данных.",
|
||||
"gamedataCount_duplicates": "Дубликаты FurnitureData",
|
||||
"gamedataCount_orphans": "Осиротевшие FurnitureData",
|
||||
"gamedataCount_figureMap": "Проблемы FigureMap",
|
||||
"gamedataCount_figureData": "Неиспользуемый FigureData",
|
||||
"gamedataPass_dedupeFurnitureData": "Дедупликация FurnitureData",
|
||||
"gamedataPassDesc_dedupeFurnitureData": "Удаляет повторяющиеся classnames внутри одного раздела, сохраняя запись с наивысшей ревизией.",
|
||||
"gamedataPass_cleanFurnitureData": "Очистить FurnitureData",
|
||||
"gamedataPassDesc_cleanFurnitureData": "Удаляет записи, у которых пакет .nitro отсутствует в каждом каталоге.",
|
||||
"gamedataPass_cleanFigureMap": "Очистить FigureMap",
|
||||
"gamedataPassDesc_cleanFigureMap": "Удаляет части, указывающие на отсутствующий набор в FigureData, а также точные дубликаты.",
|
||||
"gamedataPass_cleanFigureData": "Очистить FigureData",
|
||||
"gamedataPassDesc_cleanFigureData": "Удаляет наборы, на которые не ссылается ни одна часть FigureMap, затем палитры, которые не использует ни один тип набора. Должно запускаться после Очистить FigureMap.",
|
||||
"gamedataNothingSelected": "Выберите хотя бы один шаг очистки",
|
||||
"gamedataConfirmTitle": "Перезаписать файлы JSON игровых данных?",
|
||||
"gamedataConfirmDescription": "{passes} шаг(ов) будут запущены против {duplicates} дублированных групп, {orphans} осиротевших строк, {figureMap} проблем FigureMap и {figureData} неиспользуемых записей FigureData. Строки удаляются без резервной копии — это нельзя отменить.",
|
||||
"gamedataConfirmLabel": "Перезаписать файлы",
|
||||
"gamedataDifferingWarning": "По крайней мере один дубликат не является точной копией сохраняемой записи, поэтому удалённая строка содержала данные, которых нет у выжившего.",
|
||||
"gamedataCrossSectionNote": "{count} classname(ов) существуют как в roomitemtypes, так и в wallitemtypes. Они только сообщаются — удаление одного изменит тип элемента.",
|
||||
"gamedataToastDone": "Очистка игровых данных удалила {removed} строк",
|
||||
"gamedataToastNothing": "Игровые данные уже были чистыми",
|
||||
"gamedataMaxRemovalsLabel": "Макс. строк на шаг",
|
||||
"gamedataMaxRemovalsHint": "0 использует значение по умолчанию 500. Шаг, который удалил бы больше, останавливается и спрашивает вместо записи.",
|
||||
"gamedataLimitTitle": "{pass} удалил бы {wouldRemove} строк, выше лимита {maxRemovals}.",
|
||||
"gamedataLimitDescription": "Этот шаг ничего не записал, поэтому файлы не изменены. Сначала проверьте пути к ресурсам — неправильный каталог делает каждую строку осиротевшей. Повышение лимита — отдельный, преднамеренный запуск.",
|
||||
"gamedataLimitOverride": "Всё равно удалить {wouldRemove} строк",
|
||||
"historyTitle": "История автоочистки",
|
||||
"historyScheduled": "по расписанию",
|
||||
"historyManual": "вручную",
|
||||
"historyEntry": "Удалено {deleted} ({copies} копий); пропущено {recent} недавних и {broken} повреждённых",
|
||||
"historyErrors": "{count} ошибок"
|
||||
},
|
||||
"importDiagnostics": {
|
||||
"attempts": "Диагностика файлов",
|
||||
"preliminary": "Предварительная проверка адресов; содержимое проверяется при импорте.",
|
||||
|
||||
Reference in new issue
Block a user