From 1e5968adb20f88d124eb0d9b31a3ca0023cdd3c3 Mon Sep 17 00:00:00 2001 From: Arne Weber Date: Sat, 25 May 2024 18:36:46 +0200 Subject: [PATCH 1/7] Add sorting by end_at setting by @jaredkotoff --- gui.py | 14 +++- inventory.py | 4 ++ lang/English.json | 164 ++++++++++++++++++++++++++++++++++++++++++++++ settings.py | 5 +- translate.py | 4 +- twitch.py | 64 +++++++++++------- 6 files changed, 228 insertions(+), 27 deletions(-) create mode 100644 lang/English.json diff --git a/gui.py b/gui.py index ddc3be55..bcabbfd3 100644 --- a/gui.py +++ b/gui.py @@ -1456,6 +1456,7 @@ class _SettingsVars(TypedDict): proxy: StringVar autostart: IntVar priority_only: IntVar + prioritze_end: IntVar tray_notifications: IntVar @@ -1471,6 +1472,7 @@ def __init__(self, manager: GUIManager, master: ttk.Widget): "tray": IntVar(master, self._settings.autostart_tray), "autostart": IntVar(master, self._settings.autostart), "priority_only": IntVar(master, self._settings.priority_only), + "prioritze_end": IntVar(master, self._settings.prioritze_end), "tray_notifications": IntVar(master, self._settings.tray_notifications), } master.rowconfigure(0, weight=1) @@ -1528,6 +1530,12 @@ def __init__(self, manager: GUIManager, master: ttk.Widget): ttk.Checkbutton( checkboxes_frame, variable=self._vars["priority_only"], command=self.priority_only ).grid(column=1, row=irow, sticky="w") + ttk.Label( + checkboxes_frame, text=_("gui", "settings", "general", "prioritze_end") + ).grid(column=0, row=(irow := irow + 1), sticky="e") + ttk.Checkbutton( + checkboxes_frame, variable=self._vars["prioritze_end"], command=self.prioritze_end + ).grid(column=1, row=irow, sticky="w") # proxy frame proxy_frame = ttk.Frame(center_frame2) proxy_frame.grid(column=0, row=2) @@ -1740,6 +1748,9 @@ def priority_delete(self) -> None: def priority_only(self) -> None: self._settings.priority_only = bool(self._vars["priority_only"].get()) + def prioritze_end(self) -> None: + self._settings.prioritze_end = bool(self._vars["prioritze_end"].get()) + def exclude_add(self) -> None: game_name: str = self._exclude_entry.get() if not game_name: @@ -2257,6 +2268,7 @@ async def main(exit_event: asyncio.Event): autostart=False, language="English", priority_only=False, + prioritze_end=False, autostart_tray=False, exclude={"Lit Game"}, ) @@ -2378,4 +2390,4 @@ def main_exit(task: asyncio.Task[None]) -> None: main_task.add_done_callback(main_exit) loop.run_until_complete(exit_event.wait()) if main_task.done(): - loop.run_until_complete(main_task) + loop.run_until_complete(main_task) \ No newline at end of file diff --git a/inventory.py b/inventory.py index c830ccd9..23d7422d 100644 --- a/inventory.py +++ b/inventory.py @@ -354,3 +354,7 @@ def can_earn_within(self, stamp: datetime) -> bool: and self.starts_at < stamp and any(drop.can_earn_within(stamp) for drop in self.drops) ) + + def can_earn_within_next_hour(self): + next_hour = datetime.now(timezone.utc) + timedelta(hours=1) + return self.can_earn_within(next_hour) \ No newline at end of file diff --git a/lang/English.json b/lang/English.json new file mode 100644 index 00000000..06e06e05 --- /dev/null +++ b/lang/English.json @@ -0,0 +1,164 @@ +{ + "english_name": "English", + "status": { + "terminated": "\nApplication Terminated.\nClose the window to exit the application.", + "watching": "Watching: {channel}", + "goes_online": "{channel} goes ONLINE, switching...", + "goes_offline": "{channel} goes OFFLINE, switching...", + "claimed_drop": "Claimed drop: {drop}", + "claimed_points": "Claimed bonus points: {points}", + "earned_points": "Earned points for watching: {points}, total: {balance}", + "no_channel": "No available channels to watch. Waiting for an ONLINE channel...", + "no_campaign": "No active campaigns to mine drops for. Waiting for an active campaign..." + }, + "login": { + "unexpected_content": "Unexpected content type returned, usually due to being redirected. Do you need to login for internet access?", + "chrome": { + "startup": "Opening Chrome...", + "login_to_complete": "Complete the login procedure manually by pressing the Login button again.", + "no_token": "No authorization token could be found.", + "closed_window": "Chrome window was closed before the login procedure could complete." + }, + "error_code": "Login error code: {error_code}", + "incorrect_login_pass": "Incorrect username or password.", + "incorrect_email_code": "Incorrect email code.", + "incorrect_twofa_code": "Incorrect 2FA code.", + "email_code_required": "Email code required. Check your email.", + "twofa_code_required": "2FA token required." + }, + "error": { + "captcha": "Your login attempt was denied by CAPTCHA.\nPlease try again in 12+ hours.", + "site_down": "Twitch is down, retrying in {seconds} seconds...", + "no_connection": "Cannot connect to Twitch, retrying in {seconds} seconds..." + }, + "gui": { + "output": "Output", + "status": { + "name": "Status", + "idle": "Idle", + "exiting": "Exiting...", + "terminated": "Terminated", + "cleanup": "Cleaning up channels...", + "gathering": "Gathering channels...", + "switching": "Switching the channel...", + "fetching_inventory": "Fetching inventory...", + "fetching_campaigns": "Fetching campaigns...", + "adding_campaigns": "Adding campaigns to inventory... {counter}" + }, + "tabs": { + "main": "Main", + "inventory": "Inventory", + "settings": "Settings", + "help": "Help" + }, + "tray": { + "notification_title": "Mined Drop", + "minimize": "Minimize to Tray", + "show": "Show", + "quit": "Quit" + }, + "login": { + "name": "Login Form", + "labels": "Status:\nUser ID:", + "logged_in": "Logged in", + "logged_out": "Logged out", + "logging_in": "Logging in...", + "required": "Login required", + "request": "Please log in to continue.", + "username": "Username", + "password": "Password", + "twofa_code": "2FA code (optional)", + "button": "Login" + }, + "websocket": { + "name": "Websocket Status", + "websocket": "Websocket #{id}:", + "initializing": "Initializing...", + "connected": "Connected", + "disconnected": "Disconnected", + "connecting": "Connecting...", + "disconnecting": "Disconnecting...", + "reconnecting": "Reconnecting..." + }, + "progress": { + "name": "Campaign Progress", + "drop": "Drop:", + "game": "Game:", + "campaign": "Campaign:", + "remaining": "{time} remaining", + "drop_progress": "Progress:", + "campaign_progress": "Progress:" + }, + "channels": { + "name": "Channels", + "switch": "Switch", + "load_points": "Load Points", + "online": "ONLINE \u2714", + "pending": "OFFLINE \u23f3", + "offline": "OFFLINE \u274c", + "headings": { + "channel": "Channel", + "status": "Status", + "game": "Game", + "viewers": "Viewers", + "points": "Points" + } + }, + "inventory": { + "filter": { + "name": "Filter", + "show": "Show:", + "not_linked": "Not linked", + "upcoming": "Upcoming", + "expired": "Expired", + "excluded": "Excluded", + "finished": "Finished", + "refresh": "Refresh" + }, + "status": { + "linked": "Linked \u2714", + "not_linked": "Not Linked \u274c", + "active": "Active \u2714", + "upcoming": "Upcoming \u23f3", + "expired": "Expired \u274c", + "claimed": "Claimed \u2714", + "ready_to_claim": "Ready to claim \u23f3" + }, + "starts": "Starts: {time}", + "ends": "Ends: {time}", + "allowed_channels": "Allowed Channels:", + "all_channels": "All", + "and_more": "and {amount} more...", + "percent_progress": "{percent} of {minutes} minutes", + "minutes_progress": "{minutes} minutes" + }, + "settings": { + "general": { + "name": "General", + "dark_theme": "Dark theme: ", + "autostart": "Autostart: ", + "tray": "Autostart into tray: ", + "tray_notifications": "Tray notifications: ", + "priority_only": "Priority Only: ", + "prioritze_end": "Prioritize by ending soonest: ", + "proxy": "Proxy (requires restart):" + }, + "game_name": "Game name", + "priority": "Priority", + "exclude": "Exclude", + "reload": "Reload", + "reload_text": "Most changes require a reload to take an immediate effect: " + }, + "help": { + "links": { + "name": "Useful Links", + "inventory": "See Twitch inventory", + "campaigns": "See all campaigns and manage account links" + }, + "how_it_works": "How It Works", + "how_it_works_text": "Every ~20 seconds, the application asks Twitch for a URL to the raw stream data of the channel currently being watched. It then fetches the metadata of this data stream - this is enough to advance the drops. Note that this completely bypasses the need to download any actual stream video and sound. To keep the status (ONLINE or OFFLINE) of the channels up-to-date, there's a websocket connection estabilished that receives events about streams going up or down, or updates regarding the current amount of viewers.", + "getting_started": "Getting Started", + "getting_started_text": "1. Login into the application.\n2. Ensure your Twitch account is linked to all campaigns you're interested in mining.\n3. If you're interested in just mining everything, uncheck \"Priority only\" and press on \"Reload\".\n4. If you want to mine specific games first, use the \"Priority\" list to setup an ordered list of games of your choice. Games from the top of the list will be attempted to be mined first, before the ones lower down the list.\n5. Keep the \"Priority only\" option checked, to avoid mining games that are not on the priority list. Or not - it's up to you.\n6. Use the \"Exclude\" list to tell the application which games should never be mined.\n7. Changing the contents of either of the lists, or changing the state of the \"Priority only\" option, requires you to press on \"Reload\" for the changes to take an effect." + } + } +} \ No newline at end of file diff --git a/settings.py b/settings.py index 1e0ee1a7..4482e1c5 100644 --- a/settings.py +++ b/settings.py @@ -18,6 +18,7 @@ class SettingsFile(TypedDict): exclude: set[str] priority: list[str] priority_only: bool + prioritze_end: bool autostart_tray: bool connection_quality: int tray_notifications: bool @@ -29,6 +30,7 @@ class SettingsFile(TypedDict): "exclude": set(), "autostart": False, "priority_only": True, + "prioritze_end": False, "autostart_tray": False, "connection_quality": 1, "language": DEFAULT_LANG, @@ -52,6 +54,7 @@ class Settings: exclude: set[str] priority: list[str] priority_only: bool + prioritze_end: bool autostart_tray: bool connection_quality: int tray_notifications: bool @@ -92,4 +95,4 @@ def alter(self) -> None: def save(self, *, force: bool = False) -> None: if self._altered or force: - json_save(SETTINGS_PATH, self._settings, sort=True) + json_save(SETTINGS_PATH, self._settings, sort=True) \ No newline at end of file diff --git a/translate.py b/translate.py index 96d96cbc..e4602880 100644 --- a/translate.py +++ b/translate.py @@ -166,6 +166,7 @@ class GUISettingsGeneral(TypedDict): tray: str tray_notifications: str priority_only: str + prioritze_end: str proxy: str @@ -363,6 +364,7 @@ class Translation(TypedDict): "tray": "Autostart into tray: ", "tray_notifications": "Tray notifications: ", "priority_only": "Priority Only: ", + "prioritze_end": "Prioritize by ending soonest: ", "proxy": "Proxy (requires restart):", }, "game_name": "Game name", @@ -468,4 +470,4 @@ def __call__(self, *path: str) -> str: return v -_ = Translator() +_ = Translator() \ No newline at end of file diff --git a/twitch.py b/twitch.py index 89aed302..47ca7bfe 100644 --- a/twitch.py +++ b/twitch.py @@ -746,14 +746,17 @@ def get_priority(self, channel: Channel) -> int: Return a priority number for a given channel. Higher number, higher priority. - Priority 0 is given to channels streaming a game not on the priority list. - Priority -1 is given to OFFLINE channels, or channels streaming no particular games. + Priority requested games are > 0 + Non-priority games are < 0 + (maxsize - 1) Priority is given to OFFLINE channels, or channels streaming no particular games. + (maxsize - 2) Priority is given to channels streaming games without campaigns. """ if (game := channel.game) is None: # None when OFFLINE or no game set - return -1 + return -(sys.maxsize - 1) elif game not in self.wanted_games: - return 0 + # Any channel thats is filtered out by filter_campaigns() + return -(sys.maxsize - 2) return self.wanted_games[game] @staticmethod @@ -825,22 +828,21 @@ async def _run(self): # figure out which games we want self.wanted_games.clear() priorities = self.gui.settings.priorities() - exclude = self.settings.exclude - priority = self.settings.priority - priority_only = self.settings.priority_only - next_hour = datetime.now(timezone.utc) + timedelta(hours=1) - for campaign in self.inventory: + prioritze_end = self.settings.prioritze_end + campaigns = self.inventory + filtered_campaigns = list(filter(self.filter_campaigns, campaigns)) + for i, campaign in enumerate(filtered_campaigns): game = campaign.game - if ( - game not in self.wanted_games # isn't already there - and game.name not in exclude # and isn't excluded - # and isn't excluded by priority_only - and (not priority_only or game.name in priority) - # and can be progressed within the next hour - and campaign.can_earn_within(next_hour) - ): - # non-excluded games with no priority are placed last, below priority ones - self.wanted_games[game] = priorities.get(game.name, 0) + # get users priority preference + game_priority = priorities.get(game.name, 0) + if (game_priority): + if (prioritze_end): + # list is sorted by end_at so this keeps them in order + self.wanted_games[game] = len(filtered_campaigns) - i + else: + self.wanted_games[game] = game_priority + else: + self.wanted_games[game] = -i full_cleanup = True self.restart_watching() self.change_state(State.CHANNELS_CLEANUP) @@ -895,11 +897,10 @@ async def _run(self): # NOTE: we use another set so that we can set them online separately no_acl: set[Game] = set() acl_channels: OrderedSet[Channel] = OrderedSet() - next_hour = datetime.now(timezone.utc) + timedelta(hours=1) for campaign in self.inventory: if ( campaign.game in self.wanted_games - and campaign.can_earn_within(next_hour) + and campaign.can_earn_within_next_hour() ): if campaign.allowed_channels: acl_channels.update(campaign.allowed_channels) @@ -1614,6 +1615,22 @@ async def fetch_campaigns( } return self._merge_data(campaign_ids, fetched_data) + def filter_campaigns(self, campaign: list[DropsCampaign]): + exclude = self.settings.exclude + priority = self.settings.priority + priority_only = self.settings.priority_only + game = campaign.game + if ( + game not in self.wanted_games # isn't already there + and game.name not in exclude # and isn't excluded + # and isn't excluded by priority_only + and (not priority_only or game.name in priority) + # and can be progressed within the next hour + and campaign.can_earn_within_next_hour() + ): + return True + return False + async def fetch_inventory(self) -> None: status_update = self.gui.status.update status_update(_("gui", "status", "fetching_inventory")) @@ -1660,13 +1677,12 @@ async def fetch_inventory(self) -> None: self.gui.inv.clear() self.inventory.clear() switch_triggers: set[datetime] = set() - next_hour = datetime.now(timezone.utc) + timedelta(hours=1) for i, campaign in enumerate(campaigns, start=1): status_update( _("gui", "status", "adding_campaigns").format(counter=f"({i}/{len(campaigns)})") ) self._drops.update({drop.id: drop for drop in campaign.drops}) - if campaign.can_earn_within(next_hour): + if campaign.can_earn_within_next_hour(): switch_triggers.update(campaign.time_triggers) # NOTE: this fetches pictures from the CDN, so might be slow without a cache await self.gui.inv.add_campaign(campaign) @@ -1735,4 +1751,4 @@ async def claim_points(self, channel_id: str | int, claim_id: str) -> None: GQL_OPERATIONS["ClaimCommunityPoints"].with_variables( {"input": {"channelID": str(channel_id), "claimID": claim_id}} ) - ) + ) \ No newline at end of file From 90d56fee1972cb0a82352a54774a9d750d6701a6 Mon Sep 17 00:00:00 2001 From: Arne Weber Date: Sat, 25 May 2024 18:52:06 +0200 Subject: [PATCH 2/7] patch notes and newlines at end of files --- README.md | 2 ++ gui.py | 2 +- inventory.py | 2 +- patch_notes.txt | 42 ++++++++++++++++++++++++++++++++++++++++++ settings.py | 2 +- translate.py | 2 +- twitch.py | 2 +- 7 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 patch_notes.txt diff --git a/README.md b/README.md index 2dc95678..9be46e23 100644 --- a/README.md +++ b/README.md @@ -129,3 +129,5 @@ if they aren't already there. Doing so ensures proper markdown rendering on Gith @casungo - For the entirety of the Italian (Italiano) translation. @Bamboozul - For the entirety of the Arabic (العربية) translation. @Kjerne - For the entirety of the Danish (Dansk) translation. + +For updating Translations: @Kuddus73, @VSeryi, @Windows200000, @BreakshadowCN, @kilroy98, @zelda0079, @Calvineries, @VSeryi, @notNSANE, @ElvisDesigns diff --git a/gui.py b/gui.py index bcabbfd3..37ed293c 100644 --- a/gui.py +++ b/gui.py @@ -2390,4 +2390,4 @@ def main_exit(task: asyncio.Task[None]) -> None: main_task.add_done_callback(main_exit) loop.run_until_complete(exit_event.wait()) if main_task.done(): - loop.run_until_complete(main_task) \ No newline at end of file + loop.run_until_complete(main_task) diff --git a/inventory.py b/inventory.py index 23d7422d..eb1f048e 100644 --- a/inventory.py +++ b/inventory.py @@ -357,4 +357,4 @@ def can_earn_within(self, stamp: datetime) -> bool: def can_earn_within_next_hour(self): next_hour = datetime.now(timezone.utc) + timedelta(hours=1) - return self.can_earn_within(next_hour) \ No newline at end of file + return self.can_earn_within(next_hour) diff --git a/patch_notes.txt b/patch_notes.txt new file mode 100644 index 00000000..338f6742 --- /dev/null +++ b/patch_notes.txt @@ -0,0 +1,42 @@ +## v15.4.0 + +### 25.5.2024 +- Added ability to sort by Campaign end date (made by @jaredkotoff) +- Updated English, German, Czech, Spanish and Russian translation as well as corresponding credits for dark themes and potential future Campaign prioritization by end date + + + +## v15.4.0 + +### 23.5.2024 +- Fixed crash on Linux caused by trying to apply a Windows-exclusive Tkinter theme +- Updated **English**, **German**, **Czech**, **Spanish** and **Russian** translation as well as corresponding credits for dark themes and potential future Campaign prioritization by end date + + + +## v15.3.0 + +### 22.5.2024 +- Completed dark mode 🎉 + +### 20.5.2024 +- Added incomplete dark mode + + + +## v15.2.0 + +### 19.5.2024 +- Updated **French** translation as well as corresponding credits + +### 18.5.2024 +- Updated **Russian**, **Ukrainian** and **Traditional Chinese** translation as well as corresponding credits +- Various changes to github workflows + + + +## v15.1.0 + +### 17.5.2024 +- Updated **Italian**, **Simplified Chinese** and **Spanish** translation as well as corresponding credits +- Various changes to github workflows diff --git a/settings.py b/settings.py index 4482e1c5..20c1906d 100644 --- a/settings.py +++ b/settings.py @@ -95,4 +95,4 @@ def alter(self) -> None: def save(self, *, force: bool = False) -> None: if self._altered or force: - json_save(SETTINGS_PATH, self._settings, sort=True) \ No newline at end of file + json_save(SETTINGS_PATH, self._settings, sort=True) diff --git a/translate.py b/translate.py index e4602880..8603a106 100644 --- a/translate.py +++ b/translate.py @@ -470,4 +470,4 @@ def __call__(self, *path: str) -> str: return v -_ = Translator() \ No newline at end of file +_ = Translator() diff --git a/twitch.py b/twitch.py index 47ca7bfe..4812384e 100644 --- a/twitch.py +++ b/twitch.py @@ -1751,4 +1751,4 @@ async def claim_points(self, channel_id: str | int, claim_id: str) -> None: GQL_OPERATIONS["ClaimCommunityPoints"].with_variables( {"input": {"channelID": str(channel_id), "claimID": claim_id}} ) - ) \ No newline at end of file + ) From 398fe7c155cbcc26e61c6d62eb3f992e4ba452ed Mon Sep 17 00:00:00 2001 From: Valentin Metz Date: Wed, 29 May 2024 01:52:49 +0200 Subject: [PATCH 3/7] Fixed prioritize_by_ending_soonest --- gui.py | 14 +- lang/Deutsch.json | 322 ++++++++--------- lang/English.json | 4 +- "lang/\304\214e\305\241tina.json" | 302 ++++++++-------- ...\201\321\201\320\272\320\270\320\271.json" | 324 +++++++++--------- settings.py | 6 +- translate.py | 4 +- twitch.py | 4 +- 8 files changed, 495 insertions(+), 485 deletions(-) diff --git a/gui.py b/gui.py index 37ed293c..9f74d11b 100644 --- a/gui.py +++ b/gui.py @@ -1456,7 +1456,7 @@ class _SettingsVars(TypedDict): proxy: StringVar autostart: IntVar priority_only: IntVar - prioritze_end: IntVar + prioritize_by_ending_soonest: IntVar tray_notifications: IntVar @@ -1472,7 +1472,7 @@ def __init__(self, manager: GUIManager, master: ttk.Widget): "tray": IntVar(master, self._settings.autostart_tray), "autostart": IntVar(master, self._settings.autostart), "priority_only": IntVar(master, self._settings.priority_only), - "prioritze_end": IntVar(master, self._settings.prioritze_end), + "prioritize_by_ending_soonest": IntVar(master, self._settings.prioritize_by_ending_soonest), "tray_notifications": IntVar(master, self._settings.tray_notifications), } master.rowconfigure(0, weight=1) @@ -1531,10 +1531,10 @@ def __init__(self, manager: GUIManager, master: ttk.Widget): checkboxes_frame, variable=self._vars["priority_only"], command=self.priority_only ).grid(column=1, row=irow, sticky="w") ttk.Label( - checkboxes_frame, text=_("gui", "settings", "general", "prioritze_end") + checkboxes_frame, text=_("gui", "settings", "general", "prioritize_by_ending_soonest") ).grid(column=0, row=(irow := irow + 1), sticky="e") ttk.Checkbutton( - checkboxes_frame, variable=self._vars["prioritze_end"], command=self.prioritze_end + checkboxes_frame, variable=self._vars["prioritize_by_ending_soonest"], command=self.prioritize_by_ending_soonest ).grid(column=1, row=irow, sticky="w") # proxy frame proxy_frame = ttk.Frame(center_frame2) @@ -1748,8 +1748,8 @@ def priority_delete(self) -> None: def priority_only(self) -> None: self._settings.priority_only = bool(self._vars["priority_only"].get()) - def prioritze_end(self) -> None: - self._settings.prioritze_end = bool(self._vars["prioritze_end"].get()) + def prioritize_by_ending_soonest(self) -> None: + self._settings.prioritize_by_ending_soonest = bool(self._vars["prioritize_by_ending_soonest"].get()) def exclude_add(self) -> None: game_name: str = self._exclude_entry.get() @@ -2268,7 +2268,7 @@ async def main(exit_event: asyncio.Event): autostart=False, language="English", priority_only=False, - prioritze_end=False, + prioritize_by_ending_soonest=False, autostart_tray=False, exclude={"Lit Game"}, ) diff --git a/lang/Deutsch.json b/lang/Deutsch.json index 3b7fe09e..5c798b9e 100644 --- a/lang/Deutsch.json +++ b/lang/Deutsch.json @@ -1,161 +1,161 @@ -{ - "english_name": "German", - "status": { - "terminated": "\nAnwendung gestoppt.\nFenster schließen, um die Anwendung zu beenden", - "watching": "{channel} wird zugesehen", - "goes_online": "{channel} ist ONLINE gegangen, wechseln...", - "goes_offline": "{channel} ist OFFLINE gegangen, wechseln...", - "claimed_drop": "Drop abgeholt: {drop}", - "claimed_points": "Kanal-Punkte verdient: {points}", - "earned_points": "Verdiente Kanal-Punkte fürs zuschauen: {points} | Summe: {balance}", - "no_channel": "Keine teilnehmenden Kanäle online. Warten auf Kanäle...", - "no_campaign": "Keine aktiven Kampagnen verfügbar. Warten auf neue Kampagne..." - }, - "login": { - "chrome": { - "startup": "Starte Chrome...", - "login_to_complete": "Erneut auf Anmelden drücken, um den Anmeldevorgang manuell abzuschließen.", - "no_token": "Es wurde kein Autorisierungs-Token gefunden.", - "closed_window": "Das Chrome-Fenster wurde geschlossen, bevor der Anmeldevorgang abgeschlossen werden konnte." - }, - "error_code": "Login-Fehlercode: {error_code}", - "unexpected_content": "Unerwarteter Inhaltstyp zurückgegeben, normalerweise aufgrund einer Weiterleitung.\nIst ein Login für den Internetzugang erforderlich?", - "incorrect_login_pass": "Falscher Benutzername oder Passwort.", - "incorrect_email_code": "Falscher E-Mail Code.", - "incorrect_twofa_code": "Falscher 2FA Code.", - "email_code_required": "E-Mail Code erforderlich. Bitte E-Mail prüfen.", - "twofa_code_required": "2FA Token erforderlich." - }, - "error": { - "captcha": "Der Anmeldeversuch wurde durch CAPTCHA verweigert.\nBitte versuche es in mindestens 12 Stunden erneut.", - "site_down": "Twitch ist nicht erreichbar. Erneuter Versuch in {seconds} Sekunden...", - "no_connection": "Keine Verbindung zu Twitch möglich. Erneuter Versuch in {seconds} Sekunden..." - }, - "gui": { - "output": "Protokoll", - "status": { - "name": "Status", - "idle": "Im Leerlauf", - "exiting": "Beenden...", - "terminated": "Abgebrochen", - "cleanup": "Kanäle aufräumen..", - "gathering": "Kanäle sammeln...", - "switching": "Wechsel des Kanals...", - "fetching_inventory": "Lade Inventar...", - "fetching_campaigns": "Lade Kampagnen...", - "adding_campaigns": "Kampagnen dem Inventar hinzufügen... {counter}" - }, - "tabs": { - "main": "Hauptseite", - "inventory": "Inventar", - "settings": "Einstellungen", - "help": "Hilfe" - }, - "tray": { - "notification_title": "Drop abgeholt", - "minimize": "Minimiere ins System Tray", - "show": "Anzeigen", - "quit": "Beenden" - }, - "login": { - "name": "Login", - "labels": "Status:\nBenutzer ID:", - "logged_in": "Angemeldet", - "logged_out": "Abgemeldet", - "logging_in": "Anmelden...", - "required": "Anmeldung erforderlich", - "request": "Bitte einloggen um fortzufahren.", - "username": "Benutzername", - "password": "Passwort", - "twofa_code": "2FA Code (optional)", - "button": "Anmelden" - }, - "websocket": { - "name": "WebSocket Status", - "websocket": "WebSocket #{id}:", - "initializing": "Initialisieren...", - "connected": "Verbunden", - "disconnected": "Verbindung verloren", - "connecting": "Verbinden...", - "disconnecting": "Verbindung trennen...", - "reconnecting": "Neu verbinden..." - }, - "progress": { - "name": "Kampagnen-Fortschritt", - "drop": "Drop:", - "game": "Spiel:", - "campaign": "Kampagne:", - "remaining": "{time} verbleibend", - "drop_progress": "Fortschritt:", - "campaign_progress": "Fortschritt:" - }, - "channels": { - "name": "Kanäle", - "switch": "Wechseln", - "load_points": "Lade Punkte", - "online": "ONLINE ✔", - "pending": "OFFLINE ⏳", - "offline": "OFFLINE ❌", - "headings": { - "channel": "Kanal", - "status": "Status", - "game": "Spiel", - "viewers": "Zuschauer", - "points": "Punkte" - } - }, - "inventory": { - "filter": { - "name": "Filter", - "show": "Anzeigen:", - "not_linked": "Nicht verbunden", - "upcoming": "Zukünftig", - "expired": "Abgelaufen", - "excluded": "Ausgeschlossen", - "finished": "Abgeholt", - "refresh": "Aktualisieren" - }, - "status": { - "linked": "Verknüpft ✔", - "not_linked": "Nicht verknüpft ❌", - "active": "Aktiv ✔", - "upcoming": "Zukünftig ⏳", - "expired": "Abgelaufen ❌", - "claimed": "Abgeholt ✔", - "ready_to_claim": "Bereit zum abholen ⏳" - }, - "starts": "Beginnt: {time}", - "ends": "Endet: {time}", - "allowed_channels": "Teilnehmende Kanäle:", - "all_channels": "Alle", - "and_more": "und {amount} weitere...", - "percent_progress": "{percent} von {minutes} Minuten", - "minutes_progress": "{minutes} Minuten" - }, - "settings": { - "general": { - "name": "Allgemein", - "autostart": "Autostart: ", - "tray": "Autostart ins System Tray: ", - "priority_only": "Nur Priorität: ", - "proxy": "Proxy (Erfordert Neustart):" - }, - "game_name": "Spiel", - "priority": "Priorität", - "exclude": "Ausschließen", - "reload": "Neu laden", - "reload_text": "Die meisten Änderungen erfordern ein neu laden, um sofort wirksam zu werden: " - }, - "help": { - "links": { - "name": "Hilfreiche Links", - "inventory": "Twitch Inventar ansehen", - "campaigns": "Alle Twitch-Kampagnen ansehen" - }, - "how_it_works": "So funktioniert's", - "how_it_works_text": "Alle ~60 Sekunden sendet die Anwendung ein \"Minute zugesehen\" Ereignis an den Kanal, dem gerade zugesehen wird.\nDies reicht aus, um den Drop voranzutreiben. Auf diese Weise ist es nicht nötig den Stream herunterzuladen und spart Bandbreite.\nUm den Online- oder Offline-Status der Kanäle aktuell zu halten, wird eine Websocket-Verbindung eingerichtet,\ndie die Kanäle auf ihren Status überprüft.", - "getting_started": "Erste Schritte", - "getting_started_text": "• In der Anwendung anmelden.\n• Stelle sicher, dass das Twitch-Konto mit allen Kampagnen verknüpft ist, an denen Interesse besteht.\n• Sollen alle Drops bearbeitet werden, entferne den Haken bei \"Nur Priorität\" und drücke \"Neu laden\".\n• Sollen nur bestimmte Spiele in betracht gezogen werden, verwende die \"Priorität\" Liste um die Wahl nach Spielen einzugrenzen.\n• Die Liste priorisiert von oben nach unten.\n• Die Option \"Nur Priorität\" verhindert, dass Spiele, die nicht auf der Prioritätenliste stehen, bearbeitet werden.\n• Mit der Liste \"Ausschließen\", ist es möglich Spiele zu filtern, die niemals in betracht gezogen werden sollen.\n• Wenn Listen oder Optionen angepasst wurden, muss \"Neu laden\" gedrückt werden, damit die Änderungen übernommen werden." - } - } -} +{ + "english_name": "German", + "status": { + "terminated": "\nAnwendung gestoppt.\nFenster schließen, um die Anwendung zu beenden", + "watching": "{channel} wird zugesehen", + "goes_online": "{channel} ist ONLINE gegangen, wechseln...", + "goes_offline": "{channel} ist OFFLINE gegangen, wechseln...", + "claimed_drop": "Drop abgeholt: {drop}", + "claimed_points": "Kanal-Punkte verdient: {points}", + "earned_points": "Verdiente Kanal-Punkte fürs zuschauen: {points} | Summe: {balance}", + "no_channel": "Keine teilnehmenden Kanäle online. Warten auf Kanäle...", + "no_campaign": "Keine aktiven Kampagnen verfügbar. Warten auf neue Kampagne..." + }, + "login": { + "chrome": { + "startup": "Starte Chrome...", + "login_to_complete": "Erneut auf Anmelden drücken, um den Anmeldevorgang manuell abzuschließen.", + "no_token": "Es wurde kein Autorisierungs-Token gefunden.", + "closed_window": "Das Chrome-Fenster wurde geschlossen, bevor der Anmeldevorgang abgeschlossen werden konnte." + }, + "error_code": "Login-Fehlercode: {error_code}", + "unexpected_content": "Unerwarteter Inhaltstyp zurückgegeben, normalerweise aufgrund einer Weiterleitung.\nIst ein Login für den Internetzugang erforderlich?", + "incorrect_login_pass": "Falscher Benutzername oder Passwort.", + "incorrect_email_code": "Falscher E-Mail Code.", + "incorrect_twofa_code": "Falscher 2FA Code.", + "email_code_required": "E-Mail Code erforderlich. Bitte E-Mail prüfen.", + "twofa_code_required": "2FA Token erforderlich." + }, + "error": { + "captcha": "Der Anmeldeversuch wurde durch CAPTCHA verweigert.\nBitte versuche es in mindestens 12 Stunden erneut.", + "site_down": "Twitch ist nicht erreichbar. Erneuter Versuch in {seconds} Sekunden...", + "no_connection": "Keine Verbindung zu Twitch möglich. Erneuter Versuch in {seconds} Sekunden..." + }, + "gui": { + "output": "Protokoll", + "status": { + "name": "Status", + "idle": "Im Leerlauf", + "exiting": "Beenden...", + "terminated": "Abgebrochen", + "cleanup": "Kanäle aufräumen..", + "gathering": "Kanäle sammeln...", + "switching": "Wechsel des Kanals...", + "fetching_inventory": "Lade Inventar...", + "fetching_campaigns": "Lade Kampagnen...", + "adding_campaigns": "Kampagnen dem Inventar hinzufügen... {counter}" + }, + "tabs": { + "main": "Hauptseite", + "inventory": "Inventar", + "settings": "Einstellungen", + "help": "Hilfe" + }, + "tray": { + "notification_title": "Drop abgeholt", + "minimize": "Minimiere ins System Tray", + "show": "Anzeigen", + "quit": "Beenden" + }, + "login": { + "name": "Login", + "labels": "Status:\nBenutzer ID:", + "logged_in": "Angemeldet", + "logged_out": "Abgemeldet", + "logging_in": "Anmelden...", + "required": "Anmeldung erforderlich", + "request": "Bitte einloggen um fortzufahren.", + "username": "Benutzername", + "password": "Passwort", + "twofa_code": "2FA Code (optional)", + "button": "Anmelden" + }, + "websocket": { + "name": "WebSocket Status", + "websocket": "WebSocket #{id}:", + "initializing": "Initialisieren...", + "connected": "Verbunden", + "disconnected": "Verbindung verloren", + "connecting": "Verbinden...", + "disconnecting": "Verbindung trennen...", + "reconnecting": "Neu verbinden..." + }, + "progress": { + "name": "Kampagnen-Fortschritt", + "drop": "Drop:", + "game": "Spiel:", + "campaign": "Kampagne:", + "remaining": "{time} verbleibend", + "drop_progress": "Fortschritt:", + "campaign_progress": "Fortschritt:" + }, + "channels": { + "name": "Kanäle", + "switch": "Wechseln", + "load_points": "Lade Punkte", + "online": "ONLINE ✔", + "pending": "OFFLINE ⏳", + "offline": "OFFLINE ❌", + "headings": { + "channel": "Kanal", + "status": "Status", + "game": "Spiel", + "viewers": "Zuschauer", + "points": "Punkte" + } + }, + "inventory": { + "filter": { + "name": "Filter", + "show": "Anzeigen:", + "not_linked": "Nicht verbunden", + "upcoming": "Zukünftig", + "expired": "Abgelaufen", + "excluded": "Ausgeschlossen", + "finished": "Abgeholt", + "refresh": "Aktualisieren" + }, + "status": { + "linked": "Verknüpft ✔", + "not_linked": "Nicht verknüpft ❌", + "active": "Aktiv ✔", + "upcoming": "Zukünftig ⏳", + "expired": "Abgelaufen ❌", + "claimed": "Abgeholt ✔", + "ready_to_claim": "Bereit zum abholen ⏳" + }, + "starts": "Beginnt: {time}", + "ends": "Endet: {time}", + "allowed_channels": "Teilnehmende Kanäle:", + "all_channels": "Alle", + "and_more": "und {amount} weitere...", + "percent_progress": "{percent} von {minutes} Minuten", + "minutes_progress": "{minutes} Minuten" + }, + "settings": { + "general": { + "name": "Allgemein", + "autostart": "Autostart: ", + "tray": "Autostart ins System Tray: ", + "priority_only": "Nur Priorität: ", + "proxy": "Proxy (Erfordert Neustart):" + }, + "game_name": "Spiel", + "priority": "Priorität", + "exclude": "Ausschließen", + "reload": "Neu laden", + "reload_text": "Die meisten Änderungen erfordern ein neu laden, um sofort wirksam zu werden: " + }, + "help": { + "links": { + "name": "Hilfreiche Links", + "inventory": "Twitch Inventar ansehen", + "campaigns": "Alle Twitch-Kampagnen ansehen" + }, + "how_it_works": "So funktioniert's", + "how_it_works_text": "Alle ~60 Sekunden sendet die Anwendung ein \"Minute zugesehen\" Ereignis an den Kanal, dem gerade zugesehen wird.\nDies reicht aus, um den Drop voranzutreiben. Auf diese Weise ist es nicht nötig den Stream herunterzuladen und spart Bandbreite.\nUm den Online- oder Offline-Status der Kanäle aktuell zu halten, wird eine Websocket-Verbindung eingerichtet,\ndie die Kanäle auf ihren Status überprüft.", + "getting_started": "Erste Schritte", + "getting_started_text": "• In der Anwendung anmelden.\n• Stelle sicher, dass das Twitch-Konto mit allen Kampagnen verknüpft ist, an denen Interesse besteht.\n• Sollen alle Drops bearbeitet werden, entferne den Haken bei \"Nur Priorität\" und drücke \"Neu laden\".\n• Sollen nur bestimmte Spiele in betracht gezogen werden, verwende die \"Priorität\" Liste um die Wahl nach Spielen einzugrenzen.\n• Die Liste priorisiert von oben nach unten.\n• Die Option \"Nur Priorität\" verhindert, dass Spiele, die nicht auf der Prioritätenliste stehen, bearbeitet werden.\n• Mit der Liste \"Ausschließen\", ist es möglich Spiele zu filtern, die niemals in betracht gezogen werden sollen.\n• Wenn Listen oder Optionen angepasst wurden, muss \"Neu laden\" gedrückt werden, damit die Änderungen übernommen werden." + } + } +} diff --git a/lang/English.json b/lang/English.json index 06e06e05..4c6e0178 100644 --- a/lang/English.json +++ b/lang/English.json @@ -140,7 +140,7 @@ "tray": "Autostart into tray: ", "tray_notifications": "Tray notifications: ", "priority_only": "Priority Only: ", - "prioritze_end": "Prioritize by ending soonest: ", + "prioritize_by_ending_soonest": "Prioritize by ending soonest: ", "proxy": "Proxy (requires restart):" }, "game_name": "Game name", @@ -161,4 +161,4 @@ "getting_started_text": "1. Login into the application.\n2. Ensure your Twitch account is linked to all campaigns you're interested in mining.\n3. If you're interested in just mining everything, uncheck \"Priority only\" and press on \"Reload\".\n4. If you want to mine specific games first, use the \"Priority\" list to setup an ordered list of games of your choice. Games from the top of the list will be attempted to be mined first, before the ones lower down the list.\n5. Keep the \"Priority only\" option checked, to avoid mining games that are not on the priority list. Or not - it's up to you.\n6. Use the \"Exclude\" list to tell the application which games should never be mined.\n7. Changing the contents of either of the lists, or changing the state of the \"Priority only\" option, requires you to press on \"Reload\" for the changes to take an effect." } } -} \ No newline at end of file +} diff --git "a/lang/\304\214e\305\241tina.json" "b/lang/\304\214e\305\241tina.json" index a07bb937..60e9d303 100644 --- "a/lang/\304\214e\305\241tina.json" +++ "b/lang/\304\214e\305\241tina.json" @@ -1,154 +1,164 @@ { - "english_name": "Czech", + "english_name": "Czech", + "status": { + "terminated": "\nAplikace byla ukončena.", + "watching": "Sledování kanálu: {channel}", + "goes_online": "Kanál {channel} je online, přepínám...", + "goes_offline": "Kanál {channel} je offline, přepínám na další...", + "claimed_drop": "Drop vyzvednut: {drop}", + "claimed_points": "Vyzvednuto {points} bodů", + "earned_points": "Získáno {points} bodů za sledování. Celkem: {balance}", + "no_channel": "Žádný kanál není dostupný, čekání na další...", + "no_campaign": "Žádné dropy k dispozici, čekání na další dostupné dropy..." + }, + "login": { + "unexpected_content": "Chyba při přesměrování. Nepoužíváte VPN?", + "chrome": { + "startup": "Otevírá se Chrome...", + "login_to_complete": "Automaticky dokončete proces přihlášení opětovným kliknutím na tlačítko přihlásit.", + "no_token": "Nebyl nalezen žádný autorizační token.", + "closed_window": "Okno Chrome bylo zavřeno před dokončním procesu přihlášení." + }, + "error_code": "Chyba přihlášení: {error_code}", + "incorrect_login_pass": "Nesprávné uživatelské jméno nebo heslo.", + "incorrect_email_code": "Nesprávný E-Mail kód.", + "incorrect_twofa_code": "Nesprávný dvoufaktorový token", + "email_code_required": "K přihlášení je vyžadován kód který byl zaslán na váš E-Mail.", + "twofa_code_required": "K přihlášení je vyžadován dvoufaktorový kód." + }, + "error": { + "captcha": "Vaše připojení bylo zamítnuto systémem přihlásit.CAPTCHA, zkuste to znovu za 12 hodin.", + "site_down": "Služba Twitch je nedostupná,zkuste to znovu za {seconds} sekund...", + "no_connection": "Nelze se připojit k službe Twitch, zkuste to znovu za {seconds}..." + }, + "gui": { + "output": "Výstup", "status": { - "terminated": "\nAplikace byla ukončena.", - "watching": "Sledování kanálu: {channel}", - "goes_online": "Kanál {channel} je online, přepínám...", - "goes_offline": "Kanál {channel} je offline, přepínám na další...", - "claimed_drop": "Drop vyzvednut: {drop}", - "claimed_points": "Vyzvednuto {points} bodů", - "earned_points": "Získáno {points} bodů za sledování. Celkem: {balance}", - "no_channel": "Žádný kanál není dostupný, čekání na další...", - "no_campaign": "Žádné dropy k dispozici, čekání na další dostupné dropy..." + "name": "Status", + "idle": "Dokončeno načítání", + "exiting": "Ukončování...", + "terminated": "Aplikace ukončena", + "cleanup": "Čištění...", + "gathering": "Vyhledávání dostupného živého kanálu...", + "switching": "Přepínám mezi kanály...", + "fetching_inventory": "Načítání inventáře...", + "fetching_campaigns": "Načítání dropů...", + "adding_campaigns": "Přidávám dropy... {counter}" + }, + "tabs": { + "main": "Hlavní Panel", + "inventory": "Inventář", + "settings": "Nastavení", + "help": "Nápověda" + }, + "tray": { + "notification_title": "Začít sbírat dropy", + "minimize": "Minimalizovat", + "show": "Zobrazit", + "quit": "Ukončit" }, "login": { - "unexpected_content": "Chyba při přesměrování. Nepoužíváte VPN?", - "incorrect_login_pass": "Nesprávné přihlašení.", - "incorrect_email_code": "Nesprávný E-Mail kód.", - "incorrect_twofa_code": "Nesprávný dvoufaktorový token", - "email_code_required": "K přihlášení je vyžadován kód který byl zaslán na váš E-Mail.", - "twofa_code_required": "K přihlášení je vyžadován dvoufaktorový kód." + "name": "Přihlášení k službě Twitch", + "labels": "Uživatelské ID:", + "logged_in": "Přihlášeno", + "logged_out": "Odhlášeno", + "logging_in": "Přihlašování...", + "required": "Potřebujete se nejdříve přihlásit", + "request": "Pro přístup je potřeba přihlášení", + "username": "Uživatelské Jméno", + "password": "Heslo", + "twofa_code": "2FA Kód", + "button": "Přihlásit se" + }, + "websocket": { + "name": "Status Připojení Síťového Protokolu", + "websocket": "Websocket #{id}:", + "initializing": "Načítání", + "connected": "Připojeno", + "disconnected": "Odpojeno", + "connecting": "Připojování...", + "disconnecting": "Odpojování...", + "reconnecting": "Přepojování..." + }, + "progress": { + "name": "Průběh Dropu", + "drop": "Drop Odměny:", + "game": "Hra:", + "campaign": "Kampaň:", + "remaining": "Zbývá {time}", + "drop_progress": "Průběh dropu:", + "campaign_progress": "Průběh kampaňe:" + }, + "channels": { + "name": "Název", + "switch": "Přepnout", + "load_points": "Načíst body", + "online": "ONLINE ✔", + "pending": "PRŮBĚH ⏳", + "offline": "OFFLINE ❌", + "headings": { + "channel": "Kanál", + "status": "Status", + "game": "Hra", + "viewers": "Diváci", + "points": "Body" + } + }, + "inventory": { + "filter": { + "name": "Filtr", + "show": "Drop:", + "not_linked": "Nepropojeno", + "upcoming": "Nadcházející", + "expired": "Ukončeno", + "excluded": "Vynecháno", + "finished": "Dokončeno", + "refresh": "Obnovit" + }, + "status": { + "linked": "ŽIVĚ ✔", + "not_linked": "Zatím nejsou dostupné žádné kanály ❌", + "active": "ŽIVĚ ✔", + "upcoming": "Nadcházející ⏳", + "expired": "Ukončeno ❌", + "claimed": "Vyzvednuto ✔", + "ready_to_claim": "Připraveno k vyzvednutí ⏳" + }, + "starts": "Začíná: {time}", + "ends": "Začíná: {time}", + "allowed_channels": "Povolené kanály:", + "all_channels": "Všechny kanály", + "and_more": "Je tu {amount} ...", + "percent_progress": "{minutes} minut {percent}", + "minutes_progress": "{minutes} minut" }, - "error": { - "captcha": "Vaše připojení bylo zamítnuto službou Twitch, zkuste to znovu za 12 hodin.", - "site_down": "Služba Twitch je nedostupná,zkuste to znovu za {seconds} sekund...", - "no_connection": "Nelze se připojit k službe Twitch, zkuste to znovu za {seconds}..." + "settings": { + "general": { + "name": "Nastavení", + "dark_theme": "Tmavý vzhled: ", + "autostart": "Automatické spuštění: ", + "tray": "Automaticky spusti minimalizovaně: ", + "tray_notifications": "Oznámení v systémové liště:", + "priority_only": "Pouze prioritní: ", + "prioritze_end": "Upřednostnit kampaně podle data ukončení:", + "proxy": "Proxy:" + }, + "game_name": "Název Hry", + "priority": "Priorita", + "exclude": "Vynechat", + "reload": "Obnovit", + "reload_text": "Většina změn vyžaduje restart aplikace nebo obnovení: " }, - "gui": { - "output": "Výstup", - "status": { - "name": "Status", - "idle": "Dokončeno načítání", - "exiting": "Ukončování...", - "terminated": "Aplikace ukončena", - "cleanup": "Čištění...", - "gathering": "Vyhledávání dostupného živého kanálu...", - "switching": "Přepínám mezi kanály...", - "fetching_inventory": "Načítání inventáře...", - "fetching_campaigns": "Načítání dropů...", - "adding_campaigns": "Přidávám dropy... {counter}" - }, - "tabs": { - "main": "Hlavní Panel", - "inventory": "Inventář", - "settings": "Nastavení", - "help": "Nápověda" - }, - "tray": { - "notification_title": "Začít sbírat dropy", - "minimize": "Minimalizovat", - "show": "Zobrazit", - "quit": "Ukončit" - }, - "login": { - "name": "Přihlášení k službě Twitch", - "labels": "Uživatelské ID:", - "logged_in": "Přihlášeno", - "logged_out": "Odhlášeno", - "logging_in": "Přihlašování...", - "required": "Potřebujete se nejdříve přihlásit", - "request": "Pro přístup je potřeba přihlášení", - "username": "Uživatelské Jméno", - "password": "Heslo", - "twofa_code": "2FA Kód", - "button": "Přihlásit se" - }, - "websocket": { - "name": "Status Připojení Síťového Protokolu", - "websocket": "Websocket #{id}:", - "initializing": "Načítání", - "connected": "Připojeno", - "disconnected": "Odpojeno", - "connecting": "Připojování...", - "disconnecting": "Odpojování...", - "reconnecting": "Přepojování..." - }, - "progress": { - "name": "Průběh Dropu", - "drop": "Drop Odměny:", - "game": "Hra:", - "campaign": "Kampaň:", - "remaining": "Zbývá {time}", - "drop_progress": "Průběh dropu:", - "campaign_progress": "Průběh kampaňe:" - }, - "channels": { - "name": "Název", - "switch": "Přepnout", - "load_points": "Načíst body", - "online": "ONLINE \u2714", - "pending": "PRŮBĚH \u23f3", - "offline": "OFFLINE \u274c", - "headings": { - "channel": "Kanál", - "game": "Hra", - "points": "Body", - "status": "Status", - "viewers": "Diváci" - } - }, - "inventory": { - "filter": { - "name": "Filtr", - "show": "Drop:", - "not_linked": "Nepropojeno", - "expired": "Ukončeno", - "excluded": "Vynecháno", - "upcoming": "Nadcházející", - "finished": "Dokončeno", - "refresh": "Obnovit" - }, - "status": { - "linked": "ŽIVĚ \u2714", - "not_linked": "Zatím nejsou dostupné žádné kanály \u274c", - "active": "ŽIVĚ \u2714", - "upcoming": "Nadcházející \u23f3", - "expired": "Ukončeno \u274c", - "claimed": "Vyzvednuto \u2714", - "ready_to_claim": "Připraveno k vyzvednutí \u23f3" - }, - "starts": "Začíná: {time}", - "ends": "Začíná: {time}", - "allowed_channels": "Povolené kanály:", - "all_channels": "Všechny kanály", - "and_more": "Je tu {amount} ...", - "percent_progress": "{minutes} minut {percent}", - "minutes_progress": "{minutes} minut" - }, - "settings": { - "general": { - "name": "Nastavení", - "autostart": "Automatické spuštění: ", - "tray": "Automaticky spusti minimalizovaně: ", - "priority_only": "Pouze prioritní: ", - "proxy": "Proxy:" - }, - "game_name": "Název Hry", - "priority": "Priorita", - "exclude": "Vynechat", - "reload": "Obnovit", - "reload_text": "Většina změn vyžaduje restart aplikace nebo obnovení: " - }, - "help": { - "links": { - "name": "Nápověda", - "inventory": "Zobrazit Twitch Inventář", - "campaigns": "Zobrazit všechny kampaňe a spravovat propojené účty" - }, - "how_it_works": "Jak to funguje", - "how_it_works_text": "Každých ~60 sekund aplikace odešle událost 'sledované minuty' na aktuálně sledovaný kanál - to stačí k posunu umístění. Všimněte si, že tímto způsobem zcela odpadá nutnost stahovat skutečné streamované video a zvuk. Aby byl stav kanálu (online nebo offline) stále aktuální, je navázáno spojení přes websocket, které přijímá události o spuštění nebo vypnutí streamů nebo aktualizace o aktuálním počtu diváků.", - "getting_started": "Jak začít", - "getting_started_text": "1. Přihlaste se do aplikace. \n2. Ujistěte se, že je váš účet Twitch spojen se všemi reklamními sériemi, které chcete těžit. \n3. Pokud chcete klepnout pouze na veškerý obsah, zrušte zaškrtnutí políčka 'Pouze prioritní' a stiskněte tlačítko 'Obnovit'. \n4. Pokud se chcete nejprve věnovat konkrétním hrám, použijte seznam 'Prioritní' a nastavte si pořadí vybraných her. Nejprve se vyzkouší hry na začátku seznamu a poté hry na konci seznamu. \n5. Ponechte zaškrtnutou možnost 'Pouze prioritní', abyste se vyhnuli vyhledávání her, které nejsou na seznamu priorit. Nebo ne - záleží na vás. \n6. Pomocí seznamu 'vyloučit' můžete aplikaci sdělit, které hry by neměly být vytěženy. \n7. Změna obsahu obou seznamů nebo stavu možnosti Pouze prioritní vyžaduje stisknutí tlačítka Znovu načíst, aby se změna projevila." - } + "help": { + "links": { + "name": "Nápověda", + "inventory": "Zobrazit Twitch Inventář", + "campaigns": "Zobrazit všechny kampaňe a spravovat propojené účty" + }, + "how_it_works": "Jak to funguje", + "how_it_works_text": "Každých ~20 sekund aplikace požádá Twitch o adresu k čistým datám streamu od kanálu, který je v současnosti sledován. Poté stáhne dodatkové informace těchto dat streamu - to stačí k posunu umístění. Všimněte si, že tímto způsobem zcela odpadá nutnost stahovat skutečné streamované video a zvuk. Aby byl stav kanálu (online nebo offline) stále aktuální, je navázáno spojení přes websocket, které přijímá události o spuštění nebo vypnutí streamů nebo aktualizace o aktuálním počtu diváků.", + "getting_started": "Jak začít", + "getting_started_text": "1. Přihlaste se do aplikace. \n2. Ujistěte se, že je váš účet Twitch spojen se všemi reklamními sériemi, které chcete těžit. \n3. Pokud chcete klepnout pouze na veškerý obsah, zrušte zaškrtnutí políčka 'Pouze prioritní' a stiskněte tlačítko 'Obnovit'. \n4. Pokud se chcete nejprve věnovat konkrétním hrám, použijte seznam 'Prioritní' a nastavte si pořadí vybraných her. Nejprve se vyzkouší hry na začátku seznamu a poté hry na konci seznamu. \n5. Ponechte zaškrtnutou možnost 'Pouze prioritní', abyste se vyhnuli vyhledávání her, které nejsou na seznamu priorit. Nebo ne - záleží na vás. \n6. Pomocí seznamu 'vyloučit' můžete aplikaci sdělit, které hry by neměly být vytěženy. \n7. Změna obsahu obou seznamů nebo stavu možnosti Pouze prioritní vyžaduje stisknutí tlačítka Znovu načíst, aby se změna projevila." } + } } diff --git "a/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" "b/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" index 96350941..ab666749 100644 --- "a/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" +++ "b/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" @@ -1,162 +1,162 @@ -{ - "english_name": "Russian", - "status": { - "terminated": "\nПриложение остановлено.\nЗакройте окно, чтобы выйти из приложения.", - "watching": "Просмотр канала: {channel}", - "goes_online": "Изменение: {channel} онлайн", - "goes_offline": "Изменение: {channel} онлайн", - "claimed_drop": "Drop получено: {drop}", - "claimed_points": "Получены очки канала: {points}", - "earned_points": "За просмотр начисляются очки канала: {points} | Сумма: {balance}", - "no_channel": "Нет участвующих каналов онлайн. Ожидание каналов...", - "no_campaign": "Нет участвующих кампаний онлайн. Ожидание кампаний..." - }, - "login": { - "chrome": { - "startup": "Запуск Браузера...", - "login_to_complete": "Нажмите Log In еще раз, чтобы завершить процесс входа в систему вручную..", - "no_token": "Не найден токен авторизации.", - "closed_window": "Окно Браузера было закрыто до завершения процесса входа в систему." - }, - "error_code": "Код ошибки входа в систему: {error_code}", - "unexpected_content": "Возвращен неожиданный тип содержимого, обычно из-за перенаправления. Требуется ли логин для доступа в Интернет?", - "incorrect_login_pass": "Неправильное имя пользователя или пароль.", - "incorrect_email_code": "Неправильный код электронной почты.", - "incorrect_twofa_code": "Неправильный код 2FA.", - "email_code_required": "Требуется код электронной почты. Пожалуйста, проверьте электронную почту.", - "twofa_code_required": "Требуется код 2FA." - }, - "error": { - "captcha": "Попытка входа в систему была отклонена CAPTCHA.\nПожалуйста, повторите попытку не менее чем через 12 часов.", - "site_down": "Twitch недоступен. Повторите попытку через {seconds} секунд...", - "no_connection": "Невозможно подключиться к Twitch. Повторите попытку через {seconds} секунд..." - }, - "gui": { - "output": "Протокол", - "status": { - "name": "Статус", - "idle": "Вхолостую", - "exiting": "Выход...", - "terminated": "Прекращено", - "cleanup": "Очистка каналов...", - "gathering": "Поиск каналов...", - "switching": "Переключение канала...", - "fetching_inventory": "Получение инвентаря...", - "fetching_campaigns": "Получение кампаний...", - "adding_campaigns": "Добавление кампаний в инвентарь... {counter}" - }, - "tabs": { - "main": "Главная", - "inventory": "Инвентарь", - "settings": "Настройки", - "help": "Помощь" - }, - "tray": { - "notification_title": "Drop получено", - "minimize": "Свернуть в трей", - "show": "Показать", - "quit": "Закрыть" - }, - "login": { - "name": "Авторизация", - "labels": "Статус:\nID пользователя:", - "logged_in": "Авторизован", - "logged_out": "не авторизован", - "logging_in": "Авторизация...", - "required": "Требуется авторизация", - "request": "Пожалуйста, авторизуйтесь, чтобы продолжить.", - "username": "Имя пользователя", - "password": "Пароль", - "twofa_code": "2FA код (опционально)", - "button": "Войти" - }, - "websocket": { - "name": "WebSocket статус", - "websocket": "WebSocket #{id}:", - "initializing": "Инициализация...", - "connected": "Подключено", - "disconnected": "Отключено", - "connecting": "Подключение...", - "disconnecting": "Отключение...", - "reconnecting": "Переподключение..." - }, - "progress": { - "name": "Ход кампании", - "drop": "Drop:", - "game": "Игра:", - "campaign": "Кампания:", - "remaining": "{time} осталось", - "drop_progress": "Прогресс:", - "campaign_progress": "Прогресс:" - }, - "channels": { - "name": "Каналы", - "switch": "Изменить", - "load_points": "Загрузить баллы", - "online": "ОНЛАЙН ✔", - "pending": "ОЖИДАНИЕ ⏳", - "offline": "ОФЛАЙН ❌", - "headings": { - "channel": "Канал", - "status": "Статус", - "game": "Игра", - "viewers": "Зрители", - "points": "Баллы" - } - }, - "inventory": { - "filter": { - "name": "Фильтр", - "show": "Показать:", - "not_linked": "Не связано", - "upcoming": "Будущие", - "expired": "Прошедшие", - "excluded": "Исключенные", - "finished": "Оконченные", - "refresh": "Обновить" - }, - "status": { - "linked": "Связанное ✔", - "not_linked": "Не связанное ❌", - "active": "Активное ✔", - "upcoming": "Будущее ⏳", - "expired": "Прошедшее ❌", - "claimed": "Получено ✔", - "ready_to_claim": "Готово к получению⏳" - }, - "starts": "Начало: {time}", - "ends": "Окончание: {time}", - "allowed_channels": "Участвующие каналы:", - "all_channels": "Все", - "and_more": "и еще {amount}...", - "percent_progress": "{percent} от {minutes} минут", - "minutes_progress": "{minutes} минут" - }, - "settings": { - "general": { - "name": "Общие", - "autostart": "Автозапуск", - "tray": "Автозапуск свёрнутым", - "tray_notifications": "Всплывающие уведомления", - "priority_only": "Только приоритет", - "proxy": "Прокси (Требуется перезапуск):" - }, - "game_name": "Игра", - "priority": "Приоритет", - "exclude": "Исключения", - "reload": "Перезагрузить", - "reload_text": "Большинство изменений требуют перезагрузки, чтобы вступить в силу немедленно: " - }, - "help": { - "links": { - "name": "Полезные ссылки", - "inventory": "Инвентарь Twitch", - "campaigns": "Все кампании Twitch" - }, - "how_it_works": "Как это работает?", - "how_it_works_text": "Каждые ~60 секунд приложение отправляет событие \"минутный просмотр\" на просматриваемый канал. \nЭтого достаточно, чтобы получить Drop. Таким образом, нет необходимости скачивать поток, что экономит трафик. \nДля поддержания актуального состояния каналов в режиме онлайн или офлайн устанавливается соединение websocket, которое проверяет состояние каналов.", - "getting_started": "Первые шаги", - "getting_started_text": "• Войдите в приложение.\n• Убедитесь, что аккаунт Twitch связан со всеми кампаниями, к которым есть интерес.\n• Если вы хотите редактировать все Drops, снимите флажок \"Только приоритет\" и нажмите \"Перезагрузить\".\n• Если необходимо смотреть только определенные игры, используйте список \"Приоритет\", чтобы сузить выбор игр.\n• В списке приоритеты расставлены сверху вниз.\n• Опция \"Только приоритет\" предотвращает просмотр игр, не входящих в список приоритетов.\n• С помощью списка \"Исключения\" можно отфильтровать игры, которые не должны рассматриваться.\n• Если списки или опции были изменены, нажмите \"Перезагрузить\", чтобы изменения были применены." - } - } -} +{ + "english_name": "Russian", + "status": { + "terminated": "\nПриложение остановлено.\nЗакройте окно, чтобы выйти из приложения.", + "watching": "Просмотр канала: {channel}", + "goes_online": "Изменение: {channel} онлайн", + "goes_offline": "Изменение: {channel} онлайн", + "claimed_drop": "Drop получено: {drop}", + "claimed_points": "Получены очки канала: {points}", + "earned_points": "За просмотр начисляются очки канала: {points} | Сумма: {balance}", + "no_channel": "Нет участвующих каналов онлайн. Ожидание каналов...", + "no_campaign": "Нет участвующих кампаний онлайн. Ожидание кампаний..." + }, + "login": { + "chrome": { + "startup": "Запуск Браузера...", + "login_to_complete": "Нажмите Log In еще раз, чтобы завершить процесс входа в систему вручную..", + "no_token": "Не найден токен авторизации.", + "closed_window": "Окно Браузера было закрыто до завершения процесса входа в систему." + }, + "error_code": "Код ошибки входа в систему: {error_code}", + "unexpected_content": "Возвращен неожиданный тип содержимого, обычно из-за перенаправления. Требуется ли логин для доступа в Интернет?", + "incorrect_login_pass": "Неправильное имя пользователя или пароль.", + "incorrect_email_code": "Неправильный код электронной почты.", + "incorrect_twofa_code": "Неправильный код 2FA.", + "email_code_required": "Требуется код электронной почты. Пожалуйста, проверьте электронную почту.", + "twofa_code_required": "Требуется код 2FA." + }, + "error": { + "captcha": "Попытка входа в систему была отклонена CAPTCHA.\nПожалуйста, повторите попытку не менее чем через 12 часов.", + "site_down": "Twitch недоступен. Повторите попытку через {seconds} секунд...", + "no_connection": "Невозможно подключиться к Twitch. Повторите попытку через {seconds} секунд..." + }, + "gui": { + "output": "Протокол", + "status": { + "name": "Статус", + "idle": "Вхолостую", + "exiting": "Выход...", + "terminated": "Прекращено", + "cleanup": "Очистка каналов...", + "gathering": "Поиск каналов...", + "switching": "Переключение канала...", + "fetching_inventory": "Получение инвентаря...", + "fetching_campaigns": "Получение кампаний...", + "adding_campaigns": "Добавление кампаний в инвентарь... {counter}" + }, + "tabs": { + "main": "Главная", + "inventory": "Инвентарь", + "settings": "Настройки", + "help": "Помощь" + }, + "tray": { + "notification_title": "Drop получено", + "minimize": "Свернуть в трей", + "show": "Показать", + "quit": "Закрыть" + }, + "login": { + "name": "Авторизация", + "labels": "Статус:\nID пользователя:", + "logged_in": "Авторизован", + "logged_out": "не авторизован", + "logging_in": "Авторизация...", + "required": "Требуется авторизация", + "request": "Пожалуйста, авторизуйтесь, чтобы продолжить.", + "username": "Имя пользователя", + "password": "Пароль", + "twofa_code": "2FA код (опционально)", + "button": "Войти" + }, + "websocket": { + "name": "WebSocket статус", + "websocket": "WebSocket #{id}:", + "initializing": "Инициализация...", + "connected": "Подключено", + "disconnected": "Отключено", + "connecting": "Подключение...", + "disconnecting": "Отключение...", + "reconnecting": "Переподключение..." + }, + "progress": { + "name": "Ход кампании", + "drop": "Drop:", + "game": "Игра:", + "campaign": "Кампания:", + "remaining": "{time} осталось", + "drop_progress": "Прогресс:", + "campaign_progress": "Прогресс:" + }, + "channels": { + "name": "Каналы", + "switch": "Изменить", + "load_points": "Загрузить баллы", + "online": "ОНЛАЙН ✔", + "pending": "ОЖИДАНИЕ ⏳", + "offline": "ОФЛАЙН ❌", + "headings": { + "channel": "Канал", + "status": "Статус", + "game": "Игра", + "viewers": "Зрители", + "points": "Баллы" + } + }, + "inventory": { + "filter": { + "name": "Фильтр", + "show": "Показать:", + "not_linked": "Не связано", + "upcoming": "Будущие", + "expired": "Прошедшие", + "excluded": "Исключенные", + "finished": "Оконченные", + "refresh": "Обновить" + }, + "status": { + "linked": "Связанное ✔", + "not_linked": "Не связанное ❌", + "active": "Активное ✔", + "upcoming": "Будущее ⏳", + "expired": "Прошедшее ❌", + "claimed": "Получено ✔", + "ready_to_claim": "Готово к получению⏳" + }, + "starts": "Начало: {time}", + "ends": "Окончание: {time}", + "allowed_channels": "Участвующие каналы:", + "all_channels": "Все", + "and_more": "и еще {amount}...", + "percent_progress": "{percent} от {minutes} минут", + "minutes_progress": "{minutes} минут" + }, + "settings": { + "general": { + "name": "Общие", + "autostart": "Автозапуск", + "tray": "Автозапуск свёрнутым", + "tray_notifications": "Всплывающие уведомления", + "priority_only": "Только приоритет", + "proxy": "Прокси (Требуется перезапуск):" + }, + "game_name": "Игра", + "priority": "Приоритет", + "exclude": "Исключения", + "reload": "Перезагрузить", + "reload_text": "Большинство изменений требуют перезагрузки, чтобы вступить в силу немедленно: " + }, + "help": { + "links": { + "name": "Полезные ссылки", + "inventory": "Инвентарь Twitch", + "campaigns": "Все кампании Twitch" + }, + "how_it_works": "Как это работает?", + "how_it_works_text": "Каждые ~60 секунд приложение отправляет событие \"минутный просмотр\" на просматриваемый канал. \nЭтого достаточно, чтобы получить Drop. Таким образом, нет необходимости скачивать поток, что экономит трафик. \nДля поддержания актуального состояния каналов в режиме онлайн или офлайн устанавливается соединение websocket, которое проверяет состояние каналов.", + "getting_started": "Первые шаги", + "getting_started_text": "• Войдите в приложение.\n• Убедитесь, что аккаунт Twitch связан со всеми кампаниями, к которым есть интерес.\n• Если вы хотите редактировать все Drops, снимите флажок \"Только приоритет\" и нажмите \"Перезагрузить\".\n• Если необходимо смотреть только определенные игры, используйте список \"Приоритет\", чтобы сузить выбор игр.\n• В списке приоритеты расставлены сверху вниз.\n• Опция \"Только приоритет\" предотвращает просмотр игр, не входящих в список приоритетов.\n• С помощью списка \"Исключения\" можно отфильтровать игры, которые не должны рассматриваться.\n• Если списки или опции были изменены, нажмите \"Перезагрузить\", чтобы изменения были применены." + } + } +} diff --git a/settings.py b/settings.py index 20c1906d..33c1f003 100644 --- a/settings.py +++ b/settings.py @@ -18,7 +18,7 @@ class SettingsFile(TypedDict): exclude: set[str] priority: list[str] priority_only: bool - prioritze_end: bool + prioritize_by_ending_soonest: bool autostart_tray: bool connection_quality: int tray_notifications: bool @@ -30,7 +30,7 @@ class SettingsFile(TypedDict): "exclude": set(), "autostart": False, "priority_only": True, - "prioritze_end": False, + "prioritize_by_ending_soonest": False, "autostart_tray": False, "connection_quality": 1, "language": DEFAULT_LANG, @@ -54,7 +54,7 @@ class Settings: exclude: set[str] priority: list[str] priority_only: bool - prioritze_end: bool + prioritize_by_ending_soonest: bool autostart_tray: bool connection_quality: int tray_notifications: bool diff --git a/translate.py b/translate.py index 8603a106..ce829d59 100644 --- a/translate.py +++ b/translate.py @@ -166,7 +166,7 @@ class GUISettingsGeneral(TypedDict): tray: str tray_notifications: str priority_only: str - prioritze_end: str + prioritize_by_ending_soonest: str proxy: str @@ -364,7 +364,7 @@ class Translation(TypedDict): "tray": "Autostart into tray: ", "tray_notifications": "Tray notifications: ", "priority_only": "Priority Only: ", - "prioritze_end": "Prioritize by ending soonest: ", + "prioritize_by_ending_soonest": "Prioritize by ending soonest: ", "proxy": "Proxy (requires restart):", }, "game_name": "Game name", diff --git a/twitch.py b/twitch.py index 4812384e..0765a0c8 100644 --- a/twitch.py +++ b/twitch.py @@ -828,7 +828,7 @@ async def _run(self): # figure out which games we want self.wanted_games.clear() priorities = self.gui.settings.priorities() - prioritze_end = self.settings.prioritze_end + prioritize_by_ending_soonest = self.settings.prioritize_by_ending_soonest campaigns = self.inventory filtered_campaigns = list(filter(self.filter_campaigns, campaigns)) for i, campaign in enumerate(filtered_campaigns): @@ -836,7 +836,7 @@ async def _run(self): # get users priority preference game_priority = priorities.get(game.name, 0) if (game_priority): - if (prioritze_end): + if (prioritize_by_ending_soonest): # list is sorted by end_at so this keeps them in order self.wanted_games[game] = len(filtered_campaigns) - i else: From 758c4dd6e77986c6ec993adb410481219dd5fd7a Mon Sep 17 00:00:00 2001 From: Arne Weber Date: Sun, 2 Jun 2024 15:12:06 +0200 Subject: [PATCH 4/7] Add sorting by end_at setting by @jaredkotoff --- README.md | 2 - lang/Deutsch.json | 2 +- lang/English.json | 164 ---------------- "lang/\304\214e\305\241tina.json" | 302 +++++++++++++++--------------- 4 files changed, 147 insertions(+), 323 deletions(-) delete mode 100644 lang/English.json diff --git a/README.md b/README.md index 9be46e23..2dc95678 100644 --- a/README.md +++ b/README.md @@ -129,5 +129,3 @@ if they aren't already there. Doing so ensures proper markdown rendering on Gith @casungo - For the entirety of the Italian (Italiano) translation. @Bamboozul - For the entirety of the Arabic (العربية) translation. @Kjerne - For the entirety of the Danish (Dansk) translation. - -For updating Translations: @Kuddus73, @VSeryi, @Windows200000, @BreakshadowCN, @kilroy98, @zelda0079, @Calvineries, @VSeryi, @notNSANE, @ElvisDesigns diff --git a/lang/Deutsch.json b/lang/Deutsch.json index 5c798b9e..b02b07b4 100644 --- a/lang/Deutsch.json +++ b/lang/Deutsch.json @@ -158,4 +158,4 @@ "getting_started_text": "• In der Anwendung anmelden.\n• Stelle sicher, dass das Twitch-Konto mit allen Kampagnen verknüpft ist, an denen Interesse besteht.\n• Sollen alle Drops bearbeitet werden, entferne den Haken bei \"Nur Priorität\" und drücke \"Neu laden\".\n• Sollen nur bestimmte Spiele in betracht gezogen werden, verwende die \"Priorität\" Liste um die Wahl nach Spielen einzugrenzen.\n• Die Liste priorisiert von oben nach unten.\n• Die Option \"Nur Priorität\" verhindert, dass Spiele, die nicht auf der Prioritätenliste stehen, bearbeitet werden.\n• Mit der Liste \"Ausschließen\", ist es möglich Spiele zu filtern, die niemals in betracht gezogen werden sollen.\n• Wenn Listen oder Optionen angepasst wurden, muss \"Neu laden\" gedrückt werden, damit die Änderungen übernommen werden." } } -} +} \ No newline at end of file diff --git a/lang/English.json b/lang/English.json deleted file mode 100644 index 4c6e0178..00000000 --- a/lang/English.json +++ /dev/null @@ -1,164 +0,0 @@ -{ - "english_name": "English", - "status": { - "terminated": "\nApplication Terminated.\nClose the window to exit the application.", - "watching": "Watching: {channel}", - "goes_online": "{channel} goes ONLINE, switching...", - "goes_offline": "{channel} goes OFFLINE, switching...", - "claimed_drop": "Claimed drop: {drop}", - "claimed_points": "Claimed bonus points: {points}", - "earned_points": "Earned points for watching: {points}, total: {balance}", - "no_channel": "No available channels to watch. Waiting for an ONLINE channel...", - "no_campaign": "No active campaigns to mine drops for. Waiting for an active campaign..." - }, - "login": { - "unexpected_content": "Unexpected content type returned, usually due to being redirected. Do you need to login for internet access?", - "chrome": { - "startup": "Opening Chrome...", - "login_to_complete": "Complete the login procedure manually by pressing the Login button again.", - "no_token": "No authorization token could be found.", - "closed_window": "Chrome window was closed before the login procedure could complete." - }, - "error_code": "Login error code: {error_code}", - "incorrect_login_pass": "Incorrect username or password.", - "incorrect_email_code": "Incorrect email code.", - "incorrect_twofa_code": "Incorrect 2FA code.", - "email_code_required": "Email code required. Check your email.", - "twofa_code_required": "2FA token required." - }, - "error": { - "captcha": "Your login attempt was denied by CAPTCHA.\nPlease try again in 12+ hours.", - "site_down": "Twitch is down, retrying in {seconds} seconds...", - "no_connection": "Cannot connect to Twitch, retrying in {seconds} seconds..." - }, - "gui": { - "output": "Output", - "status": { - "name": "Status", - "idle": "Idle", - "exiting": "Exiting...", - "terminated": "Terminated", - "cleanup": "Cleaning up channels...", - "gathering": "Gathering channels...", - "switching": "Switching the channel...", - "fetching_inventory": "Fetching inventory...", - "fetching_campaigns": "Fetching campaigns...", - "adding_campaigns": "Adding campaigns to inventory... {counter}" - }, - "tabs": { - "main": "Main", - "inventory": "Inventory", - "settings": "Settings", - "help": "Help" - }, - "tray": { - "notification_title": "Mined Drop", - "minimize": "Minimize to Tray", - "show": "Show", - "quit": "Quit" - }, - "login": { - "name": "Login Form", - "labels": "Status:\nUser ID:", - "logged_in": "Logged in", - "logged_out": "Logged out", - "logging_in": "Logging in...", - "required": "Login required", - "request": "Please log in to continue.", - "username": "Username", - "password": "Password", - "twofa_code": "2FA code (optional)", - "button": "Login" - }, - "websocket": { - "name": "Websocket Status", - "websocket": "Websocket #{id}:", - "initializing": "Initializing...", - "connected": "Connected", - "disconnected": "Disconnected", - "connecting": "Connecting...", - "disconnecting": "Disconnecting...", - "reconnecting": "Reconnecting..." - }, - "progress": { - "name": "Campaign Progress", - "drop": "Drop:", - "game": "Game:", - "campaign": "Campaign:", - "remaining": "{time} remaining", - "drop_progress": "Progress:", - "campaign_progress": "Progress:" - }, - "channels": { - "name": "Channels", - "switch": "Switch", - "load_points": "Load Points", - "online": "ONLINE \u2714", - "pending": "OFFLINE \u23f3", - "offline": "OFFLINE \u274c", - "headings": { - "channel": "Channel", - "status": "Status", - "game": "Game", - "viewers": "Viewers", - "points": "Points" - } - }, - "inventory": { - "filter": { - "name": "Filter", - "show": "Show:", - "not_linked": "Not linked", - "upcoming": "Upcoming", - "expired": "Expired", - "excluded": "Excluded", - "finished": "Finished", - "refresh": "Refresh" - }, - "status": { - "linked": "Linked \u2714", - "not_linked": "Not Linked \u274c", - "active": "Active \u2714", - "upcoming": "Upcoming \u23f3", - "expired": "Expired \u274c", - "claimed": "Claimed \u2714", - "ready_to_claim": "Ready to claim \u23f3" - }, - "starts": "Starts: {time}", - "ends": "Ends: {time}", - "allowed_channels": "Allowed Channels:", - "all_channels": "All", - "and_more": "and {amount} more...", - "percent_progress": "{percent} of {minutes} minutes", - "minutes_progress": "{minutes} minutes" - }, - "settings": { - "general": { - "name": "General", - "dark_theme": "Dark theme: ", - "autostart": "Autostart: ", - "tray": "Autostart into tray: ", - "tray_notifications": "Tray notifications: ", - "priority_only": "Priority Only: ", - "prioritize_by_ending_soonest": "Prioritize by ending soonest: ", - "proxy": "Proxy (requires restart):" - }, - "game_name": "Game name", - "priority": "Priority", - "exclude": "Exclude", - "reload": "Reload", - "reload_text": "Most changes require a reload to take an immediate effect: " - }, - "help": { - "links": { - "name": "Useful Links", - "inventory": "See Twitch inventory", - "campaigns": "See all campaigns and manage account links" - }, - "how_it_works": "How It Works", - "how_it_works_text": "Every ~20 seconds, the application asks Twitch for a URL to the raw stream data of the channel currently being watched. It then fetches the metadata of this data stream - this is enough to advance the drops. Note that this completely bypasses the need to download any actual stream video and sound. To keep the status (ONLINE or OFFLINE) of the channels up-to-date, there's a websocket connection estabilished that receives events about streams going up or down, or updates regarding the current amount of viewers.", - "getting_started": "Getting Started", - "getting_started_text": "1. Login into the application.\n2. Ensure your Twitch account is linked to all campaigns you're interested in mining.\n3. If you're interested in just mining everything, uncheck \"Priority only\" and press on \"Reload\".\n4. If you want to mine specific games first, use the \"Priority\" list to setup an ordered list of games of your choice. Games from the top of the list will be attempted to be mined first, before the ones lower down the list.\n5. Keep the \"Priority only\" option checked, to avoid mining games that are not on the priority list. Or not - it's up to you.\n6. Use the \"Exclude\" list to tell the application which games should never be mined.\n7. Changing the contents of either of the lists, or changing the state of the \"Priority only\" option, requires you to press on \"Reload\" for the changes to take an effect." - } - } -} diff --git "a/lang/\304\214e\305\241tina.json" "b/lang/\304\214e\305\241tina.json" index 60e9d303..a07bb937 100644 --- "a/lang/\304\214e\305\241tina.json" +++ "b/lang/\304\214e\305\241tina.json" @@ -1,164 +1,154 @@ { - "english_name": "Czech", - "status": { - "terminated": "\nAplikace byla ukončena.", - "watching": "Sledování kanálu: {channel}", - "goes_online": "Kanál {channel} je online, přepínám...", - "goes_offline": "Kanál {channel} je offline, přepínám na další...", - "claimed_drop": "Drop vyzvednut: {drop}", - "claimed_points": "Vyzvednuto {points} bodů", - "earned_points": "Získáno {points} bodů za sledování. Celkem: {balance}", - "no_channel": "Žádný kanál není dostupný, čekání na další...", - "no_campaign": "Žádné dropy k dispozici, čekání na další dostupné dropy..." - }, - "login": { - "unexpected_content": "Chyba při přesměrování. Nepoužíváte VPN?", - "chrome": { - "startup": "Otevírá se Chrome...", - "login_to_complete": "Automaticky dokončete proces přihlášení opětovným kliknutím na tlačítko přihlásit.", - "no_token": "Nebyl nalezen žádný autorizační token.", - "closed_window": "Okno Chrome bylo zavřeno před dokončním procesu přihlášení." - }, - "error_code": "Chyba přihlášení: {error_code}", - "incorrect_login_pass": "Nesprávné uživatelské jméno nebo heslo.", - "incorrect_email_code": "Nesprávný E-Mail kód.", - "incorrect_twofa_code": "Nesprávný dvoufaktorový token", - "email_code_required": "K přihlášení je vyžadován kód který byl zaslán na váš E-Mail.", - "twofa_code_required": "K přihlášení je vyžadován dvoufaktorový kód." - }, - "error": { - "captcha": "Vaše připojení bylo zamítnuto systémem přihlásit.CAPTCHA, zkuste to znovu za 12 hodin.", - "site_down": "Služba Twitch je nedostupná,zkuste to znovu za {seconds} sekund...", - "no_connection": "Nelze se připojit k službe Twitch, zkuste to znovu za {seconds}..." - }, - "gui": { - "output": "Výstup", + "english_name": "Czech", "status": { - "name": "Status", - "idle": "Dokončeno načítání", - "exiting": "Ukončování...", - "terminated": "Aplikace ukončena", - "cleanup": "Čištění...", - "gathering": "Vyhledávání dostupného živého kanálu...", - "switching": "Přepínám mezi kanály...", - "fetching_inventory": "Načítání inventáře...", - "fetching_campaigns": "Načítání dropů...", - "adding_campaigns": "Přidávám dropy... {counter}" - }, - "tabs": { - "main": "Hlavní Panel", - "inventory": "Inventář", - "settings": "Nastavení", - "help": "Nápověda" - }, - "tray": { - "notification_title": "Začít sbírat dropy", - "minimize": "Minimalizovat", - "show": "Zobrazit", - "quit": "Ukončit" + "terminated": "\nAplikace byla ukončena.", + "watching": "Sledování kanálu: {channel}", + "goes_online": "Kanál {channel} je online, přepínám...", + "goes_offline": "Kanál {channel} je offline, přepínám na další...", + "claimed_drop": "Drop vyzvednut: {drop}", + "claimed_points": "Vyzvednuto {points} bodů", + "earned_points": "Získáno {points} bodů za sledování. Celkem: {balance}", + "no_channel": "Žádný kanál není dostupný, čekání na další...", + "no_campaign": "Žádné dropy k dispozici, čekání na další dostupné dropy..." }, "login": { - "name": "Přihlášení k službě Twitch", - "labels": "Uživatelské ID:", - "logged_in": "Přihlášeno", - "logged_out": "Odhlášeno", - "logging_in": "Přihlašování...", - "required": "Potřebujete se nejdříve přihlásit", - "request": "Pro přístup je potřeba přihlášení", - "username": "Uživatelské Jméno", - "password": "Heslo", - "twofa_code": "2FA Kód", - "button": "Přihlásit se" - }, - "websocket": { - "name": "Status Připojení Síťového Protokolu", - "websocket": "Websocket #{id}:", - "initializing": "Načítání", - "connected": "Připojeno", - "disconnected": "Odpojeno", - "connecting": "Připojování...", - "disconnecting": "Odpojování...", - "reconnecting": "Přepojování..." - }, - "progress": { - "name": "Průběh Dropu", - "drop": "Drop Odměny:", - "game": "Hra:", - "campaign": "Kampaň:", - "remaining": "Zbývá {time}", - "drop_progress": "Průběh dropu:", - "campaign_progress": "Průběh kampaňe:" - }, - "channels": { - "name": "Název", - "switch": "Přepnout", - "load_points": "Načíst body", - "online": "ONLINE ✔", - "pending": "PRŮBĚH ⏳", - "offline": "OFFLINE ❌", - "headings": { - "channel": "Kanál", - "status": "Status", - "game": "Hra", - "viewers": "Diváci", - "points": "Body" - } - }, - "inventory": { - "filter": { - "name": "Filtr", - "show": "Drop:", - "not_linked": "Nepropojeno", - "upcoming": "Nadcházející", - "expired": "Ukončeno", - "excluded": "Vynecháno", - "finished": "Dokončeno", - "refresh": "Obnovit" - }, - "status": { - "linked": "ŽIVĚ ✔", - "not_linked": "Zatím nejsou dostupné žádné kanály ❌", - "active": "ŽIVĚ ✔", - "upcoming": "Nadcházející ⏳", - "expired": "Ukončeno ❌", - "claimed": "Vyzvednuto ✔", - "ready_to_claim": "Připraveno k vyzvednutí ⏳" - }, - "starts": "Začíná: {time}", - "ends": "Začíná: {time}", - "allowed_channels": "Povolené kanály:", - "all_channels": "Všechny kanály", - "and_more": "Je tu {amount} ...", - "percent_progress": "{minutes} minut {percent}", - "minutes_progress": "{minutes} minut" + "unexpected_content": "Chyba při přesměrování. Nepoužíváte VPN?", + "incorrect_login_pass": "Nesprávné přihlašení.", + "incorrect_email_code": "Nesprávný E-Mail kód.", + "incorrect_twofa_code": "Nesprávný dvoufaktorový token", + "email_code_required": "K přihlášení je vyžadován kód který byl zaslán na váš E-Mail.", + "twofa_code_required": "K přihlášení je vyžadován dvoufaktorový kód." }, - "settings": { - "general": { - "name": "Nastavení", - "dark_theme": "Tmavý vzhled: ", - "autostart": "Automatické spuštění: ", - "tray": "Automaticky spusti minimalizovaně: ", - "tray_notifications": "Oznámení v systémové liště:", - "priority_only": "Pouze prioritní: ", - "prioritze_end": "Upřednostnit kampaně podle data ukončení:", - "proxy": "Proxy:" - }, - "game_name": "Název Hry", - "priority": "Priorita", - "exclude": "Vynechat", - "reload": "Obnovit", - "reload_text": "Většina změn vyžaduje restart aplikace nebo obnovení: " + "error": { + "captcha": "Vaše připojení bylo zamítnuto službou Twitch, zkuste to znovu za 12 hodin.", + "site_down": "Služba Twitch je nedostupná,zkuste to znovu za {seconds} sekund...", + "no_connection": "Nelze se připojit k službe Twitch, zkuste to znovu za {seconds}..." }, - "help": { - "links": { - "name": "Nápověda", - "inventory": "Zobrazit Twitch Inventář", - "campaigns": "Zobrazit všechny kampaňe a spravovat propojené účty" - }, - "how_it_works": "Jak to funguje", - "how_it_works_text": "Každých ~20 sekund aplikace požádá Twitch o adresu k čistým datám streamu od kanálu, který je v současnosti sledován. Poté stáhne dodatkové informace těchto dat streamu - to stačí k posunu umístění. Všimněte si, že tímto způsobem zcela odpadá nutnost stahovat skutečné streamované video a zvuk. Aby byl stav kanálu (online nebo offline) stále aktuální, je navázáno spojení přes websocket, které přijímá události o spuštění nebo vypnutí streamů nebo aktualizace o aktuálním počtu diváků.", - "getting_started": "Jak začít", - "getting_started_text": "1. Přihlaste se do aplikace. \n2. Ujistěte se, že je váš účet Twitch spojen se všemi reklamními sériemi, které chcete těžit. \n3. Pokud chcete klepnout pouze na veškerý obsah, zrušte zaškrtnutí políčka 'Pouze prioritní' a stiskněte tlačítko 'Obnovit'. \n4. Pokud se chcete nejprve věnovat konkrétním hrám, použijte seznam 'Prioritní' a nastavte si pořadí vybraných her. Nejprve se vyzkouší hry na začátku seznamu a poté hry na konci seznamu. \n5. Ponechte zaškrtnutou možnost 'Pouze prioritní', abyste se vyhnuli vyhledávání her, které nejsou na seznamu priorit. Nebo ne - záleží na vás. \n6. Pomocí seznamu 'vyloučit' můžete aplikaci sdělit, které hry by neměly být vytěženy. \n7. Změna obsahu obou seznamů nebo stavu možnosti Pouze prioritní vyžaduje stisknutí tlačítka Znovu načíst, aby se změna projevila." + "gui": { + "output": "Výstup", + "status": { + "name": "Status", + "idle": "Dokončeno načítání", + "exiting": "Ukončování...", + "terminated": "Aplikace ukončena", + "cleanup": "Čištění...", + "gathering": "Vyhledávání dostupného živého kanálu...", + "switching": "Přepínám mezi kanály...", + "fetching_inventory": "Načítání inventáře...", + "fetching_campaigns": "Načítání dropů...", + "adding_campaigns": "Přidávám dropy... {counter}" + }, + "tabs": { + "main": "Hlavní Panel", + "inventory": "Inventář", + "settings": "Nastavení", + "help": "Nápověda" + }, + "tray": { + "notification_title": "Začít sbírat dropy", + "minimize": "Minimalizovat", + "show": "Zobrazit", + "quit": "Ukončit" + }, + "login": { + "name": "Přihlášení k službě Twitch", + "labels": "Uživatelské ID:", + "logged_in": "Přihlášeno", + "logged_out": "Odhlášeno", + "logging_in": "Přihlašování...", + "required": "Potřebujete se nejdříve přihlásit", + "request": "Pro přístup je potřeba přihlášení", + "username": "Uživatelské Jméno", + "password": "Heslo", + "twofa_code": "2FA Kód", + "button": "Přihlásit se" + }, + "websocket": { + "name": "Status Připojení Síťového Protokolu", + "websocket": "Websocket #{id}:", + "initializing": "Načítání", + "connected": "Připojeno", + "disconnected": "Odpojeno", + "connecting": "Připojování...", + "disconnecting": "Odpojování...", + "reconnecting": "Přepojování..." + }, + "progress": { + "name": "Průběh Dropu", + "drop": "Drop Odměny:", + "game": "Hra:", + "campaign": "Kampaň:", + "remaining": "Zbývá {time}", + "drop_progress": "Průběh dropu:", + "campaign_progress": "Průběh kampaňe:" + }, + "channels": { + "name": "Název", + "switch": "Přepnout", + "load_points": "Načíst body", + "online": "ONLINE \u2714", + "pending": "PRŮBĚH \u23f3", + "offline": "OFFLINE \u274c", + "headings": { + "channel": "Kanál", + "game": "Hra", + "points": "Body", + "status": "Status", + "viewers": "Diváci" + } + }, + "inventory": { + "filter": { + "name": "Filtr", + "show": "Drop:", + "not_linked": "Nepropojeno", + "expired": "Ukončeno", + "excluded": "Vynecháno", + "upcoming": "Nadcházející", + "finished": "Dokončeno", + "refresh": "Obnovit" + }, + "status": { + "linked": "ŽIVĚ \u2714", + "not_linked": "Zatím nejsou dostupné žádné kanály \u274c", + "active": "ŽIVĚ \u2714", + "upcoming": "Nadcházející \u23f3", + "expired": "Ukončeno \u274c", + "claimed": "Vyzvednuto \u2714", + "ready_to_claim": "Připraveno k vyzvednutí \u23f3" + }, + "starts": "Začíná: {time}", + "ends": "Začíná: {time}", + "allowed_channels": "Povolené kanály:", + "all_channels": "Všechny kanály", + "and_more": "Je tu {amount} ...", + "percent_progress": "{minutes} minut {percent}", + "minutes_progress": "{minutes} minut" + }, + "settings": { + "general": { + "name": "Nastavení", + "autostart": "Automatické spuštění: ", + "tray": "Automaticky spusti minimalizovaně: ", + "priority_only": "Pouze prioritní: ", + "proxy": "Proxy:" + }, + "game_name": "Název Hry", + "priority": "Priorita", + "exclude": "Vynechat", + "reload": "Obnovit", + "reload_text": "Většina změn vyžaduje restart aplikace nebo obnovení: " + }, + "help": { + "links": { + "name": "Nápověda", + "inventory": "Zobrazit Twitch Inventář", + "campaigns": "Zobrazit všechny kampaňe a spravovat propojené účty" + }, + "how_it_works": "Jak to funguje", + "how_it_works_text": "Každých ~60 sekund aplikace odešle událost 'sledované minuty' na aktuálně sledovaný kanál - to stačí k posunu umístění. Všimněte si, že tímto způsobem zcela odpadá nutnost stahovat skutečné streamované video a zvuk. Aby byl stav kanálu (online nebo offline) stále aktuální, je navázáno spojení přes websocket, které přijímá události o spuštění nebo vypnutí streamů nebo aktualizace o aktuálním počtu diváků.", + "getting_started": "Jak začít", + "getting_started_text": "1. Přihlaste se do aplikace. \n2. Ujistěte se, že je váš účet Twitch spojen se všemi reklamními sériemi, které chcete těžit. \n3. Pokud chcete klepnout pouze na veškerý obsah, zrušte zaškrtnutí políčka 'Pouze prioritní' a stiskněte tlačítko 'Obnovit'. \n4. Pokud se chcete nejprve věnovat konkrétním hrám, použijte seznam 'Prioritní' a nastavte si pořadí vybraných her. Nejprve se vyzkouší hry na začátku seznamu a poté hry na konci seznamu. \n5. Ponechte zaškrtnutou možnost 'Pouze prioritní', abyste se vyhnuli vyhledávání her, které nejsou na seznamu priorit. Nebo ne - záleží na vás. \n6. Pomocí seznamu 'vyloučit' můžete aplikaci sdělit, které hry by neměly být vytěženy. \n7. Změna obsahu obou seznamů nebo stavu možnosti Pouze prioritní vyžaduje stisknutí tlačítka Znovu načíst, aby se změna projevila." + } } - } } From d5c70d267f2f6b0ca8151176a9447d081ad87b61 Mon Sep 17 00:00:00 2001 From: Arne Weber Date: Sun, 2 Jun 2024 15:13:33 +0200 Subject: [PATCH 5/7] removed patch patch_notes --- patch_notes.txt | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 patch_notes.txt diff --git a/patch_notes.txt b/patch_notes.txt deleted file mode 100644 index 338f6742..00000000 --- a/patch_notes.txt +++ /dev/null @@ -1,42 +0,0 @@ -## v15.4.0 - -### 25.5.2024 -- Added ability to sort by Campaign end date (made by @jaredkotoff) -- Updated English, German, Czech, Spanish and Russian translation as well as corresponding credits for dark themes and potential future Campaign prioritization by end date - - - -## v15.4.0 - -### 23.5.2024 -- Fixed crash on Linux caused by trying to apply a Windows-exclusive Tkinter theme -- Updated **English**, **German**, **Czech**, **Spanish** and **Russian** translation as well as corresponding credits for dark themes and potential future Campaign prioritization by end date - - - -## v15.3.0 - -### 22.5.2024 -- Completed dark mode 🎉 - -### 20.5.2024 -- Added incomplete dark mode - - - -## v15.2.0 - -### 19.5.2024 -- Updated **French** translation as well as corresponding credits - -### 18.5.2024 -- Updated **Russian**, **Ukrainian** and **Traditional Chinese** translation as well as corresponding credits -- Various changes to github workflows - - - -## v15.1.0 - -### 17.5.2024 -- Updated **Italian**, **Simplified Chinese** and **Spanish** translation as well as corresponding credits -- Various changes to github workflows From cfc8b0f1894bef80d65cfc09dc273f2b5bf9b1fc Mon Sep 17 00:00:00 2001 From: Arne Weber Date: Mon, 3 Jun 2024 16:22:47 +0200 Subject: [PATCH 6/7] remove unnecessary can_earn_within_next_hour() --- inventory.py | 4 ---- twitch.py | 9 ++++++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/inventory.py b/inventory.py index eb1f048e..c830ccd9 100644 --- a/inventory.py +++ b/inventory.py @@ -354,7 +354,3 @@ def can_earn_within(self, stamp: datetime) -> bool: and self.starts_at < stamp and any(drop.can_earn_within(stamp) for drop in self.drops) ) - - def can_earn_within_next_hour(self): - next_hour = datetime.now(timezone.utc) + timedelta(hours=1) - return self.can_earn_within(next_hour) diff --git a/twitch.py b/twitch.py index 0765a0c8..76f72458 100644 --- a/twitch.py +++ b/twitch.py @@ -897,10 +897,11 @@ async def _run(self): # NOTE: we use another set so that we can set them online separately no_acl: set[Game] = set() acl_channels: OrderedSet[Channel] = OrderedSet() + next_hour = datetime.now(timezone.utc) + timedelta(hours=1) for campaign in self.inventory: if ( campaign.game in self.wanted_games - and campaign.can_earn_within_next_hour() + and campaign.can_earn_within(next_hour) ): if campaign.allowed_channels: acl_channels.update(campaign.allowed_channels) @@ -1620,13 +1621,14 @@ def filter_campaigns(self, campaign: list[DropsCampaign]): priority = self.settings.priority priority_only = self.settings.priority_only game = campaign.game + next_hour = datetime.now(timezone.utc) + timedelta(hours=1) if ( game not in self.wanted_games # isn't already there and game.name not in exclude # and isn't excluded # and isn't excluded by priority_only and (not priority_only or game.name in priority) # and can be progressed within the next hour - and campaign.can_earn_within_next_hour() + and campaign.can_earn_within(next_hour) ): return True return False @@ -1677,12 +1679,13 @@ async def fetch_inventory(self) -> None: self.gui.inv.clear() self.inventory.clear() switch_triggers: set[datetime] = set() + next_hour = datetime.now(timezone.utc) + timedelta(hours=1) for i, campaign in enumerate(campaigns, start=1): status_update( _("gui", "status", "adding_campaigns").format(counter=f"({i}/{len(campaigns)})") ) self._drops.update({drop.id: drop for drop in campaign.drops}) - if campaign.can_earn_within_next_hour(): + if campaign.can_earn_within(next_hour): switch_triggers.update(campaign.time_triggers) # NOTE: this fetches pictures from the CDN, so might be slow without a cache await self.gui.inv.add_campaign(campaign) From d97a90877bee9d72ecd947e976efbcca5585ae17 Mon Sep 17 00:00:00 2001 From: Arne Weber Date: Mon, 3 Jun 2024 16:37:50 +0200 Subject: [PATCH 7/7] Change German and Russian .json line end to unix --- lang/Deutsch.json | 322 ++++++++--------- ...\201\321\201\320\272\320\270\320\271.json" | 324 +++++++++--------- 2 files changed, 323 insertions(+), 323 deletions(-) diff --git a/lang/Deutsch.json b/lang/Deutsch.json index b02b07b4..3b7fe09e 100644 --- a/lang/Deutsch.json +++ b/lang/Deutsch.json @@ -1,161 +1,161 @@ -{ - "english_name": "German", - "status": { - "terminated": "\nAnwendung gestoppt.\nFenster schließen, um die Anwendung zu beenden", - "watching": "{channel} wird zugesehen", - "goes_online": "{channel} ist ONLINE gegangen, wechseln...", - "goes_offline": "{channel} ist OFFLINE gegangen, wechseln...", - "claimed_drop": "Drop abgeholt: {drop}", - "claimed_points": "Kanal-Punkte verdient: {points}", - "earned_points": "Verdiente Kanal-Punkte fürs zuschauen: {points} | Summe: {balance}", - "no_channel": "Keine teilnehmenden Kanäle online. Warten auf Kanäle...", - "no_campaign": "Keine aktiven Kampagnen verfügbar. Warten auf neue Kampagne..." - }, - "login": { - "chrome": { - "startup": "Starte Chrome...", - "login_to_complete": "Erneut auf Anmelden drücken, um den Anmeldevorgang manuell abzuschließen.", - "no_token": "Es wurde kein Autorisierungs-Token gefunden.", - "closed_window": "Das Chrome-Fenster wurde geschlossen, bevor der Anmeldevorgang abgeschlossen werden konnte." - }, - "error_code": "Login-Fehlercode: {error_code}", - "unexpected_content": "Unerwarteter Inhaltstyp zurückgegeben, normalerweise aufgrund einer Weiterleitung.\nIst ein Login für den Internetzugang erforderlich?", - "incorrect_login_pass": "Falscher Benutzername oder Passwort.", - "incorrect_email_code": "Falscher E-Mail Code.", - "incorrect_twofa_code": "Falscher 2FA Code.", - "email_code_required": "E-Mail Code erforderlich. Bitte E-Mail prüfen.", - "twofa_code_required": "2FA Token erforderlich." - }, - "error": { - "captcha": "Der Anmeldeversuch wurde durch CAPTCHA verweigert.\nBitte versuche es in mindestens 12 Stunden erneut.", - "site_down": "Twitch ist nicht erreichbar. Erneuter Versuch in {seconds} Sekunden...", - "no_connection": "Keine Verbindung zu Twitch möglich. Erneuter Versuch in {seconds} Sekunden..." - }, - "gui": { - "output": "Protokoll", - "status": { - "name": "Status", - "idle": "Im Leerlauf", - "exiting": "Beenden...", - "terminated": "Abgebrochen", - "cleanup": "Kanäle aufräumen..", - "gathering": "Kanäle sammeln...", - "switching": "Wechsel des Kanals...", - "fetching_inventory": "Lade Inventar...", - "fetching_campaigns": "Lade Kampagnen...", - "adding_campaigns": "Kampagnen dem Inventar hinzufügen... {counter}" - }, - "tabs": { - "main": "Hauptseite", - "inventory": "Inventar", - "settings": "Einstellungen", - "help": "Hilfe" - }, - "tray": { - "notification_title": "Drop abgeholt", - "minimize": "Minimiere ins System Tray", - "show": "Anzeigen", - "quit": "Beenden" - }, - "login": { - "name": "Login", - "labels": "Status:\nBenutzer ID:", - "logged_in": "Angemeldet", - "logged_out": "Abgemeldet", - "logging_in": "Anmelden...", - "required": "Anmeldung erforderlich", - "request": "Bitte einloggen um fortzufahren.", - "username": "Benutzername", - "password": "Passwort", - "twofa_code": "2FA Code (optional)", - "button": "Anmelden" - }, - "websocket": { - "name": "WebSocket Status", - "websocket": "WebSocket #{id}:", - "initializing": "Initialisieren...", - "connected": "Verbunden", - "disconnected": "Verbindung verloren", - "connecting": "Verbinden...", - "disconnecting": "Verbindung trennen...", - "reconnecting": "Neu verbinden..." - }, - "progress": { - "name": "Kampagnen-Fortschritt", - "drop": "Drop:", - "game": "Spiel:", - "campaign": "Kampagne:", - "remaining": "{time} verbleibend", - "drop_progress": "Fortschritt:", - "campaign_progress": "Fortschritt:" - }, - "channels": { - "name": "Kanäle", - "switch": "Wechseln", - "load_points": "Lade Punkte", - "online": "ONLINE ✔", - "pending": "OFFLINE ⏳", - "offline": "OFFLINE ❌", - "headings": { - "channel": "Kanal", - "status": "Status", - "game": "Spiel", - "viewers": "Zuschauer", - "points": "Punkte" - } - }, - "inventory": { - "filter": { - "name": "Filter", - "show": "Anzeigen:", - "not_linked": "Nicht verbunden", - "upcoming": "Zukünftig", - "expired": "Abgelaufen", - "excluded": "Ausgeschlossen", - "finished": "Abgeholt", - "refresh": "Aktualisieren" - }, - "status": { - "linked": "Verknüpft ✔", - "not_linked": "Nicht verknüpft ❌", - "active": "Aktiv ✔", - "upcoming": "Zukünftig ⏳", - "expired": "Abgelaufen ❌", - "claimed": "Abgeholt ✔", - "ready_to_claim": "Bereit zum abholen ⏳" - }, - "starts": "Beginnt: {time}", - "ends": "Endet: {time}", - "allowed_channels": "Teilnehmende Kanäle:", - "all_channels": "Alle", - "and_more": "und {amount} weitere...", - "percent_progress": "{percent} von {minutes} Minuten", - "minutes_progress": "{minutes} Minuten" - }, - "settings": { - "general": { - "name": "Allgemein", - "autostart": "Autostart: ", - "tray": "Autostart ins System Tray: ", - "priority_only": "Nur Priorität: ", - "proxy": "Proxy (Erfordert Neustart):" - }, - "game_name": "Spiel", - "priority": "Priorität", - "exclude": "Ausschließen", - "reload": "Neu laden", - "reload_text": "Die meisten Änderungen erfordern ein neu laden, um sofort wirksam zu werden: " - }, - "help": { - "links": { - "name": "Hilfreiche Links", - "inventory": "Twitch Inventar ansehen", - "campaigns": "Alle Twitch-Kampagnen ansehen" - }, - "how_it_works": "So funktioniert's", - "how_it_works_text": "Alle ~60 Sekunden sendet die Anwendung ein \"Minute zugesehen\" Ereignis an den Kanal, dem gerade zugesehen wird.\nDies reicht aus, um den Drop voranzutreiben. Auf diese Weise ist es nicht nötig den Stream herunterzuladen und spart Bandbreite.\nUm den Online- oder Offline-Status der Kanäle aktuell zu halten, wird eine Websocket-Verbindung eingerichtet,\ndie die Kanäle auf ihren Status überprüft.", - "getting_started": "Erste Schritte", - "getting_started_text": "• In der Anwendung anmelden.\n• Stelle sicher, dass das Twitch-Konto mit allen Kampagnen verknüpft ist, an denen Interesse besteht.\n• Sollen alle Drops bearbeitet werden, entferne den Haken bei \"Nur Priorität\" und drücke \"Neu laden\".\n• Sollen nur bestimmte Spiele in betracht gezogen werden, verwende die \"Priorität\" Liste um die Wahl nach Spielen einzugrenzen.\n• Die Liste priorisiert von oben nach unten.\n• Die Option \"Nur Priorität\" verhindert, dass Spiele, die nicht auf der Prioritätenliste stehen, bearbeitet werden.\n• Mit der Liste \"Ausschließen\", ist es möglich Spiele zu filtern, die niemals in betracht gezogen werden sollen.\n• Wenn Listen oder Optionen angepasst wurden, muss \"Neu laden\" gedrückt werden, damit die Änderungen übernommen werden." - } - } -} \ No newline at end of file +{ + "english_name": "German", + "status": { + "terminated": "\nAnwendung gestoppt.\nFenster schließen, um die Anwendung zu beenden", + "watching": "{channel} wird zugesehen", + "goes_online": "{channel} ist ONLINE gegangen, wechseln...", + "goes_offline": "{channel} ist OFFLINE gegangen, wechseln...", + "claimed_drop": "Drop abgeholt: {drop}", + "claimed_points": "Kanal-Punkte verdient: {points}", + "earned_points": "Verdiente Kanal-Punkte fürs zuschauen: {points} | Summe: {balance}", + "no_channel": "Keine teilnehmenden Kanäle online. Warten auf Kanäle...", + "no_campaign": "Keine aktiven Kampagnen verfügbar. Warten auf neue Kampagne..." + }, + "login": { + "chrome": { + "startup": "Starte Chrome...", + "login_to_complete": "Erneut auf Anmelden drücken, um den Anmeldevorgang manuell abzuschließen.", + "no_token": "Es wurde kein Autorisierungs-Token gefunden.", + "closed_window": "Das Chrome-Fenster wurde geschlossen, bevor der Anmeldevorgang abgeschlossen werden konnte." + }, + "error_code": "Login-Fehlercode: {error_code}", + "unexpected_content": "Unerwarteter Inhaltstyp zurückgegeben, normalerweise aufgrund einer Weiterleitung.\nIst ein Login für den Internetzugang erforderlich?", + "incorrect_login_pass": "Falscher Benutzername oder Passwort.", + "incorrect_email_code": "Falscher E-Mail Code.", + "incorrect_twofa_code": "Falscher 2FA Code.", + "email_code_required": "E-Mail Code erforderlich. Bitte E-Mail prüfen.", + "twofa_code_required": "2FA Token erforderlich." + }, + "error": { + "captcha": "Der Anmeldeversuch wurde durch CAPTCHA verweigert.\nBitte versuche es in mindestens 12 Stunden erneut.", + "site_down": "Twitch ist nicht erreichbar. Erneuter Versuch in {seconds} Sekunden...", + "no_connection": "Keine Verbindung zu Twitch möglich. Erneuter Versuch in {seconds} Sekunden..." + }, + "gui": { + "output": "Protokoll", + "status": { + "name": "Status", + "idle": "Im Leerlauf", + "exiting": "Beenden...", + "terminated": "Abgebrochen", + "cleanup": "Kanäle aufräumen..", + "gathering": "Kanäle sammeln...", + "switching": "Wechsel des Kanals...", + "fetching_inventory": "Lade Inventar...", + "fetching_campaigns": "Lade Kampagnen...", + "adding_campaigns": "Kampagnen dem Inventar hinzufügen... {counter}" + }, + "tabs": { + "main": "Hauptseite", + "inventory": "Inventar", + "settings": "Einstellungen", + "help": "Hilfe" + }, + "tray": { + "notification_title": "Drop abgeholt", + "minimize": "Minimiere ins System Tray", + "show": "Anzeigen", + "quit": "Beenden" + }, + "login": { + "name": "Login", + "labels": "Status:\nBenutzer ID:", + "logged_in": "Angemeldet", + "logged_out": "Abgemeldet", + "logging_in": "Anmelden...", + "required": "Anmeldung erforderlich", + "request": "Bitte einloggen um fortzufahren.", + "username": "Benutzername", + "password": "Passwort", + "twofa_code": "2FA Code (optional)", + "button": "Anmelden" + }, + "websocket": { + "name": "WebSocket Status", + "websocket": "WebSocket #{id}:", + "initializing": "Initialisieren...", + "connected": "Verbunden", + "disconnected": "Verbindung verloren", + "connecting": "Verbinden...", + "disconnecting": "Verbindung trennen...", + "reconnecting": "Neu verbinden..." + }, + "progress": { + "name": "Kampagnen-Fortschritt", + "drop": "Drop:", + "game": "Spiel:", + "campaign": "Kampagne:", + "remaining": "{time} verbleibend", + "drop_progress": "Fortschritt:", + "campaign_progress": "Fortschritt:" + }, + "channels": { + "name": "Kanäle", + "switch": "Wechseln", + "load_points": "Lade Punkte", + "online": "ONLINE ✔", + "pending": "OFFLINE ⏳", + "offline": "OFFLINE ❌", + "headings": { + "channel": "Kanal", + "status": "Status", + "game": "Spiel", + "viewers": "Zuschauer", + "points": "Punkte" + } + }, + "inventory": { + "filter": { + "name": "Filter", + "show": "Anzeigen:", + "not_linked": "Nicht verbunden", + "upcoming": "Zukünftig", + "expired": "Abgelaufen", + "excluded": "Ausgeschlossen", + "finished": "Abgeholt", + "refresh": "Aktualisieren" + }, + "status": { + "linked": "Verknüpft ✔", + "not_linked": "Nicht verknüpft ❌", + "active": "Aktiv ✔", + "upcoming": "Zukünftig ⏳", + "expired": "Abgelaufen ❌", + "claimed": "Abgeholt ✔", + "ready_to_claim": "Bereit zum abholen ⏳" + }, + "starts": "Beginnt: {time}", + "ends": "Endet: {time}", + "allowed_channels": "Teilnehmende Kanäle:", + "all_channels": "Alle", + "and_more": "und {amount} weitere...", + "percent_progress": "{percent} von {minutes} Minuten", + "minutes_progress": "{minutes} Minuten" + }, + "settings": { + "general": { + "name": "Allgemein", + "autostart": "Autostart: ", + "tray": "Autostart ins System Tray: ", + "priority_only": "Nur Priorität: ", + "proxy": "Proxy (Erfordert Neustart):" + }, + "game_name": "Spiel", + "priority": "Priorität", + "exclude": "Ausschließen", + "reload": "Neu laden", + "reload_text": "Die meisten Änderungen erfordern ein neu laden, um sofort wirksam zu werden: " + }, + "help": { + "links": { + "name": "Hilfreiche Links", + "inventory": "Twitch Inventar ansehen", + "campaigns": "Alle Twitch-Kampagnen ansehen" + }, + "how_it_works": "So funktioniert's", + "how_it_works_text": "Alle ~60 Sekunden sendet die Anwendung ein \"Minute zugesehen\" Ereignis an den Kanal, dem gerade zugesehen wird.\nDies reicht aus, um den Drop voranzutreiben. Auf diese Weise ist es nicht nötig den Stream herunterzuladen und spart Bandbreite.\nUm den Online- oder Offline-Status der Kanäle aktuell zu halten, wird eine Websocket-Verbindung eingerichtet,\ndie die Kanäle auf ihren Status überprüft.", + "getting_started": "Erste Schritte", + "getting_started_text": "• In der Anwendung anmelden.\n• Stelle sicher, dass das Twitch-Konto mit allen Kampagnen verknüpft ist, an denen Interesse besteht.\n• Sollen alle Drops bearbeitet werden, entferne den Haken bei \"Nur Priorität\" und drücke \"Neu laden\".\n• Sollen nur bestimmte Spiele in betracht gezogen werden, verwende die \"Priorität\" Liste um die Wahl nach Spielen einzugrenzen.\n• Die Liste priorisiert von oben nach unten.\n• Die Option \"Nur Priorität\" verhindert, dass Spiele, die nicht auf der Prioritätenliste stehen, bearbeitet werden.\n• Mit der Liste \"Ausschließen\", ist es möglich Spiele zu filtern, die niemals in betracht gezogen werden sollen.\n• Wenn Listen oder Optionen angepasst wurden, muss \"Neu laden\" gedrückt werden, damit die Änderungen übernommen werden." + } + } +} diff --git "a/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" "b/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" index ab666749..96350941 100644 --- "a/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" +++ "b/lang/\320\240\321\203\321\201\321\201\320\272\320\270\320\271.json" @@ -1,162 +1,162 @@ -{ - "english_name": "Russian", - "status": { - "terminated": "\nПриложение остановлено.\nЗакройте окно, чтобы выйти из приложения.", - "watching": "Просмотр канала: {channel}", - "goes_online": "Изменение: {channel} онлайн", - "goes_offline": "Изменение: {channel} онлайн", - "claimed_drop": "Drop получено: {drop}", - "claimed_points": "Получены очки канала: {points}", - "earned_points": "За просмотр начисляются очки канала: {points} | Сумма: {balance}", - "no_channel": "Нет участвующих каналов онлайн. Ожидание каналов...", - "no_campaign": "Нет участвующих кампаний онлайн. Ожидание кампаний..." - }, - "login": { - "chrome": { - "startup": "Запуск Браузера...", - "login_to_complete": "Нажмите Log In еще раз, чтобы завершить процесс входа в систему вручную..", - "no_token": "Не найден токен авторизации.", - "closed_window": "Окно Браузера было закрыто до завершения процесса входа в систему." - }, - "error_code": "Код ошибки входа в систему: {error_code}", - "unexpected_content": "Возвращен неожиданный тип содержимого, обычно из-за перенаправления. Требуется ли логин для доступа в Интернет?", - "incorrect_login_pass": "Неправильное имя пользователя или пароль.", - "incorrect_email_code": "Неправильный код электронной почты.", - "incorrect_twofa_code": "Неправильный код 2FA.", - "email_code_required": "Требуется код электронной почты. Пожалуйста, проверьте электронную почту.", - "twofa_code_required": "Требуется код 2FA." - }, - "error": { - "captcha": "Попытка входа в систему была отклонена CAPTCHA.\nПожалуйста, повторите попытку не менее чем через 12 часов.", - "site_down": "Twitch недоступен. Повторите попытку через {seconds} секунд...", - "no_connection": "Невозможно подключиться к Twitch. Повторите попытку через {seconds} секунд..." - }, - "gui": { - "output": "Протокол", - "status": { - "name": "Статус", - "idle": "Вхолостую", - "exiting": "Выход...", - "terminated": "Прекращено", - "cleanup": "Очистка каналов...", - "gathering": "Поиск каналов...", - "switching": "Переключение канала...", - "fetching_inventory": "Получение инвентаря...", - "fetching_campaigns": "Получение кампаний...", - "adding_campaigns": "Добавление кампаний в инвентарь... {counter}" - }, - "tabs": { - "main": "Главная", - "inventory": "Инвентарь", - "settings": "Настройки", - "help": "Помощь" - }, - "tray": { - "notification_title": "Drop получено", - "minimize": "Свернуть в трей", - "show": "Показать", - "quit": "Закрыть" - }, - "login": { - "name": "Авторизация", - "labels": "Статус:\nID пользователя:", - "logged_in": "Авторизован", - "logged_out": "не авторизован", - "logging_in": "Авторизация...", - "required": "Требуется авторизация", - "request": "Пожалуйста, авторизуйтесь, чтобы продолжить.", - "username": "Имя пользователя", - "password": "Пароль", - "twofa_code": "2FA код (опционально)", - "button": "Войти" - }, - "websocket": { - "name": "WebSocket статус", - "websocket": "WebSocket #{id}:", - "initializing": "Инициализация...", - "connected": "Подключено", - "disconnected": "Отключено", - "connecting": "Подключение...", - "disconnecting": "Отключение...", - "reconnecting": "Переподключение..." - }, - "progress": { - "name": "Ход кампании", - "drop": "Drop:", - "game": "Игра:", - "campaign": "Кампания:", - "remaining": "{time} осталось", - "drop_progress": "Прогресс:", - "campaign_progress": "Прогресс:" - }, - "channels": { - "name": "Каналы", - "switch": "Изменить", - "load_points": "Загрузить баллы", - "online": "ОНЛАЙН ✔", - "pending": "ОЖИДАНИЕ ⏳", - "offline": "ОФЛАЙН ❌", - "headings": { - "channel": "Канал", - "status": "Статус", - "game": "Игра", - "viewers": "Зрители", - "points": "Баллы" - } - }, - "inventory": { - "filter": { - "name": "Фильтр", - "show": "Показать:", - "not_linked": "Не связано", - "upcoming": "Будущие", - "expired": "Прошедшие", - "excluded": "Исключенные", - "finished": "Оконченные", - "refresh": "Обновить" - }, - "status": { - "linked": "Связанное ✔", - "not_linked": "Не связанное ❌", - "active": "Активное ✔", - "upcoming": "Будущее ⏳", - "expired": "Прошедшее ❌", - "claimed": "Получено ✔", - "ready_to_claim": "Готово к получению⏳" - }, - "starts": "Начало: {time}", - "ends": "Окончание: {time}", - "allowed_channels": "Участвующие каналы:", - "all_channels": "Все", - "and_more": "и еще {amount}...", - "percent_progress": "{percent} от {minutes} минут", - "minutes_progress": "{minutes} минут" - }, - "settings": { - "general": { - "name": "Общие", - "autostart": "Автозапуск", - "tray": "Автозапуск свёрнутым", - "tray_notifications": "Всплывающие уведомления", - "priority_only": "Только приоритет", - "proxy": "Прокси (Требуется перезапуск):" - }, - "game_name": "Игра", - "priority": "Приоритет", - "exclude": "Исключения", - "reload": "Перезагрузить", - "reload_text": "Большинство изменений требуют перезагрузки, чтобы вступить в силу немедленно: " - }, - "help": { - "links": { - "name": "Полезные ссылки", - "inventory": "Инвентарь Twitch", - "campaigns": "Все кампании Twitch" - }, - "how_it_works": "Как это работает?", - "how_it_works_text": "Каждые ~60 секунд приложение отправляет событие \"минутный просмотр\" на просматриваемый канал. \nЭтого достаточно, чтобы получить Drop. Таким образом, нет необходимости скачивать поток, что экономит трафик. \nДля поддержания актуального состояния каналов в режиме онлайн или офлайн устанавливается соединение websocket, которое проверяет состояние каналов.", - "getting_started": "Первые шаги", - "getting_started_text": "• Войдите в приложение.\n• Убедитесь, что аккаунт Twitch связан со всеми кампаниями, к которым есть интерес.\n• Если вы хотите редактировать все Drops, снимите флажок \"Только приоритет\" и нажмите \"Перезагрузить\".\n• Если необходимо смотреть только определенные игры, используйте список \"Приоритет\", чтобы сузить выбор игр.\n• В списке приоритеты расставлены сверху вниз.\n• Опция \"Только приоритет\" предотвращает просмотр игр, не входящих в список приоритетов.\n• С помощью списка \"Исключения\" можно отфильтровать игры, которые не должны рассматриваться.\n• Если списки или опции были изменены, нажмите \"Перезагрузить\", чтобы изменения были применены." - } - } -} +{ + "english_name": "Russian", + "status": { + "terminated": "\nПриложение остановлено.\nЗакройте окно, чтобы выйти из приложения.", + "watching": "Просмотр канала: {channel}", + "goes_online": "Изменение: {channel} онлайн", + "goes_offline": "Изменение: {channel} онлайн", + "claimed_drop": "Drop получено: {drop}", + "claimed_points": "Получены очки канала: {points}", + "earned_points": "За просмотр начисляются очки канала: {points} | Сумма: {balance}", + "no_channel": "Нет участвующих каналов онлайн. Ожидание каналов...", + "no_campaign": "Нет участвующих кампаний онлайн. Ожидание кампаний..." + }, + "login": { + "chrome": { + "startup": "Запуск Браузера...", + "login_to_complete": "Нажмите Log In еще раз, чтобы завершить процесс входа в систему вручную..", + "no_token": "Не найден токен авторизации.", + "closed_window": "Окно Браузера было закрыто до завершения процесса входа в систему." + }, + "error_code": "Код ошибки входа в систему: {error_code}", + "unexpected_content": "Возвращен неожиданный тип содержимого, обычно из-за перенаправления. Требуется ли логин для доступа в Интернет?", + "incorrect_login_pass": "Неправильное имя пользователя или пароль.", + "incorrect_email_code": "Неправильный код электронной почты.", + "incorrect_twofa_code": "Неправильный код 2FA.", + "email_code_required": "Требуется код электронной почты. Пожалуйста, проверьте электронную почту.", + "twofa_code_required": "Требуется код 2FA." + }, + "error": { + "captcha": "Попытка входа в систему была отклонена CAPTCHA.\nПожалуйста, повторите попытку не менее чем через 12 часов.", + "site_down": "Twitch недоступен. Повторите попытку через {seconds} секунд...", + "no_connection": "Невозможно подключиться к Twitch. Повторите попытку через {seconds} секунд..." + }, + "gui": { + "output": "Протокол", + "status": { + "name": "Статус", + "idle": "Вхолостую", + "exiting": "Выход...", + "terminated": "Прекращено", + "cleanup": "Очистка каналов...", + "gathering": "Поиск каналов...", + "switching": "Переключение канала...", + "fetching_inventory": "Получение инвентаря...", + "fetching_campaigns": "Получение кампаний...", + "adding_campaigns": "Добавление кампаний в инвентарь... {counter}" + }, + "tabs": { + "main": "Главная", + "inventory": "Инвентарь", + "settings": "Настройки", + "help": "Помощь" + }, + "tray": { + "notification_title": "Drop получено", + "minimize": "Свернуть в трей", + "show": "Показать", + "quit": "Закрыть" + }, + "login": { + "name": "Авторизация", + "labels": "Статус:\nID пользователя:", + "logged_in": "Авторизован", + "logged_out": "не авторизован", + "logging_in": "Авторизация...", + "required": "Требуется авторизация", + "request": "Пожалуйста, авторизуйтесь, чтобы продолжить.", + "username": "Имя пользователя", + "password": "Пароль", + "twofa_code": "2FA код (опционально)", + "button": "Войти" + }, + "websocket": { + "name": "WebSocket статус", + "websocket": "WebSocket #{id}:", + "initializing": "Инициализация...", + "connected": "Подключено", + "disconnected": "Отключено", + "connecting": "Подключение...", + "disconnecting": "Отключение...", + "reconnecting": "Переподключение..." + }, + "progress": { + "name": "Ход кампании", + "drop": "Drop:", + "game": "Игра:", + "campaign": "Кампания:", + "remaining": "{time} осталось", + "drop_progress": "Прогресс:", + "campaign_progress": "Прогресс:" + }, + "channels": { + "name": "Каналы", + "switch": "Изменить", + "load_points": "Загрузить баллы", + "online": "ОНЛАЙН ✔", + "pending": "ОЖИДАНИЕ ⏳", + "offline": "ОФЛАЙН ❌", + "headings": { + "channel": "Канал", + "status": "Статус", + "game": "Игра", + "viewers": "Зрители", + "points": "Баллы" + } + }, + "inventory": { + "filter": { + "name": "Фильтр", + "show": "Показать:", + "not_linked": "Не связано", + "upcoming": "Будущие", + "expired": "Прошедшие", + "excluded": "Исключенные", + "finished": "Оконченные", + "refresh": "Обновить" + }, + "status": { + "linked": "Связанное ✔", + "not_linked": "Не связанное ❌", + "active": "Активное ✔", + "upcoming": "Будущее ⏳", + "expired": "Прошедшее ❌", + "claimed": "Получено ✔", + "ready_to_claim": "Готово к получению⏳" + }, + "starts": "Начало: {time}", + "ends": "Окончание: {time}", + "allowed_channels": "Участвующие каналы:", + "all_channels": "Все", + "and_more": "и еще {amount}...", + "percent_progress": "{percent} от {minutes} минут", + "minutes_progress": "{minutes} минут" + }, + "settings": { + "general": { + "name": "Общие", + "autostart": "Автозапуск", + "tray": "Автозапуск свёрнутым", + "tray_notifications": "Всплывающие уведомления", + "priority_only": "Только приоритет", + "proxy": "Прокси (Требуется перезапуск):" + }, + "game_name": "Игра", + "priority": "Приоритет", + "exclude": "Исключения", + "reload": "Перезагрузить", + "reload_text": "Большинство изменений требуют перезагрузки, чтобы вступить в силу немедленно: " + }, + "help": { + "links": { + "name": "Полезные ссылки", + "inventory": "Инвентарь Twitch", + "campaigns": "Все кампании Twitch" + }, + "how_it_works": "Как это работает?", + "how_it_works_text": "Каждые ~60 секунд приложение отправляет событие \"минутный просмотр\" на просматриваемый канал. \nЭтого достаточно, чтобы получить Drop. Таким образом, нет необходимости скачивать поток, что экономит трафик. \nДля поддержания актуального состояния каналов в режиме онлайн или офлайн устанавливается соединение websocket, которое проверяет состояние каналов.", + "getting_started": "Первые шаги", + "getting_started_text": "• Войдите в приложение.\n• Убедитесь, что аккаунт Twitch связан со всеми кампаниями, к которым есть интерес.\n• Если вы хотите редактировать все Drops, снимите флажок \"Только приоритет\" и нажмите \"Перезагрузить\".\n• Если необходимо смотреть только определенные игры, используйте список \"Приоритет\", чтобы сузить выбор игр.\n• В списке приоритеты расставлены сверху вниз.\n• Опция \"Только приоритет\" предотвращает просмотр игр, не входящих в список приоритетов.\n• С помощью списка \"Исключения\" можно отфильтровать игры, которые не должны рассматриваться.\n• Если списки или опции были изменены, нажмите \"Перезагрузить\", чтобы изменения были применены." + } + } +}