diff --git a/README.md b/README.md index 290e6b4e..48392913 100644 --- a/README.md +++ b/README.md @@ -25,21 +25,20 @@ _On **old systems** you might need to install [**vc redist**](https://learn.micr # Settings Hover your mouse over the ***Sfvip All*** logo: - + To open the settings: -Logo color & pulse meaning: +# Logo Color & pulse | Meaning :--- | :--- Green slow pulse | Everything is fine Red quick pulse | _Sfvip All_ needs your attention # Logs -The logs go **in pairs**: one for each process (***main*** & ***mitmproxy***). +The logs go **in pairs**, one for each process (***main*** & ***mitmproxy***). You'll find them in the app folder: - # Build diff --git a/resources/README_template.md b/resources/README_template.md index 3b1f713c..e34a0fee 100644 --- a/resources/README_template.md +++ b/resources/README_template.md @@ -25,21 +25,20 @@ _On **old systems** you might need to install [**vc redist**](https://learn.micr # Settings Hover your mouse over the ***{name}*** logo: - + To open the settings: -Logo color & pulse meaning: +# Logo Color & pulse | Meaning :--- | :--- Green slow pulse | Everything is fine Red quick pulse | _{name}_ needs your attention # Logs -The logs go **in pairs**: one for each process (***main*** & ***mitmproxy***). +The logs go **in pairs**, one for each process (***main*** & ***mitmproxy***). You'll find them in the app folder: - # Build diff --git a/resources/readme/arrow.png b/resources/readme/arrow.png new file mode 100644 index 00000000..0f30c78e Binary files /dev/null and b/resources/readme/arrow.png differ diff --git a/resources/readme/logo_arrow.png b/resources/readme/logo_arrow.png deleted file mode 100644 index 8d33aa25..00000000 Binary files a/resources/readme/logo_arrow.png and /dev/null differ diff --git a/resources/readme/settings.png b/resources/readme/settings.png index ec8fe5ed..756bae61 100644 Binary files a/resources/readme/settings.png and b/resources/readme/settings.png differ diff --git a/src/sfvip/ui/infos.py b/src/sfvip/ui/infos.py index 28eb87fe..746b79fb 100644 --- a/src/sfvip/ui/infos.py +++ b/src/sfvip/ui/infos.py @@ -37,7 +37,7 @@ class _InfoTheme: bg_interact = "#1F1F1F" bg_headers = "#242424" bg_rows = "#2A2A2A" - separator = "#303030" + separator = "#353535" border = Border( bg="#808080", size=1, @@ -253,7 +253,7 @@ def _get_epg_prefer_label() -> Style: def _epg_url_tooltip() -> Style: - return _InfoStyle.app(LOC.EPGUrlTip).grey.no_truncate + return _InfoStyle.app(LOC.EPGUrlTip % ("xml", "xml.gz")).grey.no_truncate def _epg_libmpv_tooltip() -> Style: @@ -265,6 +265,14 @@ def _epg_prefer_tooltip() -> Style: return _InfoStyle.tooltip(f"{LOC.EPGPrefer}:{msg}") +def _proxy_tooltip(app_info: AppInfo) -> Style: + return _InfoStyle.app(LOC.ProxyTip % app_info.name).grey.no_truncate + + +def _user_proxy_tooltip() -> Style: + return _InfoStyle.app(LOC.UserProxyTip).grey.no_truncate + + def _player_changelog_tooltip() -> Style: return _InfoStyle.tooltip() @@ -326,6 +334,9 @@ def __init__(self, app_info: AppInfo) -> None: self.separator = tk.Frame(self._frame, bg=_InfoTheme.separator) self._proxies.set_headers(_get_infos_headers(app_info.name)) self._proxies_button.bind("", self.show_proxies) + # tooltips + set_tooltip(_proxy_tooltip(app_info), self._proxies.headers[2]) + set_tooltip(_user_proxy_tooltip(), self._proxies.headers[4]) def show_proxies(self, _) -> None: proxies_shown = self.config.App.show_proxies = not self.config.App.show_proxies @@ -409,19 +420,17 @@ def __init__(self, app_info: AppInfo) -> None: self._app_update = CheckBox( frame, bg=_InfoTheme.bg_rows, **_InfoTheme.checkbox, **_get_auto_update().to_tk ) - separator2 = tk.Frame(frame, bg=_InfoTheme.separator) self._player_version = tk.Label(frame, bg=_InfoTheme.bg_rows, **_get_player_version().to_tk) self._player_update = CheckBox( frame, bg=_InfoTheme.bg_rows, **_InfoTheme.checkbox, **_get_auto_update().to_tk ) self._player_button = Button(frame, **_InfoTheme.button) # type: ignore - separator3 = tk.Frame(frame, bg=_InfoTheme.separator) self._libmpv_version = tk.Label(frame, bg=_InfoTheme.bg_rows, **_get_libmpv_version().to_tk) self._libmpv_update = CheckBox( frame, bg=_InfoTheme.bg_rows, **_InfoTheme.checkbox, **_get_auto_update().to_tk ) self._libmpv_button = Button(frame, **_InfoTheme.button) # type: ignore - separator4 = tk.Frame(frame, bg=_InfoTheme.separator) + separator2 = tk.Frame(frame, bg=_InfoTheme.separator) epg_frame = tk.Frame(frame, bg=_InfoTheme.bg_rows) epg_label = tk.Label(epg_frame, bg=_InfoTheme.bg_rows, **_epg().to_tk) self._epg_url = tk.Entry( @@ -460,7 +469,7 @@ def __init__(self, app_info: AppInfo) -> None: self._epg_prefer_check = CheckBox( epg_prefer_frame, bg=_InfoTheme.bg_rows, **_InfoTheme.checkbox, **_get_epg_prefer_update().to_tk ) - separator5 = tk.Frame(frame, bg=_InfoTheme.separator) + separator3 = tk.Frame(frame, bg=_InfoTheme.separator) # layout pad = _InfoTheme.pad button_pad = _InfoTheme.button_pad @@ -475,21 +484,17 @@ def __init__(self, app_info: AppInfo) -> None: self._app_button.grid(row=row, column=2, padx=button_pad, pady=button_pad, sticky=tk.EW) self._app_button.grid_remove() row += 1 - separator2.grid(row=row, columnspan=3, sticky=tk.EW) - row += 1 - self._player_version.grid(row=row, column=0, padx=pad, pady=pad, sticky=tk.W) + self._player_version.grid(row=row, column=0, padx=pad, pady=0, sticky=tk.W) self._player_update.grid(row=row, column=1, padx=pad, sticky=tk.EW) self._player_button.grid(row=row, column=2, padx=button_pad, pady=button_pad, sticky=tk.EW) self._player_button.grid_remove() row += 1 - separator3.grid(row=row, columnspan=3, sticky=tk.EW) - row += 1 self._libmpv_version.grid(row=row, column=0, padx=pad, pady=pad, sticky=tk.W) self._libmpv_update.grid(row=row, column=1, padx=pad, sticky=tk.EW) self._libmpv_button.grid(row=row, column=2, padx=button_pad, pady=button_pad, sticky=tk.EW) self._libmpv_button.grid_remove() row += 1 - separator4.grid(row=row, columnspan=3, sticky=tk.EW) + separator2.grid(row=row, columnspan=3, sticky=tk.EW) row += 1 epg_frame.grid(row=row, columnspan=3, padx=pad, pady=pad, sticky=tk.NSEW) epg_label.pack(side=tk.LEFT) @@ -506,7 +511,7 @@ def __init__(self, app_info: AppInfo) -> None: epg_prefer_label.pack(side=tk.LEFT) self._epg_prefer_check.pack(side=tk.LEFT) row += 1 - separator5.grid(row=row, columnspan=3, sticky=tk.EW) + separator3.grid(row=row, columnspan=3, sticky=tk.EW) row += 1 super()._layout(row=row) frame.columnconfigure(2, weight=1) diff --git a/src/sfvip/ui/widgets.py b/src/sfvip/ui/widgets.py index 3afed38b..40c354db 100644 --- a/src/sfvip/ui/widgets.py +++ b/src/sfvip/ui/widgets.py @@ -172,7 +172,7 @@ class ListView(tk.Frame): Note: set_headers should be called before set_rows """ - # pylint: disable=too-many-arguments + # pylint: disable=too-many-arguments, too-many-instance-attributes def __init__( self, master: tk.BaseWidget, @@ -200,6 +200,7 @@ def __init__( self._bg_separator = bg_separator self._pad = pad self._widths = [] + self._headers = [] @staticmethod def _clear(what: tk.BaseWidget) -> None: @@ -215,8 +216,13 @@ def set_headers(self, headers: Collection[Style]) -> None: label = tk.Label(self._frame_headers, bg=self._bg_headers, **text.to_tk) label.grid(row=0, column=column, ipadx=pad, ipady=pad, sticky=tk.NSEW) self._widths[column] = max(label.winfo_reqwidth() + pad * 2, self._widths[column]) + self._headers.append(label) self.set_column_widths() + @property + def headers(self) -> list[tk.Label]: + return self._headers + def set_rows(self, rows: Sequence[Collection[Style]]) -> None: self._clear(self._frame_rows) pad = self._pad @@ -225,7 +231,7 @@ def set_rows(self, rows: Sequence[Collection[Style]]) -> None: assert len(row_content) == n_column for column, text in enumerate(row_content): label = tk.Label(self._frame_rows, bg=self._bg_rows, **text.to_tk) - label.grid(row=row * 2, column=column, ipadx=pad, ipady=pad, sticky=tk.NSEW) + label.grid(row=row * 2, column=column, ipadx=pad, ipady=0, sticky=tk.NSEW) self._widths[column] = max(label.winfo_reqwidth() + pad * 2, self._widths[column]) # row separator if row != len(rows) - 1: diff --git a/translations/bulgarian.json b/translations/bulgarian.json index a6f69bfe..094c35ef 100644 --- a/translations/bulgarian.json +++ b/translations/bulgarian.json @@ -56,6 +56,8 @@ "No": "Не", "EPGPreferYes": "Да: Първо търсите в EPG на IPTV доставчика. Използвайте външния EPG само когато той не успее.", "EPGPreferNo": "Не: Търсете първо във външния EPG. Използвайте EPG на доставчика на IPTV само когато той не успее.", - "EPGUrlTip": "Въведете URL адреса на външния EPG, който трябва да завършва с \"xml\" или \"xml.gz\".", - "LibmpvTip": "Libmpv декодира и визуализира аудио и видео. активирайте актуализирането, за да получите последната версия, оптимизирана за вашия компютър." + "EPGUrlTip": "Въведете URL адреса на външния EPG, който трябва да завършва с \"%s\" или \"%s\".", + "LibmpvTip": "Libmpv декодира и визуализира аудио и видео. Активирайте актуализациите, за да получите последната версия, оптимизирана за вашия компютър.", + "ProxyTip": "%s използва локален прокси сървър за прихващане на всички заявки към доставчика на IPTV и инжектиране на категориите 'all' и външния EPG", + "UserProxyTip": "Действително потребителско прокси, ако съществува такова" } \ No newline at end of file diff --git a/translations/english.json b/translations/english.json index f8f92044..76992fce 100644 --- a/translations/english.json +++ b/translations/english.json @@ -56,6 +56,8 @@ "No": "No", "EPGPreferYes": "Yes: Search the IPTV provider EPG first. Use the external EPG only when it fails.", "EPGPreferNo": "No: Search the external EPG first. Use the IPTV provider EPG only when it fails.", - "EPGUrlTip": "Enter the URL of the external EPG, it should end up with 'xml' or 'xml.gz'", - "LibmpvTip": "Libmpv decodes & renders audio and video.Enable the update to get the last version optimized for your computer." + "EPGUrlTip": "Enter the URL of the external EPG, it should end up with '%s' or '%s'", + "LibmpvTip": "Libmpv decodes & renders audio and video. Enable the updates to get the last version optimized for your computer.", + "ProxyTip": "%s uses a local proxy to intercept all requests to the IPTV provider and inject the 'all' categories and the external EPG", + "UserProxyTip": "Actual user proxy if it exists" } \ No newline at end of file diff --git a/translations/french.json b/translations/french.json index 43c2feea..8a6f746b 100644 --- a/translations/french.json +++ b/translations/french.json @@ -54,8 +54,10 @@ "EPGPrefer": "Chercher d'abord chez le fournisseur IPTV", "Yes": "Oui", "No": "Non", - "EPGPreferYes": "Oui : Cherchez d'abord dans l'EPG du fournisseur de télévision par internet. N'utilisez l'EPG externe qu'en cas d'échec.", - "EPGPreferNo": "Non : rechercher d'abord l'EPG externe. Utiliser l'EPG du fournisseur IPTV uniquement en cas d'échec.", - "EPGUrlTip": "Entrez l'URL de l'EPG externe, qui devrait se terminer par 'xml' ou 'xml.gz'.", - "LibmpvTip": "Libmpv décode et rend l'audio et la vidéo. Activez la mise à jour pour obtenir la dernière version optimisée pour votre ordinateur." + "EPGPreferYes": "Oui : Recherchez d'abord dans l'EPG du fournisseur de télévision par internet. N'utilisez l'EPG externe qu'en cas d'échec.", + "EPGPreferNo": "Non : rechercher l'EPG externe en premier. Utiliser l'EPG du fournisseur IPTV uniquement en cas d'échec.", + "EPGUrlTip": "Entrez l'URL de l'EPG externe, qui devrait se terminer par '%s' ou '%s'.", + "LibmpvTip": "Libmpv décode et rend l'audio et la vidéo. Activez les mises à jour pour obtenir la dernière version optimisée pour votre ordinateur.", + "ProxyTip": "%s utilise un proxy local pour intercepter toutes les requêtes adressées au fournisseur IPTV et injecter les catégories 'all' et l'EPG externe.", + "UserProxyTip": "Proxy de l'utilisateur actuel s'il existe" } \ No newline at end of file diff --git a/translations/german.json b/translations/german.json index 5bf9bb01..7e6a5d6f 100644 --- a/translations/german.json +++ b/translations/german.json @@ -56,6 +56,8 @@ "No": "Nein", "EPGPreferYes": "Ja: Suchen Sie zuerst im EPG des IPTV-Anbieters. Verwenden Sie den externen EPG nur, wenn er nicht funktioniert.", "EPGPreferNo": "Nein: Zuerst im externen EPG suchen. Verwenden Sie den EPG des IPTV-Anbieters nur, wenn er nicht funktioniert.", - "EPGUrlTip": "Geben Sie die URL des externen EPGs ein, sie sollte mit 'xml' oder 'xml.gz' enden.", - "LibmpvTip": "Libmpv dekodiert und rendert Audio und Video. Aktivieren Sie das Update, um die letzte für Ihren Computer optimierte Version zu erhalten." + "EPGUrlTip": "Geben Sie die URL des externen EPGs ein, sie sollte mit '%s' oder '%s' enden.", + "LibmpvTip": "Libmpv dekodiert und rendert Audio und Video. Aktivieren Sie die Updates, um die letzte für Ihren Computer optimierte Version zu erhalten.", + "ProxyTip": "%s verwendet einen lokalen Proxy, um alle Anfragen an den IPTV-Anbieter abzufangen und die 'all'-Kategorien und den externen EPG zu injizieren", + "UserProxyTip": "Tatsächlicher Benutzer-Proxy, wenn er existiert" } \ No newline at end of file diff --git a/translations/greek.json b/translations/greek.json index 81d9327c..08aa6bda 100644 --- a/translations/greek.json +++ b/translations/greek.json @@ -56,6 +56,8 @@ "No": "Όχι", "EPGPreferYes": "Ναι: Αναζητήστε πρώτα το EPG του παρόχου IPTV. Χρησιμοποιείτε το εξωτερικό EPG μόνο όταν αυτό αποτυγχάνει.", "EPGPreferNo": "Όχι: Αναζητήστε πρώτα το εξωτερικό EPG. Χρησιμοποιήστε το EPG του παρόχου IPTV μόνο όταν αυτό αποτύχει.", - "EPGUrlTip": "Εισάγετε τη διεύθυνση URL του εξωτερικού EPG, θα πρέπει να καταλήγει σε 'xml' ή 'xml.gz'.", - "LibmpvTip": "Το Libmpv αποκωδικοποιεί & αποδίδει ήχο και βίντεο. ενεργοποιήστε την ενημέρωση για να λάβετε την τελευταία έκδοση βελτιστοποιημένη για τον υπολογιστή σας." + "EPGUrlTip": "Εισάγετε τη διεύθυνση URL του εξωτερικού EPG, θα πρέπει να καταλήγει σε '%s' ή '%s'.", + "LibmpvTip": "Το Libmpv αποκωδικοποιεί και αποδίδει ήχο και βίντεο. Ενεργοποιήστε τις ενημερώσεις για να λάβετε την τελευταία έκδοση βελτιστοποιημένη για τον υπολογιστή σας.", + "ProxyTip": "Το %s χρησιμοποιεί έναν τοπικό μεσάζοντα για να υποκλέψει όλα τα αιτήματα προς τον πάροχο IPTV και να εισάγει τις κατηγορίες 'all' και το εξωτερικό EPG", + "UserProxyTip": "Πραγματικός μεσολάβησης χρήστη, εάν υπάρχει" } \ No newline at end of file diff --git a/translations/italian.json b/translations/italian.json index 21b6af60..8855ae94 100644 --- a/translations/italian.json +++ b/translations/italian.json @@ -54,8 +54,10 @@ "EPGPrefer": "Cercare prima il provider IPTV", "Yes": "Si", "No": "No", - "EPGPreferYes": "Sì: cercate prima l'EPG del provider IPTV. Utilizzare l'EPG esterno solo in caso di errore.", + "EPGPreferYes": "Sì: cerca prima l'EPG del provider IPTV. Utilizzare l'EPG esterno solo in caso di errore.", "EPGPreferNo": "No: Cerca prima l'EPG esterno. Utilizzare l'EPG del provider IPTV solo in caso di errore.", - "EPGUrlTip": "Inserite l'URL dell'EPG esterno, che dovrebbe finire con 'xml' o 'xml.gz'.", - "LibmpvTip": "Libmpv decodifica e rende audio e video. Attivare l'aggiornamento per ottenere l'ultima versione ottimizzata per il proprio computer." + "EPGUrlTip": "Immettere l'URL dell'EPG esterno, che dovrebbe finire con '%s' o '%s'.", + "LibmpvTip": "Libmpv decodifica e rende audio e video. Attivare gli aggiornamenti per ottenere l'ultima versione ottimizzata per il proprio computer.", + "ProxyTip": "%s utilizza un proxy locale per intercettare tutte le richieste al provider IPTV e iniettare le categorie 'all' e l'EPG esterno.", + "UserProxyTip": "Proxy utente effettivo, se esiste" } \ No newline at end of file diff --git a/translations/loc/texts.py b/translations/loc/texts.py index 92151f76..bf1fe75e 100644 --- a/translations/loc/texts.py +++ b/translations/loc/texts.py @@ -66,11 +66,16 @@ class Texts: No: str = "No" EPGPreferYes: str = "Yes: Search the IPTV provider EPG first. Use the external EPG only when it fails." EPGPreferNo: str = "No: Search the external EPG first. Use the IPTV provider EPG only when it fails." - EPGUrlTip: str = "Enter the URL of the external EPG, it should end up with 'xml' or 'xml.gz'" + EPGUrlTip: str = "Enter the URL of the external EPG, it should end up with '%s' or '%s'" LibmpvTip: str = ( - "Libmpv decodes & renders audio and video." - "Enable the update to get the last version optimized for your computer." + "Libmpv decodes & renders audio and video. " + "Enable the updates to get the last version optimized for your computer." ) + ProxyTip: str = ( + "%s uses a local proxy to intercept all requests to the IPTV provider " + "and inject the 'all' categories and the external EPG" + ) + UserProxyTip: str = "Actual user proxy if it exists" def as_dict(self) -> dict[str, str]: return dataclasses.asdict(self) diff --git a/translations/polish.json b/translations/polish.json index 715ca1c2..c972ec6e 100644 --- a/translations/polish.json +++ b/translations/polish.json @@ -56,6 +56,8 @@ "No": "Nie", "EPGPreferYes": "Tak: Najpierw należy przeszukać EPG dostawcy IPTV. Używaj zewnętrznego EPG tylko wtedy, gdy zawiedzie.", "EPGPreferNo": "Nie: Najpierw należy przeszukać zewnętrzne EPG. Użyj EPG dostawcy IPTV tylko w przypadku niepowodzenia.", - "EPGUrlTip": "Wprowadź adres URL zewnętrznego EPG, powinien on kończyć się na \"xml\" lub \"xml.gz\".", - "LibmpvTip": "Libmpv dekoduje i renderuje audio i wideo. Włącz aktualizację, aby uzyskać ostatnią wersję zoptymalizowaną dla twojego komputera." + "EPGUrlTip": "Wprowadź adres URL zewnętrznego EPG, powinien on kończyć się na \"%s\" lub \"%s\".", + "LibmpvTip": "Libmpv dekoduje i renderuje audio i wideo. Włącz aktualizacje, aby uzyskać ostatnią wersję zoptymalizowaną dla twojego komputera.", + "ProxyTip": "%s używa lokalnego proxy do przechwytywania wszystkich żądań do dostawcy IPTV i wstrzykiwania kategorii \"all\" i zewnętrznego EPG.", + "UserProxyTip": "Rzeczywiste proxy użytkownika, jeśli istnieje" } \ No newline at end of file diff --git a/translations/russian.json b/translations/russian.json index 7b79c217..e049deb6 100644 --- a/translations/russian.json +++ b/translations/russian.json @@ -56,6 +56,8 @@ "No": "Нет", "EPGPreferYes": "Да: Сначала ищите EPG провайдера IPTV. Используйте внешний EPG только в случае неудачи.", "EPGPreferNo": "Нет: Поиск внешнего EPG первым. Используйте EPG провайдера IPTV только в случае неудачи.", - "EPGUrlTip": "Введите URL-адрес внешнего EPG, в итоге он должен содержать 'xml' или 'xml.gz'.", - "LibmpvTip": "Libmpv декодирует и рендерит аудио и видео. Включите обновление, чтобы получить последнюю версию, оптимизированную для вашего компьютера." + "EPGUrlTip": "Введите URL-адрес внешнего EPG, в итоге должно получиться '%s' или '%s'.", + "LibmpvTip": "Libmpv декодирует и рендерит аудио и видео. Включите обновления, чтобы получить последнюю версию, оптимизированную для вашего компьютера.", + "ProxyTip": "%s использует локальный прокси для перехвата всех запросов к IPTV-провайдеру и введения категорий 'all' и внешнего EPG.", + "UserProxyTip": "Фактический пользовательский прокси, если он существует" } \ No newline at end of file diff --git a/translations/serbian.json b/translations/serbian.json index c1b772aa..667ebbfa 100644 --- a/translations/serbian.json +++ b/translations/serbian.json @@ -56,6 +56,8 @@ "No": "Не", "EPGPreferYes": "Да: Прво претражите ЕПГ ИПТВ провајдера. Користите екстерни ЕПГ само када не успе.", "EPGPreferNo": "Не: прво претражите екстерни ЕПГ. Користите ЕПГ ИПТВ провајдера само када не успе.", - "EPGUrlTip": "Унесите УРЛ спољног ЕПГ-а, требало би да се заврши са 'кмл' или 'кмл.гз'", - "LibmpvTip": "Либмпв декодира и приказује аудио и видео. Омогућите ажурирање да бисте добили последњу верзију оптимизовану за ваш рачунар." + "EPGUrlTip": "Унесите УРЛ спољног ЕПГ-а, требало би да се заврши са '%s' или '%s'", + "LibmpvTip": "Либмпв декодира и приказује аудио и видео. Омогућите ажурирања да бисте последњу верзију оптимизовали за ваш рачунар.", + "ProxyTip": "%s користи локални прокси да пресретне све захтеве ИПТВ провајдеру и убаци 'све' категорије и екстерни ЕПГ", + "UserProxyTip": "Стварни кориснички прокси ако постоји" } \ No newline at end of file diff --git a/translations/slovenian.json b/translations/slovenian.json index 67120a09..2f3d50a8 100644 --- a/translations/slovenian.json +++ b/translations/slovenian.json @@ -56,6 +56,8 @@ "No": "Ne", "EPGPreferYes": "Da: najprej poiščete EPG ponudnika IPTV. Zunanji program EPG uporabite le, kadar ta ne uspe.", "EPGPreferNo": "Ne: Najprej poiščite zunanji EPG. EPG ponudnika IPTV uporabite le, če je neuspešen.", - "EPGUrlTip": "Vnesite URL zunanjega EPG, ki se mora končati z 'xml' ali 'xml.gz'.", - "LibmpvTip": "Libmpv dekodira in upodablja zvok in video. omogočite posodobitev, da dobite zadnjo različico, optimizirano za vaš računalnik." + "EPGUrlTip": "Vnesite URL zunanjega EPG, ki se mora končati z \"%s\" ali \"%s\".", + "LibmpvTip": "Libmpv dekodira in prikazuje zvok in video. Omogočite posodobitve, da dobite zadnjo različico, optimizirano za vaš računalnik.", + "ProxyTip": "%s uporablja lokalni posrednik za prestrezanje vseh zahtevkov ponudniku IPTV in vnašanje kategorij 'all' ter zunanjega EPG", + "UserProxyTip": "Dejanski uporabniški proxy, če obstaja" } \ No newline at end of file diff --git a/translations/spanish.json b/translations/spanish.json index ba9d7a69..e0748740 100644 --- a/translations/spanish.json +++ b/translations/spanish.json @@ -56,6 +56,8 @@ "No": "No", "EPGPreferYes": "Sí: Busca primero en la EPG del proveedor de IPTV. Utiliza la EPG externa sólo cuando falle.", "EPGPreferNo": "No: Buscar primero en la EPG externa. Utilice la EPG del proveedor de IPTV sólo cuando falle.", - "EPGUrlTip": "Introduce la URL de la EPG externa, debería terminar con 'xml' o 'xml.gz'.", - "LibmpvTip": "Libmpv decodifica y renderiza audio y video.Activa la actualización para obtener la última versión optimizada para tu ordenador." + "EPGUrlTip": "Introduce la URL de la EPG externa, debe terminar con '%s' o '%s'.", + "LibmpvTip": "Libmpv decodifica y renderiza audio y video. Activa las actualizaciones para obtener la última versión optimizada para tu ordenador.", + "ProxyTip": "%s utiliza un proxy local para interceptar todas las peticiones al proveedor de IPTV e inyectar las categorías 'all' y la EPG externa", + "UserProxyTip": "Proxy de usuario real si existe" } \ No newline at end of file diff --git a/translations/turkish.json b/translations/turkish.json index 0c4a62f0..dd4a772d 100644 --- a/translations/turkish.json +++ b/translations/turkish.json @@ -56,6 +56,8 @@ "No": "Hayır", "EPGPreferYes": "Evet: Önce IPTV sağlayıcısı EPG'sini arayın. Harici EPG'yi yalnızca başarısız olduğunda kullanın.", "EPGPreferNo": "Hayır: Önce harici EPG'yi arayın. IPTV sağlayıcısı EPG'sini yalnızca başarısız olduğunda kullanın.", - "EPGUrlTip": "Harici EPG'nin URL'sini girin, 'xml' veya 'xml.gz' ile bitmelidir", - "LibmpvTip": "Libmpv ses ve videonun kodunu çözer ve işler Bilgisayarınız için optimize edilmiş son sürümü almak için güncellemeyi etkinleştirin." + "EPGUrlTip": "Harici EPG'nin URL'sini girin, '%s' veya '%s' ile bitmelidir", + "LibmpvTip": "Libmpv ses ve videonun kodunu çözer ve işler. Bilgisayarınız için optimize edilmiş son sürümü almak için güncellemeleri etkinleştirin.", + "ProxyTip": "%s, IPTV sağlayıcısına yapılan tüm istekleri kesmek ve 'tüm' kategorileri ve harici EPG'yi enjekte etmek için yerel bir proxy kullanır", + "UserProxyTip": "Varsa gerçek kullanıcı proxy'si" } \ No newline at end of file