perf: improve russian translations (#593) @Balya

This commit is contained in:
Alexander Balya 2023-01-06 11:12:29 +02:00 committed by GitHub
parent 719c5e9eba
commit 684690ac7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 133 additions and 93 deletions

1
.gitignore vendored
View file

@ -7,6 +7,7 @@ npm-debug.log*
# Editor directories and files # Editor directories and files
.idea .idea
.vscode .vscode
.history
*.suo *.suo
*.ntvs* *.ntvs*
*.njsproj *.njsproj

View file

@ -81,6 +81,12 @@
<li> <li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamI') }} {{ $t('modals.settings.pageDownloads.saveManagement.supportParamI') }}
</li> </li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamJ') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamK') }}
</li>
</ul> </ul>
</v-card-text> </v-card-text>
</v-card> </v-card>

View file

@ -44,6 +44,7 @@ const locale = {
feed: 'Feed', feed: 'Feed',
rule: 'Rule', rule: 'Rule',
then: 'Then', then: 'Then',
of: 'of',
/** Dashboard */ /** Dashboard */
dashboard: { dashboard: {
@ -102,7 +103,8 @@ const locale = {
altSpeed: 'Alt Speeds', altSpeed: 'Alt Speeds',
dark: 'Dark', dark: 'Dark',
light: 'Light' light: 'Light'
} },
torrentsCount: 'No torrents | {n} torrent | {n} torrents'
}, },
/** Modals */ /** Modals */
@ -222,7 +224,7 @@ const locale = {
autoEnabled_onFinished: 'Run external program on torrent finished:', autoEnabled_onFinished: 'Run external program on torrent finished:',
autoLabel_onFinished: 'Command', autoLabel_onFinished: 'Command',
supportParamTitle: 'Supported parameters (case sensitive):', supportParamTitle: 'Supported parameters (case sensitive):',
supportParamN: '%N: Torrent name ', supportParamN: '%N: Torrent name',
supportParamL: '%L: Category', supportParamL: '%L: Category',
supportParamG: '%G: Tags (separated by comma)', supportParamG: '%G: Tags (separated by comma)',
supportParamF: '%F: Content path (same as root path for multi-file torrent)', supportParamF: '%F: Content path (same as root path for multi-file torrent)',
@ -231,7 +233,9 @@ const locale = {
supportParamC: '%C: Number of files', supportParamC: '%C: Number of files',
supportParamZ: '%Z: Torrent size (bytes)', supportParamZ: '%Z: Torrent size (bytes)',
supportParamT: '%T: Current tracker', supportParamT: '%T: Current tracker',
supportParamI: '%I: Info hash' supportParamI: '%I: Info hash v1',
supportParamJ: '%J: Info hash v2',
supportParamK: '%K: Torrent ID'
} }
}, },
pageConnection: { pageConnection: {

View file

@ -16,27 +16,27 @@ const locale = {
unknown: 'Неизвестный', unknown: 'Неизвестный',
status: 'Статус', status: 'Статус',
all: 'Все', all: 'Все',
downloading: 'Скачивание', downloading: 'Загружаются',
seeding: 'Раздача', seeding: 'Раздаются',
completed: 'Завершено', completed: 'Завершены',
resumed: 'Возобновлено', resumed: 'Возобновлены',
paused: 'Приостановлено', paused: 'Остановлены',
active: 'Активный', active: 'Активны',
inactive: 'Неактивный', inactive: 'Неактивны',
stalled: 'Застопорился', stalled: 'Простаивают',
errored: 'Ошибочный', errored: 'Ошибка',
login: 'Войти', login: 'Войти',
logout: 'Выйти', logout: 'Выйти',
download: 'Скачивание', download: 'Загрузка',
downloaded: 'Скачано', downloaded: 'Загружено',
upload: 'Отдача', upload: 'Раздача',
uploaded: 'Загружено', uploaded: 'Роздано',
ETA: 'ETA', ETA: 'ETA',
peers: 'Пиры', peers: 'Пиры',
ratio: 'Ратио', ratio: 'Рейтинг',
seeds: 'Сиды', seeds: 'Сиды',
tags: 'Теги', tags: 'Метки',
// tracker: 'Tracker', tracker: 'Трекер',
share: 'Поделиться', share: 'Поделиться',
name: 'Имя', name: 'Имя',
hash: 'Хэш', hash: 'Хэш',
@ -44,15 +44,16 @@ const locale = {
feed: 'Канал', feed: 'Канал',
rule: 'Правило', rule: 'Правило',
// then: 'Then', // then: 'Then',
of: 'из',
/** Dashboard */ /** Dashboard */
dashboard: { dashboard: {
tooltips: { tooltips: {
// toggleSearch: 'Toggle Search Filter', toggleSearch: 'Переключить режим поиска',
// toggleSelect: 'Toggle Select Mode', toggleSelect: 'Переключить режим выбора',
// toggleSort: 'Sort Torrents', toggleSort: 'Отсортировать торренты',
// selectAll: 'Select All', selectAll: 'Выбрать все',
// selectAllCaption: 'Select / Release All (Ctrl + A)' selectAllCaption: 'Выбрать / снять все (Ctrl+A)'
} }
// emptyTorrentList: 'Nothing to see here!' // emptyTorrentList: 'Nothing to see here!'
}, },
@ -65,20 +66,21 @@ const locale = {
progress: 'Прогресс', progress: 'Прогресс',
directory: 'Каталог', directory: 'Каталог',
downloaded: 'Скачано', downloaded: 'Скачано',
uploaded: 'Загружено', uploaded: 'Роздано',
created: 'Создано', created: 'Создано',
comments: 'Комментарии', comments: 'Комментарии',
uploadedSession: 'Загружено за сессию' uploadedSession: 'Роздано за сессию'
// timeActive: 'Time Active', // timeActive: 'Time Active',
// seededFor: 'Seeded For', // seededFor: 'Seeded For',
// last_activity: 'Last Activity' // last_activity: 'Last Activity',
// completed_on: 'Completed On'
}, },
/** Navbar */ /** Navbar */
navbar: { navbar: {
currentSpeed: 'Текущая скорость', currentSpeed: 'Текущая скорость',
// alltimeTitle: 'All-Time Stats', alltimeTitle: 'Статистика за всё время',
// sessionTitle: 'Session Stats', sessionTitle: 'Статистика за сессию',
freeSpace: 'Свободное место', freeSpace: 'Свободно',
topActions: { topActions: {
addTorrent: 'Добавить торрент', addTorrent: 'Добавить торрент',
resumeSelected: 'Восстановить выбранные торренты', resumeSelected: 'Восстановить выбранные торренты',
@ -91,17 +93,18 @@ const locale = {
tooltip: 'С момента последнего перезапуска qBittorrent' tooltip: 'С момента последнего перезапуска qBittorrent'
}, },
filters: { filters: {
stalled_uploading: 'Остановка раздачи', stalled_uploading: 'Отдача стоит',
stalled_downloading: 'Остановка скачивания' stalled_downloading: 'Загрузка стоит',
// uncategorized: 'Uncategorized', uncategorized: 'Без категории',
// untagged: 'Untagged', untagged: 'Без метки',
// not_working: 'Not Working' // not_working: 'Not Working'
}, },
action: { action: {
altSpeed: 'Альтернативные скорости', altSpeed: 'Альтернативные скорости',
dark: 'Темный', dark: 'Тёмная тема',
light: 'Светлый' light: 'Светлая тема'
} },
torrentsCount: 'Нет торрентов | {n} торрент | {n} торрента | {n} торрентов'
}, },
/** Modals */ /** Modals */
@ -138,12 +141,12 @@ const locale = {
settings: { settings: {
tabName: { tabName: {
VueTorrent: 'vuetorrent', VueTorrent: 'vuetorrent',
downloads: 'Отдача', downloads: 'Загрузки',
connection: 'Соединение', connection: 'Соединение',
bittorrent: 'Bittorrent', bittorrent: 'Bittorrent',
rss: 'RSS', rss: 'RSS',
webUI: 'Веб-интерфейс', webUI: 'Веб-интерфейс',
tagsAndCategories: 'Теги и категории' tagsAndCategories: 'Метки и категории'
}, },
pageVueTorrent: { pageVueTorrent: {
tabName: { tabName: {
@ -151,43 +154,45 @@ const locale = {
dashboard: 'Панель' dashboard: 'Панель'
}, },
pageGeneral: { pageGeneral: {
tip: 'Эти настройки предназначены для пользовательского веб-интерфейса', tip: 'Общие настройки пользовательского веб-интерфейса',
currentSpeed: 'Отображать текущую скорость', currentSpeed: 'Показывать текущую скорость',
speedGraph: 'Отображать график скорости', speedGraph: 'Показывать график скорости',
sessionStats: 'Отображать статистику сессии', sessionStats: 'Показывать статистику сессии',
allTimeStats: 'Отображать всю статистику', allTimeStats: 'Показывать всю статистику',
freeSpace: 'Отображать свободное место', freeSpace: 'Показывать свободное место',
trackerFilter: 'Отображать фильтр трекеров', trackerFilter: 'Показывать фильтр трекеров',
rightDrawer: 'Панель справа', rightDrawer: 'Расположить боковую панель справа',
// topPagination: 'Top Pagination', topPagination: 'Расположить навигационную панель сверху',
language: 'Язык:', language: 'Язык:',
paginationSize: 'Размер страницы:', paginationSize: 'Количество торрентов на странице:',
vueTorrentTitle: 'Заголовок VueTorrent:', vueTorrentTitle: 'Заголовок VueTorrent:',
// dateFormat: 'Date Format', dateFormat: 'Формат даты',
// openSideBarOnStart: 'Open Side Bar on launch', openSideBarOnStart: 'Открывать боковую панель при запуске',
currentVersion: 'Текущая версия', currentVersion: 'Текущая версия',
qbittorrentVersion: 'Версия QBittorrent:' qbittorrentVersion: 'Версия QBittorrent:',
resetSettings: 'Сбросить настройки'
}, },
pageDashboard: { pageDashboard: {
busyTorrentTip: 'Свойства для отображения занятых торрентов', busyTorrentTip: 'Свойства для отображения активных торрентов',
completedTorrentTip: 'Свойства для отображения завершенных торрентов', completedTorrentTip: 'Свойства для отображения завершенных торрентов',
properties: { properties: {
// availability: 'Availability', availability: 'Доступность',
// category: 'Category', category: 'Категория',
// tags: 'Tags', tags: 'Метки',
// completed: 'Completed', // completed: 'Completed',
// completion_on: 'Completed On',
// downloaded: 'Downloaded', // downloaded: 'Downloaded',
// ETA: 'ETA', ETA: 'ETA',
// name: 'Name', name: 'Имя',
// default: 'Default', default: 'По-умолчанию',
// last_activity: 'Last Activity', last_activity: 'Последняя активность',
// peers: 'Peers', peers: 'Пиры',
// seeds: 'Seeds', seeds: 'Сиды',
// priority: 'Priority', priority: 'Приоритет',
// progress: 'Progress', progress: 'Прогресс',
// ratio: 'Ratio', ratio: 'Рейтинг',
// save_path: 'Directory', // save_path: 'Directory',
// size: 'Size', size: 'Размер',
// state: 'State', // state: 'State',
// uploaded: 'Uploaded', // uploaded: 'Uploaded',
// addedOn: 'Added On', // addedOn: 'Added On',
@ -198,37 +203,39 @@ const locale = {
} }
}, },
pageDownloads: { pageDownloads: {
subHeaderWhenAddTorrent: 'Когда добавляется торрент', subHeaderWhenAddTorrent: 'При добавлении торрента',
whenAddTorrent: { whenAddTorrent: {
createSubFolder: 'Создать подкаталог для торрентов с несколькими файлами', createSubFolder: 'Создать подкаталог для торрентов с несколькими файлами',
donotAutoStart: 'Не запускать раздачу автоматически' donotAutoStart: 'Не начинать загрузку автоматически'
}, },
subHeaderPublicSettings: 'Общие настройки', subHeaderPublicSettings: 'Общие настройки',
publicSettings: { publicSettings: {
preAllocateDisk: 'Предварительно выделить место на диске для всех файлов', preAllocateDisk: 'Резервировать место на диске для всех файлов',
appendQBExtension: 'Добавить расширение .!qB к неполным файлам' appendQBExtension: 'Добавлять расширение .!qB к незавершённым файлам'
}, },
subHeaderSaveManagement: 'Управление сохранением', subHeaderSaveManagement: 'Управление сохранением',
saveManagement: { saveManagement: {
autoManagement: 'Автоматическое управление торрентами', autoManagement: 'Автоматический режим управления торрентом по умолчанию',
relocate: 'Перемещение торрента при изменении категории', relocate: 'Переместить торрент при изменении категории',
defaultSavePath: 'Путь сохранения по умолчанию', defaultSavePath: 'Путь сохранения по умолчанию:',
keepIncompleteIn: 'Хранить не завершенные торренты в:', keepIncompleteIn: 'Хранить незавершённые торренты в:',
// autoEnabled_onAdded: 'Run external program on torrent added:', autoEnabled_onAdded: 'Запускать внешнюю программу по добавлении торрента:',
// autoLabel_onAdded: 'Command', autoLabel_onAdded: 'Команда',
autoEnabled_onFinished: 'Автозапуск включен:', autoEnabled_onFinished: 'Запускать внешнюю программу по завершении торрента:',
autoLabel_onFinished: 'Программа автозапуска', autoLabel_onFinished: 'Команда',
supportParamTitle: 'Поддерживаемые параметры (с учетом регистра):', supportParamTitle: 'Поддерживаемые параметры (с учетом регистра):',
supportParamN: '%N: Имя торрента', supportParamN: '%N: Имя торрента',
supportParamL: '%L: Категория', supportParamL: '%L: Категория',
supportParamG: '% G: Теги (разделенные запятой)', supportParamG: '%G: Метки (разделяются запятыми)',
supportParamF: '% F: Путь к содержимому (такой же как корневой путь для многофайлового торрента)', supportParamF: '%F: Папка содержимого (или корневая папка для торрентов с множеством файлов)',
supportParamR: '%R: Корневой путь (путь первого подкаталога торрента)', supportParamR: '%R: Корневая папка (главный путь для подкаталога торрента)',
supportParamD: '%D: Путь сохранения', supportParamD: '%D: Путь сохранения',
supportParamC: '%C: Количество файлов', supportParamC: '%C: Количество файлов',
supportParamZ: '%Z: Размер торрента (байты)', supportParamZ: '%Z: Размер торрента (в байтах)',
supportParamT: '%T: Текущий трекер', supportParamT: '%T: Текущий трекер',
supportParamI: '%I: Хэш информации' supportParamI: '%I: Инфо-хеш v1',
supportParamJ: '%J: Инфо-хеш v2',
supportParamK: '%K: ID торрента'
} }
}, },
pageConnection: { pageConnection: {
@ -331,8 +338,8 @@ const locale = {
tipOnNoPath: 'Нужный путь' tipOnNoPath: 'Нужный путь'
}, },
newTag: { newTag: {
createNewTag: 'Создать новый тег', createNewTag: 'Создать новую метку',
tagName: 'тег' tagName: 'метка'
}, },
detail: { detail: {
title: 'Детали', title: 'Детали',
@ -340,7 +347,7 @@ const locale = {
tabTitleTrackers: 'Трекеры', tabTitleTrackers: 'Трекеры',
tabTitlePeers: 'Пиры', tabTitlePeers: 'Пиры',
tabTitleContent: 'Файлы', tabTitleContent: 'Файлы',
tabTitleTagsCategories: 'Теги и категории', tabTitleTagsCategories: 'Метки и категории',
pageInfo: { pageInfo: {
pieceStates: 'Прогресс', pieceStates: 'Прогресс',
torrentTitle: 'Название', torrentTitle: 'Название',
@ -355,7 +362,7 @@ const locale = {
trackers: 'Трекеры', trackers: 'Трекеры',
createdBy: 'Создано', createdBy: 'Создано',
firstLastPiecePriority: 'Приоритет первой/последней части', firstLastPiecePriority: 'Приоритет первой/последней части',
sequentialDownload: 'Последовательное скачивание', sequentialDownload: 'Последовательная загрузка',
autoTMM: 'Авто TMM', autoTMM: 'Авто TMM',
shareRatioLimit: 'Лимит по рейтингу', shareRatioLimit: 'Лимит по рейтингу',
shareTimeLimit: 'Лимит времени раздачи (минуты)', shareTimeLimit: 'Лимит времени раздачи (минуты)',
@ -385,7 +392,7 @@ const locale = {
peers: 'Пиры', peers: 'Пиры',
seeds: 'Сиды', seeds: 'Сиды',
leeches: 'Личи', leeches: 'Личи',
downloaded: 'Скачано', downloaded: 'Загружено',
message: 'Сообщение' message: 'Сообщение'
} }
}, },
@ -415,6 +422,7 @@ const locale = {
availability: 'Доступность', availability: 'Доступность',
category: 'Категория', category: 'Категория',
completed: 'Завершено', completed: 'Завершено',
// completion_on: 'Completed On',
downloaded: 'Загружено', downloaded: 'Загружено',
ETA: 'ETA', ETA: 'ETA',
name: 'Имя', name: 'Имя',
@ -427,7 +435,7 @@ const locale = {
// save_path: 'Directory', // save_path: 'Directory',
size: 'Размер', size: 'Размер',
state: 'Состояние', state: 'Состояние',
uploaded: 'Отдано', uploaded: 'Роздано',
addedOn: 'Добавлено', addedOn: 'Добавлено',
downloadSpeed: 'Скорость загрузки', downloadSpeed: 'Скорость загрузки',
timeActive: 'Активен', timeActive: 'Активен',
@ -464,7 +472,7 @@ const locale = {
rename: 'Переименовать', rename: 'Переименовать',
forceRecheck: 'Принудительная проверка', forceRecheck: 'Принудительная проверка',
forceReannounce: 'Принудительно анонсировать', forceReannounce: 'Принудительно анонсировать',
sequentialDownload: 'Последовательное скачивание', sequentialDownload: 'Последовательная загрузка',
firstLastPriority: 'Первый/последний приоритет', firstLastPriority: 'Первый/последний приоритет',
automaticTorrentManagement: 'Автоматическое управление торрентами' automaticTorrentManagement: 'Автоматическое управление торрентами'
}, },

View file

@ -10,7 +10,26 @@ export const i18n = new VueI18n({
locale: 'en', // set locale locale: 'en', // set locale
fallbackLocale: 'en', fallbackLocale: 'en',
silentTranslationWarn: true, silentTranslationWarn: true,
messages messages,
pluralizationRules: {
'ru': function(choice, choicesLength) {
if (choice === 0) {
return 0;
}
const teen = choice > 10 && choice < 20;
const endsWithOne = choice % 10 === 1;
if (choicesLength < 4) {
return (!teen && endsWithOne) ? 1 : 2;
}
if (!teen && endsWithOne) {
return 1;
}
if (!teen && choice % 10 >= 2 && choice % 10 <= 4) {
return 2;
}
return (choicesLength < 4) ? 2 : 3;
}
}
}) })
export function setLanguage(lang: string) { export function setLanguage(lang: string) {

View file

@ -1,3 +1,5 @@
import { i18n } from '@/plugins/i18n'
export default { export default {
getAppVersion: state => () => state.version, getAppVersion: state => () => state.version,
containsTorrent: state => hash => state.selected_torrents.includes(hash), containsTorrent: state => hash => state.selected_torrents.includes(hash),
@ -18,10 +20,10 @@ export default {
getAuthenticated: state => () => state.authenticated, getAuthenticated: state => () => state.authenticated,
getTorrentCountString: state => () => { getTorrentCountString: state => () => {
if (state.selected_torrents && state.selected_torrents.length) { if (state.selected_torrents && state.selected_torrents.length) {
return `${state.selected_torrents.length} of ${state.filteredTorrentsCount} torrents` return `${state.selected_torrents.length} ${i18n.t('of')} ${i18n.tc('navbar.torrentsCount', state.filteredTorrentsCount)}`
} }
return `${state.filteredTorrentsCount} torrents` return i18n.tc('navbar.torrentsCount', state.filteredTorrentsCount)
}, },
getSearchPlugins: state => () => state.searchPlugins getSearchPlugins: state => () => state.searchPlugins
} }