mirror of
https://github.com/YGGverse/YGGtracker.git
synced 2026-04-01 17:45:31 +00:00
Compare commits
No commits in common. "main" and "2.5.0" have entirely different histories.
28 changed files with 457 additions and 918 deletions
4
.env
4
.env
|
|
@ -48,7 +48,7 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
|
||||||
# YGGtracker
|
# YGGtracker
|
||||||
|
|
||||||
# Application version, used for API and media cache
|
# Application version, used for API and media cache
|
||||||
APP_VERSION=2.6.2
|
APP_VERSION='2.5.0'
|
||||||
|
|
||||||
# Application name
|
# Application name
|
||||||
APP_NAME=YGGtracker
|
APP_NAME=YGGtracker
|
||||||
|
|
@ -88,7 +88,7 @@ APP_POSTERS=1
|
||||||
APP_TRACKERS=http://[201:23b4:991a:634d:8359:4521:5576:15b7]:2023/announce|http://[200:1e2f:e608:eb3a:2bf:1e62:87ba:e2f7]/announce|http://[316:c51a:62a3:8b9::5]/announce
|
APP_TRACKERS=http://[201:23b4:991a:634d:8359:4521:5576:15b7]:2023/announce|http://[200:1e2f:e608:eb3a:2bf:1e62:87ba:e2f7]/announce|http://[316:c51a:62a3:8b9::5]/announce
|
||||||
|
|
||||||
# List of crawlers where ignored in actions and activity features
|
# List of crawlers where ignored in actions and activity features
|
||||||
APP_CRAWLERS=201:23b4:991a:634d:8359:4521:5576:15b7|30a:5fad::e|202:f2bc:f800:7cc4:c109:7857:5cae:6630|200:1554:e730:4030:605b:47be:6fb6:7b11
|
APP_CRAWLERS=201:23b4:991a:634d:8359:4521:5576:15b7|30a:5fad::e
|
||||||
|
|
||||||
# Max torrent filesize for uploads (check upload_max_filesize in the php.ini)
|
# Max torrent filesize for uploads (check upload_max_filesize in the php.ini)
|
||||||
APP_TORRENT_FILE_SIZE_MAX=1024000
|
APP_TORRENT_FILE_SIZE_MAX=1024000
|
||||||
|
|
|
||||||
25
README.md
25
README.md
|
|
@ -1,16 +1,22 @@
|
||||||
# YGGtracker
|
# YGGtracker
|
||||||
|
|
||||||
> [!NOTE]
|
[](https://crowdin.com/project/yggtracker)
|
||||||
> Take a look at [βtracker](https://github.com/yggverse/btracker) - the modern aggregation alternative written in Rust!
|
|
||||||
|
|
||||||
A social-oriented BitTorrent catalog for the [Yggdrasil](https://github.com/yggdrasil-network) network, written in the Symfony framework.
|
BitTorrent Network for Yggdrasil
|
||||||
|
|
||||||
YGGtracker is a manually operated catalog and social network that allows users to share their torrents in the local network. Engine uses IPv6 `0200::/7` addresses to identify users without registration.
|
YGGtracker is catalog, open tracker and social network with many features that allow to convert, filter and download any torrent in [Yggdrasil network](https://github.com/yggdrasil-network) by community.
|
||||||
|
|
||||||
|
Engine uses IPv6 `0200::/7` addresses to identify users without registration.
|
||||||
|
|
||||||
#### [Showcase](https://github.com/YGGverse/YGGtracker/wiki/Showcase)
|
#### [Showcase](https://github.com/YGGverse/YGGtracker/wiki/Showcase)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
#### Instances
|
||||||
|
|
||||||
|
* `http://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggtracker/`
|
||||||
|
+ `ftp://[201:23b4:991a:634d:8359:4521:5576:15b7]:21/yggtracker/`
|
||||||
|
|
||||||
#### Installation
|
#### Installation
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -64,7 +70,7 @@ Custom settings could be provided in the `/.env.local` file by overwriting defau
|
||||||
|
|
||||||
#### Localization
|
#### Localization
|
||||||
|
|
||||||
[](https://crowdin.com/project/yggtracker)
|
Join community translations by [Crowdin](https://crowdin.com/project/yggtracker)
|
||||||
|
|
||||||
#### API
|
#### API
|
||||||
|
|
||||||
|
|
@ -79,6 +85,15 @@ git checkout main
|
||||||
git checkout -b my-pr-branch-name
|
git checkout -b my-pr-branch-name
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Donate to contributors
|
||||||
|
|
||||||
|
* @d47081:
|
||||||
|
|
||||||
|
+ 
|
||||||
|
+ [BTC](https://www.blockchain.com/explorer/addresses/btc/bc1qngdf2kwty6djjqpk0ynkpq9wmlrmtm7e0c534y) | [LTC](https://live.blockcypher.com/ltc/address/LUSiqzKsfB1vBLvpu515DZktG9ioKqLyj7) | [XMR](835gSR1Uvka19gnWPkU2pyRozZugRZSPHDuFL6YajaAqjEtMwSPr4jafM8idRuBWo7AWD3pwFQSYRMRW9XezqrK4BEXBgXE) | [ZEPH](ZEPHsADHXqnhfWhXrRcXnyBQMucE3NM7Ng5ZVB99XwA38PTnbjLKpCwcQVgoie8EJuWozKgBiTmDFW4iY7fNEgSEWyAy4dotqtX)
|
||||||
|
+ Support our server by order [Linux VPS](https://www.yourserver.se/portal/aff.php?aff=610)
|
||||||
|
+ Inspiration by [SomaFM Deep Space One](https://somafm.com/deepspaceone/)
|
||||||
|
|
||||||
#### License
|
#### License
|
||||||
|
|
||||||
* Engine sources [MIT License](https://github.com/YGGverse/YGGtracker/blob/main/LICENSE)
|
* Engine sources [MIT License](https://github.com/YGGverse/YGGtracker/blob/main/LICENSE)
|
||||||
|
|
|
||||||
785
composer.lock
generated
785
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -9,156 +9,20 @@ use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
use App\Service\UserService;
|
use App\Service\UserService;
|
||||||
use App\Service\TorrentService;
|
|
||||||
use App\Service\ActivityService;
|
use App\Service\ActivityService;
|
||||||
|
|
||||||
class SearchController extends AbstractController
|
class SearchController extends AbstractController
|
||||||
{
|
{
|
||||||
public function module(
|
public function module(
|
||||||
Request $request,
|
?string $query,
|
||||||
UserService $userService,
|
?string $type
|
||||||
TorrentService $torrentService,
|
|
||||||
ActivityService $activityService
|
|
||||||
): Response
|
): Response
|
||||||
{
|
{
|
||||||
// Defaults
|
|
||||||
$locales = [];
|
|
||||||
$categories = [];
|
|
||||||
$sensitive = [];
|
|
||||||
|
|
||||||
// Request
|
|
||||||
$query = $request->get('query') ? urldecode($request->get('query')) : '';
|
|
||||||
$filter = $request->get('filter') ? true : false;
|
|
||||||
|
|
||||||
// Extended search
|
|
||||||
if ($filter)
|
|
||||||
{
|
|
||||||
// Init user
|
|
||||||
$user = $this->initUser(
|
|
||||||
$request,
|
|
||||||
$userService,
|
|
||||||
$activityService
|
|
||||||
);
|
|
||||||
|
|
||||||
// Keywords
|
|
||||||
$keywords = explode(' ', $query);
|
|
||||||
|
|
||||||
// Locales
|
|
||||||
foreach (explode('|', $this->getParameter('app.locales')) as $locale)
|
|
||||||
{
|
|
||||||
|
|
||||||
if ($request->get('locales'))
|
|
||||||
{
|
|
||||||
$checked = in_array($locale, (array) $request->get('locales'));
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$checked = in_array($locale, $user->getLocales());
|
|
||||||
}
|
|
||||||
|
|
||||||
$locales[] =
|
|
||||||
[
|
|
||||||
'value' => $locale,
|
|
||||||
'checked' => $checked,
|
|
||||||
'total' => $torrentService->findTorrentsTotal(
|
|
||||||
0,
|
|
||||||
$keywords,
|
|
||||||
[$locale],
|
|
||||||
$request->get('categories') ? $request->get('categories') : $user->getCategories(),
|
|
||||||
$request->get('sensitive') ? null : false,
|
|
||||||
!$user->isModerator() ? true : null,
|
|
||||||
!$user->isModerator() ? true : null,
|
|
||||||
)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Categories
|
|
||||||
foreach (explode('|', $this->getParameter('app.categories')) as $category)
|
|
||||||
{
|
|
||||||
if ($request->get('categories'))
|
|
||||||
{
|
|
||||||
$checked = in_array($category, (array) $request->get('categories'));
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$checked = in_array($category, $user->getCategories());
|
|
||||||
}
|
|
||||||
|
|
||||||
$categories[] =
|
|
||||||
[
|
|
||||||
'value' => $category,
|
|
||||||
'checked' => $checked,
|
|
||||||
'total' => $torrentService->findTorrentsTotal(
|
|
||||||
0,
|
|
||||||
$keywords,
|
|
||||||
$request->get('locales') ? $request->get('locales') : $user->getLocales(),
|
|
||||||
[$category],
|
|
||||||
$request->get('sensitive') ? null : false,
|
|
||||||
!$user->isModerator() ? true : null,
|
|
||||||
!$user->isModerator() ? true : null,
|
|
||||||
)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sensitive
|
|
||||||
$sensitive =
|
|
||||||
[
|
|
||||||
'checked' => $request->get('sensitive'),
|
|
||||||
'total' => $torrentService->findTorrentsTotal(
|
|
||||||
0,
|
|
||||||
$keywords,
|
|
||||||
$request->get('locales') ? $request->get('locales') : $user->getLocales(),
|
|
||||||
$request->get('categories') ? $request->get('categories') : $user->getCategories(),
|
|
||||||
true,
|
|
||||||
!$user->isModerator() ? true : null,
|
|
||||||
!$user->isModerator() ? true : null,
|
|
||||||
)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->render(
|
return $this->render(
|
||||||
'default/search/module.html.twig',
|
'default/search/module.html.twig',
|
||||||
[
|
[
|
||||||
'query' => $query,
|
'query' => $query ? urldecode($query) : '',
|
||||||
'filter' => $filter,
|
|
||||||
'sensitive' => $sensitive,
|
|
||||||
'locales' => $locales,
|
|
||||||
'categories' => $categories,
|
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function initUser(
|
|
||||||
Request $request,
|
|
||||||
UserService $userService,
|
|
||||||
ActivityService $activityService
|
|
||||||
): ?\App\Entity\User
|
|
||||||
{
|
|
||||||
// Init user
|
|
||||||
if (!$user = $userService->findUserByAddress($request->getClientIp()))
|
|
||||||
{
|
|
||||||
$user = $userService->addUser(
|
|
||||||
$request->getClientIp(),
|
|
||||||
time(),
|
|
||||||
$this->getParameter('app.locale'),
|
|
||||||
explode('|', $this->getParameter('app.locales')),
|
|
||||||
$activityService->getEventCodes(),
|
|
||||||
$this->getParameter('app.theme'),
|
|
||||||
$this->getParameter('app.sensitive'),
|
|
||||||
$this->getParameter('app.yggdrasil'),
|
|
||||||
$this->getParameter('app.posters'),
|
|
||||||
$this->getParameter('app.approved')
|
|
||||||
);
|
|
||||||
|
|
||||||
// Add user join event
|
|
||||||
$activityService->addEventUserAdd(
|
|
||||||
$user->getId(),
|
|
||||||
time()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $user;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -57,13 +57,10 @@ class TorrentController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sensitive filter
|
// Sensitive filter
|
||||||
// @TODO add blur effect or sensitive notice instead of 404 on direct request #37
|
if (!$user->isModerator() && $user->isSensitive())
|
||||||
/*
|
|
||||||
if (!$user->isModerator() && $user->isSensitive() && $torrent->isSensitive())
|
|
||||||
{
|
{
|
||||||
throw $this->createNotFoundException();
|
throw $this->createNotFoundException();
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
// Access filter
|
// Access filter
|
||||||
if (!$user->isModerator() && $user->getId() != $torrent->getUserId() &&
|
if (!$user->isModerator() && $user->getId() != $torrent->getUserId() &&
|
||||||
|
|
@ -207,9 +204,7 @@ class TorrentController extends AbstractController
|
||||||
'private' => $file->isPrivate(),
|
'private' => $file->isPrivate(),
|
||||||
'source' => $file->getSource(),
|
'source' => $file->getSource(),
|
||||||
'comment' => $file->getComment(),
|
'comment' => $file->getComment(),
|
||||||
'tree' => $file->getFileTree(
|
'tree' => $file->getFileTree(),
|
||||||
\Rhilip\Bencode\TorrentFile::FILETREE_SORT_NATURAL // #34 @TODO cyrillic
|
|
||||||
),
|
|
||||||
//'trackers' => $file->getAnnounceList(),
|
//'trackers' => $file->getAnnounceList(),
|
||||||
'hash' =>
|
'hash' =>
|
||||||
[
|
[
|
||||||
|
|
@ -265,22 +260,22 @@ class TorrentController extends AbstractController
|
||||||
|
|
||||||
// Get total torrents
|
// Get total torrents
|
||||||
$total = $torrentService->findTorrentsTotal(
|
$total = $torrentService->findTorrentsTotal(
|
||||||
$request->get('filter') ? 0 : $user->getId(),
|
$user->getId(),
|
||||||
$query,
|
$query,
|
||||||
$request->get('filter') ? (array) $request->get('locales') : $user->getLocales(),
|
$user->getLocales(),
|
||||||
$request->get('filter') ? (array) $request->get('categories') : $user->getCategories(),
|
$user->getCategories(),
|
||||||
$request->get('filter') ? ($request->get('sensitive') ? null : false) : ($user->isSensitive() ? false : null),
|
$user->isSensitive() ? false : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
);
|
);
|
||||||
|
|
||||||
$torrents = [];
|
$torrents = [];
|
||||||
foreach ($torrentService->findTorrents(
|
foreach ($torrentService->findTorrents(
|
||||||
$request->get('filter') ? 0 : $user->getId(),
|
$user->getId(),
|
||||||
$query,
|
$query,
|
||||||
$request->get('filter') ? (array) $request->get('locales') : $user->getLocales(),
|
$user->getLocales(),
|
||||||
$request->get('filter') ? (array) $request->get('categories') : $user->getCategories(),
|
$user->getCategories(),
|
||||||
$request->get('filter') ? ($request->get('sensitive') ? null : false) : ($user->isSensitive() ? false : null),
|
$user->isSensitive() ? false : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
$this->getParameter('app.pagination'),
|
$this->getParameter('app.pagination'),
|
||||||
|
|
@ -632,11 +627,11 @@ class TorrentController extends AbstractController
|
||||||
|
|
||||||
// Get total torrents
|
// Get total torrents
|
||||||
$total = $torrentService->findTorrentsTotal(
|
$total = $torrentService->findTorrentsTotal(
|
||||||
$request->get('filter') ? 0 : $user->getId(),
|
$user->getId(),
|
||||||
$query,
|
$query,
|
||||||
$request->get('filter') ? (array) $request->get('locales') : $user->getLocales(),
|
$user->getLocales(),
|
||||||
$request->get('filter') ? (array) $request->get('categories') : $user->getCategories(),
|
$user->getCategories(),
|
||||||
$request->get('filter') ? ($request->get('sensitive') ? null : false) : ($user->isSensitive() ? false : null),
|
$user->isSensitive() ? false : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
);
|
);
|
||||||
|
|
@ -644,11 +639,11 @@ class TorrentController extends AbstractController
|
||||||
// Create torrents list
|
// Create torrents list
|
||||||
$torrents = [];
|
$torrents = [];
|
||||||
foreach ($torrentService->findTorrents(
|
foreach ($torrentService->findTorrents(
|
||||||
$request->get('filter') ? 0 : $user->getId(),
|
$user->getId(),
|
||||||
$query,
|
$query,
|
||||||
$request->get('filter') ? (array) $request->get('locales') : $user->getLocales(),
|
$user->getLocales(),
|
||||||
$request->get('filter') ? (array) $request->get('categories') : $user->getCategories(),
|
$user->getCategories(),
|
||||||
$request->get('filter') ? ($request->get('sensitive') ? null : false) : ($user->isSensitive() ? false : null),
|
$user->isSensitive() ? false : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
!$user->isModerator() ? true : null,
|
!$user->isModerator() ? true : null,
|
||||||
$this->getParameter('app.pagination'),
|
$this->getParameter('app.pagination'),
|
||||||
|
|
|
||||||
|
|
@ -323,11 +323,6 @@ class TorrentService
|
||||||
{
|
{
|
||||||
$contributors = [];
|
$contributors = [];
|
||||||
|
|
||||||
foreach ($this->findTorrentCategoriesByTorrentId($torrent->getId()) as $torrentCategory)
|
|
||||||
{
|
|
||||||
$contributors[] = $torrentCategory->getUserId();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($this->findTorrentLocalesByTorrentId($torrent->getId()) as $torrentLocale)
|
foreach ($this->findTorrentLocalesByTorrentId($torrent->getId()) as $torrentLocale)
|
||||||
{
|
{
|
||||||
$contributors[] = $torrentLocale->getUserId();
|
$contributors[] = $torrentLocale->getUserId();
|
||||||
|
|
@ -338,11 +333,6 @@ class TorrentService
|
||||||
$contributors[] = $torrentSensitive->getUserId();
|
$contributors[] = $torrentSensitive->getUserId();
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->findTorrentPosterByTorrentId($torrent->getId()) as $torrentPoster)
|
|
||||||
{
|
|
||||||
$contributors[] = $torrentPoster->getUserId();
|
|
||||||
}
|
|
||||||
|
|
||||||
$contributors[] = $torrent->getUserId();
|
$contributors[] = $torrent->getUserId();
|
||||||
|
|
||||||
return array_unique($contributors);
|
return array_unique($contributors);
|
||||||
|
|
|
||||||
|
|
@ -154,7 +154,7 @@ class AppExtension extends AbstractExtension
|
||||||
): string
|
): string
|
||||||
{
|
{
|
||||||
return preg_replace(
|
return preg_replace(
|
||||||
'~(https?://(?:www\.)?[^\(\s\)]+)~i',
|
'~(https?://(?:www\.)?[^\s]+)~i',
|
||||||
'[$1]($1)',
|
'[$1]($1)',
|
||||||
$text
|
$text
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -16,19 +16,18 @@
|
||||||
<header>
|
<header>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row margin-y-16-px text-center">
|
<div class="row margin-y-16-px text-center">
|
||||||
<a class="logo display-inline-block{#32 margin-b-8-px #}" href="{{ path('torrent_recent') }}">
|
<a class="logo display-inline-block margin-b-8-px" href="{{ path('torrent_recent') }}">
|
||||||
<span>YGG</span>tracker
|
<span>YGG</span>tracker
|
||||||
</a>
|
</a>
|
||||||
{#32
|
|
||||||
<div class="font-size-10-px text-center text-color-night">
|
<div class="font-size-10-px text-center text-color-night">
|
||||||
{{ '<a href="%s">Upload</a> any torrent - download with Yggdrasil' | trans | format(path('torrent_submit')) | raw }}
|
{{ '<a href="%s">Upload</a> any torrent - download with Yggdrasil' | trans | format(path('torrent_submit')) | raw }}
|
||||||
</div>
|
</div>
|
||||||
#}
|
|
||||||
{% block header_search %}
|
{% block header_search %}
|
||||||
{{ render(controller(
|
{{ render(controller(
|
||||||
'App\\Controller\\SearchController::module',
|
'App\\Controller\\SearchController::module',
|
||||||
{
|
{
|
||||||
request: app.request
|
query : app.request.get('query'),
|
||||||
|
type : app.request.get('type')
|
||||||
}
|
}
|
||||||
)) }}
|
)) }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
||||||
|
|
@ -1,69 +1,4 @@
|
||||||
<form class="margin-t-16-px" name="search" method="get" action="{{ path('torrent_search') }}">
|
<form class="margin-t-16-px" name="search" method="get" action="{{ path('torrent_search') }}">
|
||||||
<input class="min-width-200-px" type="text" name="query" value="{{ query }}" placeholder="{{ 'Keyword, file, hash...' | trans }}" />
|
<input class="min-width-200-px" type="text" name="query" value="{{ query }}" placeholder="{{ 'Keyword, file, hash...' | trans }}" />
|
||||||
<input {% if query %}class="button-green"{% endif %} type="submit" value="{{ 'Search' | trans }}" />
|
<input {% if query %}class="button-green"{% endif %} type="submit" value="{{ 'Search' | trans }}" />
|
||||||
{% if filter %}
|
|
||||||
<input type="hidden" name="filter" value="true" />
|
|
||||||
<div class="text-left">
|
|
||||||
<div class="margin-t-16-px margin-b-4-px padding-x-4-px text-right">
|
|
||||||
{{ 'Locales' | trans }}
|
|
||||||
</div>
|
|
||||||
<div class="padding-t-16-px padding-b-8-px padding-x-24-px border-top-default">
|
|
||||||
{% for locale in locales | sort %}
|
|
||||||
{#{% if locale.total %}#}
|
|
||||||
<div class="margin-t-4-px margin-b-8-px margin-r-8-px display-inline-block min-width-120-px">
|
|
||||||
{% if locale.checked %}
|
|
||||||
<input name="locales[]" id="{{ locale.value }}" type="checkbox" value="{{ locale.value }}" checked="checked" />
|
|
||||||
{% else %}
|
|
||||||
<input name="locales[]" id="{{ locale.value }}" type="checkbox" value="{{ locale.value }}" />
|
|
||||||
{% endif %}
|
|
||||||
<label class="margin-x-4-px" for="{{ locale.value }}">
|
|
||||||
{{ locale.value | locale_name(locale.value) | u.title }}
|
|
||||||
<span class="text-color-night">
|
|
||||||
({{ locale.total }})
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
{#{% endif %}#}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
<div class="margin-b-4-px padding-x-4-px text-right">
|
|
||||||
{{ 'Categories' | trans }}
|
|
||||||
</div>
|
|
||||||
<div class="padding-t-16-px padding-b-8-px padding-x-24-px border-top-default">
|
|
||||||
{% for category in categories | sort %}
|
|
||||||
{#{% if category.total %}#}
|
|
||||||
<div class="margin-t-4-px margin-b-8-px margin-r-8-px display-inline-block min-width-120-px">
|
|
||||||
{% if category.checked %}
|
|
||||||
<input name="categories[]" id="{{ category.value }}" type="checkbox" value="{{ category.value }}" checked="checked" />
|
|
||||||
{% else %}
|
|
||||||
<input name="categories[]" id="{{ category.value }}" type="checkbox" value="{{ category.value }}" />
|
|
||||||
{% endif %}
|
|
||||||
<label class="margin-x-4-px" for="{{ category.value }}">
|
|
||||||
{{ category.value | trans_category | u.title }}
|
|
||||||
<span class="text-color-night">
|
|
||||||
({{ category.total }})
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
{#{% endif %}#}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
<div class="margin-b-4-px padding-x-4-px text-right">
|
|
||||||
{{ 'other' | trans | u.title }}
|
|
||||||
</div>
|
|
||||||
<div class="padding-t-16-px padding-b-8-px padding-x-24-px border-top-default">
|
|
||||||
{% if sensitive.checked %}
|
|
||||||
<input name="sensitive" id="sensitive" type="checkbox" value="true" checked="checked" />
|
|
||||||
{% else %}
|
|
||||||
<input name="sensitive" id="sensitive" type="checkbox" value="true" />
|
|
||||||
{% endif %}
|
|
||||||
<label class="margin-x-4-px" for="sensitive">
|
|
||||||
{{ 'Sensitive' | trans }}
|
|
||||||
<span class="text-color-night">
|
|
||||||
({{ sensitive.total }})
|
|
||||||
</span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</form>
|
</form>
|
||||||
|
|
@ -96,14 +96,14 @@
|
||||||
<td class="padding-t-16-px">
|
<td class="padding-t-16-px">
|
||||||
{% if torrent.status %}
|
{% if torrent.status %}
|
||||||
{{ 'Yes' | trans }}
|
{{ 'Yes' | trans }}
|
||||||
<a rel="nofollow" class="float-right" href="{{ path('torrent_status_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
<a class="float-right" href="{{ path('torrent_status_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M5 3a5 5 0 0 0 0 10h6a5 5 0 0 0 0-10H5zm6 9a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"/>
|
<path d="M5 3a5 5 0 0 0 0 10h6a5 5 0 0 0 0-10H5zm6 9a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ 'No' | trans }}
|
{{ 'No' | trans }}
|
||||||
<a rel="nofollow" class="float-right text-color-red" href="{{ path('torrent_status_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
<a class="float-right text-color-red" href="{{ path('torrent_status_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M11 4a4 4 0 0 1 0 8H8a4.992 4.992 0 0 0 2-4 4.992 4.992 0 0 0-2-4h3zm-6 8a4 4 0 1 1 0-8 4 4 0 0 1 0 8zM0 8a5 5 0 0 0 5 5h6a5 5 0 0 0 0-10H5a5 5 0 0 0-5 5z"/>
|
<path d="M11 4a4 4 0 0 1 0 8H8a4.992 4.992 0 0 0 2-4 4.992 4.992 0 0 0-2-4h3zm-6 8a4 4 0 1 1 0-8 4 4 0 0 1 0 8zM0 8a5 5 0 0 0 5 5h6a5 5 0 0 0 0-10H5a5 5 0 0 0-5 5z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -119,14 +119,14 @@
|
||||||
<td>
|
<td>
|
||||||
{% if torrent.approved %}
|
{% if torrent.approved %}
|
||||||
{{ 'Yes' | trans }}
|
{{ 'Yes' | trans }}
|
||||||
<a rel="nofollow" class="float-right" href="{{ path('torrent_approve_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
<a class="float-right" href="{{ path('torrent_approve_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M5 3a5 5 0 0 0 0 10h6a5 5 0 0 0 0-10H5zm6 9a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"/>
|
<path d="M5 3a5 5 0 0 0 0 10h6a5 5 0 0 0 0-10H5zm6 9a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ 'No' | trans }}
|
{{ 'No' | trans }}
|
||||||
<a rel="nofollow" class="float-right text-color-red" href="{{ path('torrent_approve_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
<a class="float-right text-color-red" href="{{ path('torrent_approve_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M11 4a4 4 0 0 1 0 8H8a4.992 4.992 0 0 0 2-4 4.992 4.992 0 0 0-2-4h3zm-6 8a4 4 0 1 1 0-8 4 4 0 0 1 0 8zM0 8a5 5 0 0 0 5 5h6a5 5 0 0 0 0-10H5a5 5 0 0 0-5 5z"/>
|
<path d="M11 4a4 4 0 0 1 0 8H8a4.992 4.992 0 0 0 2-4 4.992 4.992 0 0 0-2-4h3zm-6 8a4 4 0 1 1 0-8 4 4 0 0 1 0 8zM0 8a5 5 0 0 0 5 5h6a5 5 0 0 0 0-10H5a5 5 0 0 0-5 5z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -220,26 +220,13 @@
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
{{ 'Private' | trans }}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{% if file.private %}
|
|
||||||
{{ 'Yes' | trans }}
|
|
||||||
{% else %}
|
|
||||||
{{ 'No' | trans }}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% if file.source %}
|
{% if file.source %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
{{ 'Source' | trans }}
|
{{ 'Source' | trans }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{# strip all tags then apply whitelist markdown filters to prevent ping from remote #}
|
{{ file.source | url_to_markdown | markdown_to_html }}
|
||||||
{{ file.source | trim | striptags | url_to_markdown | markdown_to_html | nl2br }}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
@ -249,8 +236,7 @@
|
||||||
{{ 'Software' | trans }}
|
{{ 'Software' | trans }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{# strip all tags then apply whitelist markdown filters to prevent ping from remote #}
|
{{ file.software }}
|
||||||
{{ file.software | trim | striptags | url_to_markdown | markdown_to_html | nl2br }}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
@ -260,8 +246,7 @@
|
||||||
{{ 'Comment' | trans }}
|
{{ 'Comment' | trans }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{# strip all tags then apply whitelist markdown filters to prevent ping from remote #}
|
{{ file.comment | url_to_markdown | markdown_to_html }}
|
||||||
{{ file.comment | trim | striptags | url_to_markdown | markdown_to_html | nl2br }}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
@ -349,7 +334,7 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_locales_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
|
<a class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_locales_edit', { torrentId : torrent.id }) }}" title="{{'Edit'|trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -366,7 +351,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_categories_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
|
<a class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_categories_edit', { torrentId : torrent.id }) }}" title="{{'Edit'|trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -383,7 +368,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_sensitive_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
|
<a class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_sensitive_edit', { torrentId : torrent.id }) }}" title="{{'Edit'|trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
@ -399,7 +384,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-right">
|
<div class="text-right">
|
||||||
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_poster_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
|
<a class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_poster_edit', { torrentId : torrent.id }) }}" title="{{'Edit'|trans }}">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
|
||||||
|
|
@ -5,33 +5,11 @@
|
||||||
{% if query %}
|
{% if query %}
|
||||||
<h2>{{ 'Search results' | trans }}</h2>
|
<h2>{{ 'Search results' | trans }}</h2>
|
||||||
<sub>
|
<sub>
|
||||||
{% if app.request.get('filter') %}
|
|
||||||
<a class="margin-l-4-px" rel="nofollow" href="{{ path('torrent_search', { query : query | url_encode(true) }) }}" title="{{ 'Hide filter' | trans }}">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-filter-square-fill" viewBox="0 0 16 16">
|
|
||||||
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm.5 5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1 0-1zM4 8.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm2 3a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5z"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
<a class="text-color-night margin-x-4-px" href="{{ path('rss_torrents_recent', { query : query | url_encode(true),
|
|
||||||
locales : app.request.get('locales'),
|
|
||||||
categories : app.request.get('categories'),
|
|
||||||
sensitive : app.request.get('sensitive'),
|
|
||||||
filter : app.request.get('filter') }) }}" title="RSS">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
|
||||||
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm1.5 2.5c5.523 0 10 4.477 10 10a1 1 0 1 1-2 0 8 8 0 0 0-8-8 1 1 0 0 1 0-2zm0 4a6 6 0 0 1 6 6 1 1 0 1 1-2 0 4 4 0 0 0-4-4 1 1 0 0 1 0-2zm.5 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
{% else %}
|
|
||||||
<a class="text-color-night margin-l-4-px" rel="nofollow" href="{{ path('torrent_search', { query : query | url_encode(true), filter : 'true' }) }}" title="{{ 'Show filter' | trans }}">
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-filter-square-fill" viewBox="0 0 16 16">
|
|
||||||
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm.5 5h11a.5.5 0 0 1 0 1h-11a.5.5 0 0 1 0-1zM4 8.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5zm2 3a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5z"/>
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
<a class="text-color-night margin-x-4-px" href="{{ path('rss_torrents_recent', { query : query | url_encode(true) }) }}" title="RSS">
|
<a class="text-color-night margin-x-4-px" href="{{ path('rss_torrents_recent', { query : query | url_encode(true) }) }}" title="RSS">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
|
||||||
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm1.5 2.5c5.523 0 10 4.477 10 10a1 1 0 1 1-2 0 8 8 0 0 0-8-8 1 1 0 0 1 0-2zm0 4a6 6 0 0 1 6 6 1 1 0 1 1-2 0 4 4 0 0 0-4-4 1 1 0 0 1 0-2zm.5 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/>
|
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm1.5 2.5c5.523 0 10 4.477 10 10a1 1 0 1 1-2 0 8 8 0 0 0-8-8 1 1 0 0 1 0-2zm0 4a6 6 0 0 1 6 6 1 1 0 1 1-2 0 4 4 0 0 0-4-4 1 1 0 0 1 0-2zm.5 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
|
||||||
</sub>
|
</sub>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h2>{{ 'Recent uploads' | trans }}</h2>
|
<h2>{{ 'Recent uploads' | trans }}</h2>
|
||||||
|
|
@ -58,8 +36,7 @@
|
||||||
{% if torrent.scrape.leechers > 0 and torrent.scrape.seeders == 0 %}
|
{% if torrent.scrape.leechers > 0 and torrent.scrape.seeders == 0 %}
|
||||||
<a href="{{ path('torrent_file_wanted', { torrentId : torrent.id }) }}"
|
<a href="{{ path('torrent_file_wanted', { torrentId : torrent.id }) }}"
|
||||||
class="label label-green font-size-10-px position-relative display-inline-block"
|
class="label label-green font-size-10-px position-relative display-inline-block"
|
||||||
title="{{ 'Active leechers waiting for seeders' | trans }}"
|
title="{{ 'Active leechers waiting for seeders' | trans }}">
|
||||||
rel="nofollow">
|
|
||||||
{{ 'wanted' | trans }}
|
{{ 'wanted' | trans }}
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
@ -103,11 +80,7 @@
|
||||||
{% if torrent.keywords %}
|
{% if torrent.keywords %}
|
||||||
<div class="margin-b-16-px">
|
<div class="margin-b-16-px">
|
||||||
{% for keyword, quantity in torrent.keywords %}
|
{% for keyword, quantity in torrent.keywords %}
|
||||||
<a href="{{ path('torrent_search', { query : keyword | url_encode(true),
|
<a href="{{ path('torrent_search', { query : keyword | url_encode(true) }) }}">
|
||||||
locales : app.request.get('locales'),
|
|
||||||
categories : app.request.get('categories'),
|
|
||||||
sensitive : app.request.get('sensitive'),
|
|
||||||
filter : app.request.get('filter') }) }}">
|
|
||||||
#{{ keyword }}
|
#{{ keyword }}
|
||||||
</a>
|
</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -196,31 +169,17 @@
|
||||||
{% if query %}
|
{% if query %}
|
||||||
{% if pagination.page > 1 %}
|
{% if pagination.page > 1 %}
|
||||||
{% if pagination.page == 2 %}
|
{% if pagination.page == 2 %}
|
||||||
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_search', { query : query | url_encode(true),
|
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_search', { query : query | url_encode(true) | raw }) }}">
|
||||||
locales : app.request.get('locales'),
|
|
||||||
categories : app.request.get('categories'),
|
|
||||||
sensitive : app.request.get('sensitive'),
|
|
||||||
filter : app.request.get('filter') }) }}">
|
|
||||||
{{ 'Back' | trans | lower }}
|
{{ 'Back' | trans | lower }}
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_search', { query : query | url_encode(true),
|
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_search', { query : query | url_encode(true), page : pagination.page - 1 }) }}">
|
||||||
page : pagination.page - 1,
|
|
||||||
locales : app.request.get('locales'),
|
|
||||||
categories : app.request.get('categories'),
|
|
||||||
sensitive : app.request.get('sensitive'),
|
|
||||||
filter : app.request.get('filter') }) }}">
|
|
||||||
{{ 'Back' | trans | lower }}
|
{{ 'Back' | trans | lower }}
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if pagination.page < pagination.pages %}
|
{% if pagination.page < pagination.pages %}
|
||||||
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_search', { query : query | url_encode(true),
|
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_search', { query : query | url_encode(true), page : pagination.page + 1 }) }}">
|
||||||
page : pagination.page + 1,
|
|
||||||
locales : app.request.get('locales'),
|
|
||||||
categories : app.request.get('categories'),
|
|
||||||
sensitive : app.request.get('sensitive'),
|
|
||||||
filter : app.request.get('filter') }) }}">
|
|
||||||
{{ 'Next' | trans | lower }}
|
{{ 'Next' | trans | lower }}
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
||||||
|
|
@ -87,9 +87,9 @@
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="padding-t-16-px padding-b-8-px">
|
<td class="padding-t-16-px padding-b-8-px">
|
||||||
{% for locale in locales | sort %}
|
{% for locale in locales %}
|
||||||
<div class="margin-t-4-px margin-b-8-px margin-r-8-px display-inline-block min-width-120-px">
|
<div class="margin-t-4-px margin-b-8-px margin-r-8-px display-inline-block min-width-120-px">
|
||||||
{% if locale in user.locales %}
|
{% if locale in user.locales | sort %}
|
||||||
<input name="locales[]" id="{{ locale }}" type="checkbox" value="{{ locale }}" checked="checked" />
|
<input name="locales[]" id="{{ locale }}" type="checkbox" value="{{ locale }}" checked="checked" />
|
||||||
{% else %}
|
{% else %}
|
||||||
<input name="locales[]" id="{{ locale }}" type="checkbox" value="{{ locale }}" />
|
<input name="locales[]" id="{{ locale }}" type="checkbox" value="{{ locale }}" />
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>other</target>
|
<target>other</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Hide filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Show filter</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Private</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>другое</target>
|
<target>другое</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Скрыть фильтр</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Показать фильтр</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Приватный</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
|
|
@ -901,18 +901,6 @@
|
||||||
<source>other</source>
|
<source>other</source>
|
||||||
<target>інше</target>
|
<target>інше</target>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="v7fLnQX" resname="Hide filter">
|
|
||||||
<source>Hide filter</source>
|
|
||||||
<target>Приховати фільтр</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="45aF7iu" resname="Show filter">
|
|
||||||
<source>Show filter</source>
|
|
||||||
<target>Показати фільтр</target>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="xj62cgx" resname="Private">
|
|
||||||
<source>Private</source>
|
|
||||||
<target>Приватний</target>
|
|
||||||
</trans-unit>
|
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
</xliff>
|
</xliff>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue