fix: language filter

This commit is contained in:
2025-04-30 21:39:41 -05:00
parent 8970ca0f8f
commit f10168a1a7
7 changed files with 180 additions and 14 deletions

View File

@@ -54,7 +54,6 @@ export default class extends Controller {
} }
addLanguages(option, props) { addLanguages(option, props) {
console.log('herey');
const languages = Object.assign([], JSON.parse(props['languages'])); const languages = Object.assign([], JSON.parse(props['languages']));
languages.forEach((language) => { languages.forEach((language) => {
if (!this.languages.includes(language)) { if (!this.languages.includes(language)) {
@@ -62,9 +61,22 @@ export default class extends Controller {
} }
}); });
this.languageTarget.innerHTML = '<option value="">n/a</option>'; const preferred = this.languageTarget.dataset.preferred;
if (preferred) {
this.languageTarget.innerHTML = '<option value="'+preferred+'" selected>'+preferred+'</option>';
this.languageTarget.innerHTML += '<option value="">n/a</option>';
} else {
this.languageTarget.innerHTML = '<option value="">n/a</option>';
}
this.languageTarget.innerHTML += this.languages.sort() this.languageTarget.innerHTML += this.languages.sort()
.map((language) => '<option value="'+language+'">'+language+'</option>') .map((language) => {
const preferred = this.languageTarget.dataset.preferred;
if (preferred === language) {
return '<option value="'+preferred+'" selected>'+preferred+'</option>';
}
return '<option value="'+language+'">'+language+'</option>';
})
.join(); .join();
} }

View File

@@ -3,6 +3,7 @@
namespace App\Torrentio\Result; namespace App\Torrentio\Result;
use App\Util\CountryCodes; use App\Util\CountryCodes;
use App\Util\CountryLanguages;
use Nihilarr\PTN; use Nihilarr\PTN;
class ResultFactory class ResultFactory
@@ -89,13 +90,14 @@ class ResultFactory
}); });
$languages = array_map(function ($flag) { $languages = array_map(function ($flag) {
return CountryCodes::convertFromAbbr(strtoupper(substr($flag['short_name'], strlen('flag-')))); return CountryLanguages::fromCountryCode(strtoupper(substr($flag['short_name'], strlen('flag-'))));
}, },
$flags); $flags);
if (count($languages) > 0) { if (count($languages) > 0) {
return array_values($languages); return array_values($languages);
} else { } else {
return ["English"]; return ["English (US)"];
} }
} }

View File

@@ -11,6 +11,7 @@ use App\User\Framework\Entity\User;
use App\User\Framework\Entity\UserPreference; use App\User\Framework\Entity\UserPreference;
use App\User\Framework\Repository\PreferencesRepository; use App\User\Framework\Repository\PreferencesRepository;
use App\Util\CountryCodes; use App\Util\CountryCodes;
use App\Util\CountryLanguages;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Bundle\SecurityBundle\Security; use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@@ -36,11 +37,14 @@ class PreferencesController extends AbstractController
$userPreferences = Map::from($userPreferences) $userPreferences = Map::from($userPreferences)
->rekey(fn($preference) => $preference->getPreference()->getId()); ->rekey(fn($preference) => $preference->getPreference()->getId());
$languages = CountryLanguages::$languages;
sort($languages);
return $this->render( return $this->render(
'user/preferences.html.twig', 'user/preferences.html.twig',
[ [
'preferences' => $this->preferencesRepository->findEnabled(), 'preferences' => $this->preferencesRepository->findEnabled(),
'languages' => CountryCodes::$countries, 'languages' => $languages,
'providers' => ['test' => 'Test'], 'providers' => ['test' => 'Test'],
'userPreferences' => $userPreferences->toArray(), 'userPreferences' => $userPreferences->toArray(),
] ]
@@ -55,11 +59,14 @@ class PreferencesController extends AbstractController
$userPreferences = $this->saveUserMediaPreferencesHandler->handle($input->toCommand())->userPreferences; $userPreferences = $this->saveUserMediaPreferencesHandler->handle($input->toCommand())->userPreferences;
$userPreferences = Map::from($userPreferences)->rekey(fn($preference) => $preference->getPreference()->getId()); $userPreferences = Map::from($userPreferences)->rekey(fn($preference) => $preference->getPreference()->getId());
$languages = CountryLanguages::$languages;
sort($languages);
return $this->render( return $this->render(
'user/preferences.html.twig', 'user/preferences.html.twig',
[ [
'preferences' => $this->preferencesRepository->findEnabled(), 'preferences' => $this->preferencesRepository->findEnabled(),
'languages' => CountryCodes::$countries, 'languages' => $languages,
'providers' => ['test' => 'Test'], 'providers' => ['test' => 'Test'],
'userPreferences' => $userPreferences->toArray(), 'userPreferences' => $userPreferences->toArray(),
] ]

View File

@@ -0,0 +1,140 @@
<?php
namespace App\Util;
class CountryLanguages
{
public static $languages = [
'English (US)',
'English',
'French',
'German',
'Italian',
'Spanish',
'Portuguese',
'Mandarin',
'Japanese',
'Korean',
'Russian',
'Hindi',
'Arabic',
'Dutch',
'Swedish',
'Norwegian',
'Danish',
'Finnish',
'Polish',
'Turkish',
'Persian',
'Thai',
'Vietnamese',
'Indonesian',
'Urdu',
'Bengali',
'Ukrainian',
'Greek',
'Hebrew',
'Malay',
'Filipino'
];
public static function fromCountryCode(string $countryCode): string
{
$countryLanguages = [
'US' => 'English (US)',
'GB' => 'English',
'CA' => 'English', // Note: French is also official in parts of Canada
'FR' => 'French',
'DE' => 'German',
'IT' => 'Italian',
'ES' => 'Spanish',
'MX' => 'Spanish',
'BR' => 'Portuguese',
'PT' => 'Portuguese',
'CN' => 'Mandarin',
'JP' => 'Japanese',
'KR' => 'Korean',
'RU' => 'Russian',
'IN' => 'Hindi', // Note: India has multiple official languages
'SA' => 'Arabic',
'EG' => 'Arabic',
'ZA' => 'English', // South Africa has 11 official languages
'NG' => 'English',
'AU' => 'English',
'AR' => 'Spanish',
'CH' => 'German', // Also French, Italian, Romansh
'BE' => 'Dutch', // Also French and German
'NL' => 'Dutch',
'SE' => 'Swedish',
'NO' => 'Norwegian',
'DK' => 'Danish',
'FI' => 'Finnish',
'PL' => 'Polish',
'TR' => 'Turkish',
'IR' => 'Persian',
'TH' => 'Thai',
'VN' => 'Vietnamese',
'ID' => 'Indonesian',
'PK' => 'Urdu',
'BD' => 'Bengali',
'UA' => 'Ukrainian',
'GR' => 'Greek',
'IL' => 'Hebrew',
'MY' => 'Malay',
'PH' => 'Filipino',
'KE' => 'English', // Also Swahili
];
return $countryLanguages[$countryCode];
}
public static function fromCountryName(string $countryName): string
{
$countryLanguages = [
'United States' => 'English (US)',
'United Kingdom' => 'English',
'Canada' => 'English', // French is also official
'France' => 'French',
'Germany' => 'German',
'Italy' => 'Italian',
'Spain' => 'Spanish',
'Mexico' => 'Spanish',
'Brazil' => 'Portuguese',
'Portugal' => 'Portuguese',
'China' => 'Mandarin',
'Japan' => 'Japanese',
'South Korea' => 'Korean',
'Russia' => 'Russian',
'India' => 'Hindi', // Also English and many regional languages
'Saudi Arabia' => 'Arabic',
'Egypt' => 'Arabic',
'South Africa' => 'English', // One of 11 official languages
'Nigeria' => 'English',
'Australia' => 'English',
'Argentina' => 'Spanish',
'Switzerland' => 'German', // Also French, Italian, Romansh
'Belgium' => 'Dutch', // Also French and German
'Netherlands' => 'Dutch',
'Sweden' => 'Swedish',
'Norway' => 'Norwegian',
'Denmark' => 'Danish',
'Finland' => 'Finnish',
'Poland' => 'Polish',
'Turkey' => 'Turkish',
'Iran' => 'Persian',
'Thailand' => 'Thai',
'Vietnam' => 'Vietnamese',
'Indonesia' => 'Indonesian',
'Pakistan' => 'Urdu',
'Bangladesh' => 'Bengali',
'Ukraine' => 'Ukrainian',
'Greece' => 'Greek',
'Israel' => 'Hebrew',
'Malaysia' => 'Malay',
'Philippines' => 'Filipino',
'Kenya' => 'English', // Also Swahili
];
return $countryLanguages[$countryName];
}
}

View File

@@ -34,8 +34,13 @@
</label> </label>
<label for="language"> <label for="language">
Language Language
<select id="language" data-result-filter-target="language" class="px-1 py-0.5 bg-stone-100 text-gray-800 rounded-md"> <select id="language"
<option selected value="{{ filter.language }}">{{ filter.language }}</option> data-result-filter-target="language"
class="px-1 py-0.5 bg-stone-100 text-gray-800 rounded-md"
{% if this.userPreferences['language'] != null %}
data-preferred="{{ this.userPreferences['language'] }}"
{% endif %}
>
</select> </select>
</label> </label>
<label for="provider"> <label for="provider">

View File

@@ -34,7 +34,7 @@
</thead> </thead>
<tbody> <tbody>
{% for result in results.results %} {% for result in results.results %}
<tr class="bg-white border-b dark:bg-slate-700 dark:border-gray-600 border-gray-200" data-languages="{{ result.languages|json_encode }}" {% if "tvshows" == results.media.mediaType %} data-season="{{ results.season }} {% endif %}"> <tr class="bg-white border-b dark:bg-slate-700 dark:border-gray-600 border-gray-200" data-provider="{{ result.provider }}" data-languages="{{ result.languages|json_encode }}" {% if "tvshows" == results.media.mediaType %} data-season="{{ results.season }} {% endif %}">
<td id="size" class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-800 dark:text-gray-50"> <td id="size" class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-800 dark:text-gray-50">
{{ result.size }} {{ result.size }}
</td> </td>

View File

@@ -40,11 +40,11 @@
<label class="text-gray-50" for="language">Language</label> <label class="text-gray-50" for="language">Language</label>
<select class="p-1.5 rounded-md mb-2" name="language" id="language" value="{{ userPreferences['language'].getPreferenceValue() }}"> <select class="p-1.5 rounded-md mb-2" name="language" id="language" value="{{ userPreferences['language'].getPreferenceValue() }}">
{% for key, value in languages %} {% for language in languages %}
<option class="text-gray-800" <option class="text-gray-800"
value="{{ key }}" value="{{ language }}"
{{ key == userPreferences['language'].getPreferenceValue() ? "selected" }} {{ language == userPreferences['language'].getPreferenceValue() ? "selected" }}
>{{ value }}</option> >{{ language }}</option>
{% endfor %} {% endfor %}
</select> </select>