diff options
Diffstat (limited to 'desktop')
67 files changed, 1667 insertions, 522 deletions
diff --git a/desktop/README.md b/desktop/README.md index 97d0fd30..4a59fe03 100644 --- a/desktop/README.md +++ b/desktop/README.md @@ -5,7 +5,7 @@ Start by getting the source code and changing to the `desktop` folder: ```sh -git clone https://github.com/micahflee/onionshare.git +git clone https://github.com/onionshare/onionshare.git cd onionshare/desktop ``` @@ -15,6 +15,8 @@ cd onionshare/desktop If you're using Linux, install `tor` and `obfs4proxy` from either the [official Debian repository](https://support.torproject.org/apt/tor-deb-repo/), or from your package manager. +In Ubuntu 20.04 you also need the `libxcb-xinerama0` package installed. + #### macOS Download and install Python 3.8.6 from https://www.python.org/downloads/release/python-386/. I downloaded `python-3.8.6-macosx10.9.pkg`. (You may need to also run `/Applications/Python\ 3.8/Install\ Certificates.command`.) diff --git a/desktop/package/linux/build-appimage.py b/desktop/package/linux/build-appimage.py index 73164b55..dfaba1b4 100755 --- a/desktop/package/linux/build-appimage.py +++ b/desktop/package/linux/build-appimage.py @@ -2,7 +2,6 @@ import os import inspect import subprocess -import argparse import shutil import glob @@ -44,4 +43,4 @@ def main(): if __name__ == "__main__": - main()
\ No newline at end of file + main() diff --git a/desktop/package/macos/build.py b/desktop/package/macos/build.py index ea1e90c9..2bfea3ad 100755 --- a/desktop/package/macos/build.py +++ b/desktop/package/macos/build.py @@ -67,7 +67,7 @@ def main(): print("○ Create app bundle") run(["briefcase", "create"], desktop_dir) - app_path = os.path.join(desktop_dir, "macOS", "OnionShare", "OnionShare.app") + app_path = os.path.join(desktop_dir, "macOS", "app", "OnionShare", "OnionShare.app") print("○ Delete unused Qt5 frameworks from app bundle") for framework in [ @@ -212,7 +212,6 @@ def main(): f"{app_path}/Contents/Resources/app_packages/PySide2/pyside2-lupdate", f"{app_path}/Contents/Resources/app_packages/PySide2/rcc", f"{app_path}/Contents/Resources/app_packages/PySide2/uic", - f"{app_path}/Contents/Resources/Support/bin/python3", app_path, ], ): diff --git a/desktop/package/windows/build.py b/desktop/package/windows/build.py index 59929070..bbccbe46 100644 --- a/desktop/package/windows/build.py +++ b/desktop/package/windows/build.py @@ -2,7 +2,6 @@ import os import inspect import subprocess -import argparse import shutil import glob @@ -197,6 +196,7 @@ def main(): os.path.join( desktop_dir, "windows", + "msi", "OnionShare", "src", "app_packages", @@ -212,7 +212,7 @@ def main(): ] print(f"○ Created unsigned installer: {msi_filename}") - print(f"○ Signing installer") + print("○ Signing installer") run( [ "signtool.exe", diff --git a/desktop/pyproject.toml b/desktop/pyproject.toml index de52b2cd..fdb820b4 100644 --- a/desktop/pyproject.toml +++ b/desktop/pyproject.toml @@ -1,7 +1,7 @@ [tool.briefcase] project_name = "OnionShare" bundle = "org.onionshare" -version = "2.3.1" +version = "2.3.3" url = "https://onionshare.org" license = "GPLv3" author = 'Micah Lee' @@ -13,7 +13,7 @@ description = "Securely and anonymously share files, host websites, and chat wit icon = "src/onionshare/resources/onionshare" sources = ['src/onionshare'] requires = [ - "./onionshare_cli-2.3.1-py3-none-any.whl", + "./onionshare_cli-2.3.3-py3-none-any.whl", "pyside2==5.15.1", "qrcode" ] diff --git a/desktop/scripts/check_lacked_trans.py b/desktop/scripts/check_lacked_trans.py index 965b103b..2456c995 100755 --- a/desktop/scripts/check_lacked_trans.py +++ b/desktop/scripts/check_lacked_trans.py @@ -105,11 +105,10 @@ def main(): if src[quote_i] == '"': quote = '"' break - elif src[quote_i] == "'": + if src[quote_i] == "'": quote = "'" break - else: - inc += 1 + inc += 1 # find the starting quote starting_i = src.find(quote, starting_i) diff --git a/desktop/scripts/get-tor-osx.py b/desktop/scripts/get-tor-osx.py index bf0cb5bc..a62703c8 100755 --- a/desktop/scripts/get-tor-osx.py +++ b/desktop/scripts/get-tor-osx.py @@ -24,23 +24,20 @@ This script downloads a pre-built tor binary to bundle with OnionShare. In order to avoid a Mac gnupg dependency, I manually verify the signature and hard-code the sha256 hash. """ - import inspect import os import sys import hashlib -import zipfile -import io import shutil import subprocess import requests def main(): - dmg_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0.10/TorBrowser-10.0.10-osx64_en-US.dmg" - dmg_filename = "TorBrowser-10.0.10-osx64_en-US.dmg" + dmg_url = "https://dist.torproject.org/torbrowser/10.5.5/TorBrowser-10.5.5-osx64_en-US.dmg" + dmg_filename = "TorBrowser-10.0.18-osx64_en-US.dmg" expected_dmg_sha256 = ( - "7ed73e94ccdfab76b8d96ddbac7828d3a7c77dd73b54c34e55666f3b6274d12a" + "f93d2174c58309d1d563deb3616fc3aec689b6eb0af4d70661b1695c26fc2af7" ) # Build paths diff --git a/desktop/scripts/get-tor-windows.py b/desktop/scripts/get-tor-windows.py index 9cb8898c..92dfb540 100644 --- a/desktop/scripts/get-tor-windows.py +++ b/desktop/scripts/get-tor-windows.py @@ -23,7 +23,6 @@ This script downloads a pre-built tor binary to bundle with OnionShare. In order to avoid a Windows gnupg dependency, I manually verify the signature and hard-code the sha256 hash. """ - import inspect import os import sys @@ -34,10 +33,10 @@ import requests def main(): - exe_url = "https://archive.torproject.org/tor-package-archive/torbrowser/10.0.10/torbrowser-install-10.0.10_en-US.exe" - exe_filename = "torbrowser-install-10.0.10_en-US.exe" + exe_url = "https://dist.torproject.org/torbrowser/10.5.5/torbrowser-install-10.5.5_en-US.exe" + exe_filename = "torbrowser-install-10.5.5_en-US.exe" expected_exe_sha256 = ( - "6cbd14a7232e4ae7f2718d9b7f377e1a7bb96506da21f1ac6f689a22fc5e53fe" + "5a0248f6be61e94467fd6f951eb85d653138dea5a8793de42c6edad1507f1ae7" ) # Build paths root_path = os.path.dirname( @@ -75,7 +74,7 @@ def main(): "e", "-y", exe_path, - "Browser\TorBrowser\Tor", + "Browser\\TorBrowser\\Tor", "-o%s" % os.path.join(working_path, "Tor"), ] ).wait() @@ -85,7 +84,7 @@ def main(): "e", "-y", exe_path, - "Browser\TorBrowser\Data\Tor\geoip*", + "Browser\\TorBrowser\\Data\\Tor\\geoip*", "-o%s" % os.path.join(working_path, "Data"), ] ).wait() diff --git a/desktop/scripts/rebuild-cli.py b/desktop/scripts/rebuild-cli.py index c13461bc..66582cf1 100755 --- a/desktop/scripts/rebuild-cli.py +++ b/desktop/scripts/rebuild-cli.py @@ -6,7 +6,6 @@ and installs it in the virtual environment. import inspect import os -import sys import glob import subprocess import shutil diff --git a/desktop/src/onionshare/__init__.py b/desktop/src/onionshare/__init__.py index 744f6979..9d8d8981 100644 --- a/desktop/src/onionshare/__init__.py +++ b/desktop/src/onionshare/__init__.py @@ -21,7 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. from __future__ import division import os import sys -import platform import argparse import signal import json @@ -29,7 +28,11 @@ import psutil import getpass from PySide2 import QtCore, QtWidgets, QtGui +from PySide2.QtCore import Slot,Qt +from PySide2.QtGui import QPalette, QColor + from onionshare_cli.common import Common +from onionshare_cli.settings import Settings from .gui_common import GuiCommon from .widgets import Alert @@ -48,7 +51,12 @@ class Application(QtWidgets.QApplication): QtWidgets.QApplication.__init__(self, sys.argv) # Check color mode on starting the app - self.color_mode = self.get_color_mode() + self.color_mode = self.get_color_mode(common) + + # Enable Dark Theme + if self.color_mode == "dark": + self.setDarkMode() + self.installEventFilter(self) def eventFilter(self, obj, event): @@ -66,23 +74,48 @@ class Application(QtWidgets.QApplication): return False return True - def get_color_mode(self): - return "dark" if self.is_dark_mode() else "light" - + def setDarkMode(self): + self.setStyle("Fusion") + dark_palette = QPalette() + dark_palette.setColor(QPalette.Window, QColor(53, 53, 53)) + dark_palette.setColor(QPalette.WindowText, Qt.white) + dark_palette.setColor(QPalette.Base, QColor(25, 25, 25)) + dark_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53)) + dark_palette.setColor(QPalette.ToolTipBase, Qt.white) + dark_palette.setColor(QPalette.ToolTipText, Qt.white) + dark_palette.setColor(QPalette.Text, Qt.white) + dark_palette.setColor(QPalette.Button, QColor(53, 53, 53)) + dark_palette.setColor(QPalette.ButtonText, Qt.white) + dark_palette.setColor(QPalette.BrightText, Qt.red) + dark_palette.setColor(QPalette.Link, QColor(42, 130, 218)) + dark_palette.setColor(QPalette.Highlight, QColor(42, 130, 218)) + dark_palette.setColor(QPalette.HighlightedText, Qt.black) + self.setPalette(dark_palette) + self.setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }") + + def get_color_mode(self, common): + curr_settings = Settings(common) + curr_settings.load() + current_theme = curr_settings.get("theme") + + if current_theme == 1: + return "light" + elif current_theme == 2: + return "dark" + else: + return "dark" if self.is_dark_mode() else "light" def main(): """ The main() function implements all of the logic that the GUI version of onionshare uses. """ common = Common() + common.display_banner() # Required for macOS Big Sur: https://stackoverflow.com/a/64878899 if common.platform == "Darwin": os.environ["QT_MAC_WANTS_LAYER"] = "1" - # Display OnionShare banner - print(f"OnionShare {common.version} | https://onionshare.org/") - # Start the Qt app global qtapp qtapp = Application(common) diff --git a/desktop/src/onionshare/gui_common.py b/desktop/src/onionshare/gui_common.py index cd576ea2..182d63f2 100644 --- a/desktop/src/onionshare/gui_common.py +++ b/desktop/src/onionshare/gui_common.py @@ -19,7 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. """ import os -import inspect import shutil from pkg_resources import resource_filename @@ -85,10 +84,25 @@ class GuiCommon: header_color = "#4E064F" # purple in light title_color = "#333333" # dark gray color in main window stop_button_color = "#d0011b" # red button color for stopping server + new_tab_button_background = "#ffffff" + new_tab_button_border = "#efeff0" + new_tab_button_text_color = "#4e0d4e" + downloads_uploads_progress_bar_border_color = "#4E064F" + downloads_uploads_progress_bar_chunk_color = "#4E064F" + share_zip_progess_bar_border_color = "#4E064F" + share_zip_progess_bar_chunk_color = "#4E064F" + history_background_color = "#ffffff" + history_label_color = "#000000" if color_mode == "dark": header_color = "#F2F2F2" title_color = "#F2F2F2" stop_button_color = "#C32F2F" + new_tab_button_background = "#5F5F5F" + new_tab_button_border = "#878787" + new_tab_button_text_color = "#FFFFFF" + share_zip_progess_bar_border_color = "#F2F2F2" + history_background_color = "#191919" + history_label_color = "#ffffff" return { # OnionShareGui styles @@ -188,9 +202,17 @@ class GuiCommon: border: 0; border-radius: 5px; }""", + "downloads_uploads_not_empty": """ + QWidget{ + background-color: """ + + history_background_color + +"""; + }""", "downloads_uploads_empty": """ QWidget { - background-color: #ffffff; + background-color: """ + + history_background_color + +"""; border: 1px solid #999999; } QWidget QLabel { @@ -228,7 +250,7 @@ class GuiCommon: "downloads_uploads_progress_bar": """ QProgressBar { border: 1px solid """ - + header_color + + downloads_uploads_progress_bar_border_color + """; background-color: #ffffff !important; text-align: center; @@ -237,10 +259,16 @@ class GuiCommon: } QProgressBar::chunk { background-color: """ - + header_color + + downloads_uploads_progress_bar_chunk_color + """; width: 10px; }""", + "history_default_label" : """ + QLabel { + color: """ + + history_label_color + + """; + }""", "history_individual_file_timestamp_label": """ QLabel { color: #666666; @@ -262,11 +290,17 @@ class GuiCommon: """, "new_tab_button_text": """ QLabel { - border: 1px solid #efeff0; + border: 1px solid """ + + new_tab_button_border + + """; border-radius: 4px; - background-color: #ffffff; + background-color: """ + + new_tab_button_background + + """; text-align: center; - color: #4e0d4e; + color: """ + + new_tab_button_text_color + + """; } """, "new_tab_title_text": """ @@ -287,7 +321,7 @@ class GuiCommon: "share_zip_progess_bar": """ QProgressBar { border: 1px solid """ - + header_color + + share_zip_progess_bar_border_color + """; background-color: #ffffff !important; text-align: center; @@ -296,7 +330,7 @@ class GuiCommon: QProgressBar::chunk { border: 0px; background-color: """ - + header_color + + share_zip_progess_bar_chunk_color + """; width: 10px; }""", @@ -354,6 +388,10 @@ class GuiCommon: color: #666666; font-size: 11px; }""", + "receive_message_button": """ + QPushButton { + padding: 5px 10px; + }""", # Settings dialog "settings_version": """ QLabel { @@ -391,7 +429,7 @@ class GuiCommon: elif self.common.platform == "Darwin": base_path = self.get_resource_path("tor") tor_path = os.path.join(base_path, "tor") - obfs4proxy_file_path = os.path.join(base_path, "obfs4proxy.exe") + obfs4proxy_file_path = os.path.join(base_path, "obfs4proxy") tor_geo_ip_file_path = os.path.join(base_path, "geoip") tor_geo_ipv6_file_path = os.path.join(base_path, "geoip6") elif self.common.platform == "BSD": diff --git a/desktop/src/onionshare/main_window.py b/desktop/src/onionshare/main_window.py index 2f6e91d0..d87092b6 100644 --- a/desktop/src/onionshare/main_window.py +++ b/desktop/src/onionshare/main_window.py @@ -21,8 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. import time from PySide2 import QtCore, QtWidgets, QtGui -from onionshare_cli.web import Web - from . import strings from .tor_connection_dialog import TorConnectionDialog from .settings_dialog import SettingsDialog diff --git a/desktop/src/onionshare/resources/images/open_message.png b/desktop/src/onionshare/resources/images/open_message.png Binary files differnew file mode 100644 index 00000000..6712ecf9 --- /dev/null +++ b/desktop/src/onionshare/resources/images/open_message.png diff --git a/desktop/src/onionshare/resources/locale/bn.json b/desktop/src/onionshare/resources/locale/bn.json index 98728896..519ed878 100644 --- a/desktop/src/onionshare/resources/locale/bn.json +++ b/desktop/src/onionshare/resources/locale/bn.json @@ -279,11 +279,20 @@ "gui_receive_flatpak_data_dir": "যেহেতু অনিওনশেয়ার ফ্ল্যাটপ্যাক দিয়ে ইন্সটল করেছো, তাই তোমাকে ~/OnionShare এ ফাইল সংরক্ষণ করতে হবে।", "gui_rendezvous_cleanup": "তোমার ফাইলগুলি সফলভাবে স্থানান্তরিত হয়েছে তা নিশ্চিত হয়ে টর সার্কিট বন্ধের অপেক্ষা করা হচ্ছে।\n\nএটি কয়েক মিনিট সময় নিতে পারে।", "gui_open_folder_error": "xdg-open দিয়ে ফোল্ডার খুলতে ব্যর্থ হয়েছে। ফাইলটি এখানে: {}", - "gui_chat_url_description": "এই পেঁয়াজশেয়ার ঠিকানা দিয়ে <b>যে কেউ</b> <b>টর ব্রাউজার</b>: <img src='{}' /> ব্যবহার করে এই <b>চ্যাট রুমটিতে যোগ দিতে পারে</b>", + "gui_chat_url_description": "এই অনিওনশেয়ার ঠিকানা দিয়ে <b>যে কেউ</b> <b>টর ব্রাউজার</b>: <img src='{}' /> ব্যবহার করে এই <b>চ্যাট রুমটিতে যোগ দিতে পারে</b>", "error_port_not_available": "অনিয়নশায়ার পোর্ট নেই", "gui_rendezvous_cleanup_quit_early": "তাড়াতাড়ি বন্ধ করো", "gui_main_page_chat_button": "চ্যাটিং শুরু করো", "gui_main_page_website_button": "হোস্টিং শুরু করো", "gui_main_page_receive_button": "গ্রহণ শুরু করো", - "gui_color_mode_changed_notice": "নতুন রঙের মোড প্রয়োগ করার জন্য OnionShare পুনরারম্ভ করুন।" + "gui_color_mode_changed_notice": "নতুন রঙের মোড প্রয়োগ করার জন্য OnionShare পুনরারম্ভ করুন।", + "history_receive_read_message_button": "বার্তা পড়ুন", + "mode_settings_receive_webhook_url_checkbox": "বিজ্ঞপ্তি ওয়েবহুক ব্যবহার করুন", + "mode_settings_receive_disable_files_checkbox": "ফাইল আপলোড করা অক্ষম করুন", + "mode_settings_receive_disable_text_checkbox": "পাঠ্য জমা দেওয়া অক্ষম করুন", + "mode_settings_title_label": "কাস্টম শিরোনাম", + "gui_status_indicator_chat_started": "চ্যাট করছে", + "gui_status_indicator_chat_scheduled": "শিডিউল করা হয়েছে…", + "gui_status_indicator_chat_working": "শুরু…", + "gui_status_indicator_chat_stopped": "চ্যাট করতে প্রস্তুত" } diff --git a/desktop/src/onionshare/resources/locale/da.json b/desktop/src/onionshare/resources/locale/da.json index 383b3d33..4bbdc94e 100644 --- a/desktop/src/onionshare/resources/locale/da.json +++ b/desktop/src/onionshare/resources/locale/da.json @@ -291,5 +291,15 @@ "gui_chat_url_description": "<b>Alle</b> med denne OnionShare-adresse kan <b>deltage i chatrummet</b> med <b>Tor Browser</b>: <img src='{}' />", "error_port_not_available": "OnionShare-port ikke tilgængelig", "gui_rendezvous_cleanup": "Venter på at Tor-kredsløb lukker for at være sikker på, at det lykkedes at overføre dine filer.\n\nDet kan tage noget tid.", - "gui_rendezvous_cleanup_quit_early": "Afslut tidligt" + "gui_rendezvous_cleanup_quit_early": "Afslut tidligt", + "history_receive_read_message_button": "Læs meddelelse", + "mode_settings_receive_webhook_url_checkbox": "Brug underretningswebhook", + "mode_settings_receive_disable_files_checkbox": "Deaktivér upload af filer", + "mode_settings_receive_disable_text_checkbox": "Deaktivér indsendelse af tekst", + "mode_settings_title_label": "Tilpasset titel", + "gui_color_mode_changed_notice": "Genstart OnionShare for at anvende den nye farvetilstand.", + "gui_status_indicator_chat_started": "Chatter", + "gui_status_indicator_chat_scheduled": "Planlagt …", + "gui_status_indicator_chat_working": "Starter …", + "gui_status_indicator_chat_stopped": "Klar til at chatte" } diff --git a/desktop/src/onionshare/resources/locale/de.json b/desktop/src/onionshare/resources/locale/de.json index 4f4a3c32..4f04dd5b 100644 --- a/desktop/src/onionshare/resources/locale/de.json +++ b/desktop/src/onionshare/resources/locale/de.json @@ -5,7 +5,7 @@ "not_a_file": "{0:s} ist keine gültige Datei.", "other_page_loaded": "Daten geladen", "closing_automatically": "Gestoppt, da die Übertragung erfolgreich beendet wurde", - "large_filesize": "Achtung: Das Senden von großen Dateien kann sehr lange dauern", + "large_filesize": "Achtung: Das Senden von großen Dateien kann Stunden dauern", "help_local_only": "Tor nicht verwenden (nur für Entwicklung)", "help_stay_open": "Den Server weiterlaufen lassen, nachdem die Dateien verschickt wurden", "help_verbose": "Schreibe Fehler von OnionShare nach stdout und Webfehler auf die Festplatte", @@ -295,5 +295,14 @@ "error_port_not_available": "OnionShare-Port nicht verfügbar", "gui_rendezvous_cleanup": "Warte darauf, dass alle Tor-Verbindungen beendet wurden, um den vollständigen Dateitransfer sicherzustellen.\n\nDies kann einige Minuten dauern.", "gui_rendezvous_cleanup_quit_early": "Vorzeitig beenden", - "gui_color_mode_changed_notice": "Starte OnionShare neu, damit der neue Farbmodus übernommen wird." -} + "gui_color_mode_changed_notice": "OnionShare neustarten um den neuen Farbmodus zu aktivieren.", + "history_receive_read_message_button": "Nachricht gelesen", + "mode_settings_receive_webhook_url_checkbox": "Benutze Benachrichtigungs-WebHook", + "mode_settings_receive_disable_files_checkbox": "Datei-Übermittlung deaktivieren", + "mode_settings_receive_disable_text_checkbox": "Text-Übermittlung deaktivieren", + "mode_settings_title_label": "Benutzerdefinierter Titel", + "gui_status_indicator_chat_started": "Chatted", + "gui_status_indicator_chat_scheduled": "Geplant…", + "gui_status_indicator_chat_working": "Startet…", + "gui_status_indicator_chat_stopped": "Bereit zum Chatten" +}
\ No newline at end of file diff --git a/desktop/src/onionshare/resources/locale/el.json b/desktop/src/onionshare/resources/locale/el.json index 20ae6323..173982a4 100644 --- a/desktop/src/onionshare/resources/locale/el.json +++ b/desktop/src/onionshare/resources/locale/el.json @@ -10,7 +10,7 @@ "not_a_readable_file": "Το {0:s} δεν είναι αναγνώσιμο αρχείο.", "no_available_port": "Δεν βρέθηκε διαθέσιμη θύρα για να ξεκινήσει η υπηρεσία onion", "other_page_loaded": "Η διεύθυνση φορτώθηκε", - "close_on_autostop_timer": "Τερματίστηκε λόγω της αυτόματης διακοπής", + "close_on_autostop_timer": "Τερματίστηκε λόγω αυτόματης διακοπής", "closing_automatically": "Τερματίστηκε λόγω ολοκλήρωσης της λήψης", "timeout_download_still_running": "Αναμονή ολοκλήρωσης της λήψης", "large_filesize": "Προειδοποίηση: Η αποστολή μεγάλου όγκου δεδομένων μπορεί να διαρκέσει ώρες", @@ -39,8 +39,8 @@ "gui_share_stop_server": "Τερματισμός διαμοιρασμού", "gui_share_stop_server_autostop_timer": "Διακοπή διαμοιρασμού ({})", "gui_share_stop_server_autostop_timer_tooltip": "Το χρονόμετρο αυτόματου τερματισμού τελειώνει σε {}", - "gui_receive_start_server": "Εκκίνηση κατάστασης λήψης", - "gui_receive_stop_server": "Τερματισμός κατάστασης λήψης", + "gui_receive_start_server": "Εκκίνηση λειτουργίας λήψης", + "gui_receive_stop_server": "Τερματισμός λειτουργίας λήψης", "gui_receive_stop_server_autostop_timer": "Διακοπή λειτουργίας λήψης (απομένουν {})", "gui_receive_stop_server_autostop_timer_tooltip": "Το χρονόμετρο αυτόματου τερματισμού τελειώνει σε {}", "gui_copy_url": "Αντιγραφή διεύθυνσης", @@ -49,9 +49,9 @@ "gui_no_downloads": "Καμία λήψη ως τώρα", "gui_canceled": "Ακυρώθηκε", "gui_copied_url_title": "Η διεύθυνση OnionShare αντιγράφτηκε", - "gui_copied_url": "Η διεύθυνση OnionShare αντιγράφτηκε στον πίνακα", + "gui_copied_url": "Η διεύθυνση OnionShare αντιγράφτηκε στο πρόχειρο", "gui_copied_hidservauth_title": "Το HidServAuth αντιγράφτηκε", - "gui_copied_hidservauth": "Το HidServAuth αντιγράφτηκε στον πίνακα", + "gui_copied_hidservauth": "Το HidServAuth αντιγράφτηκε στο πρόχειρο", "gui_please_wait": "Ξεκινάμε... Κάντε κλικ για ακύρωση.", "gui_download_upload_progress_complete": "%p%, {0:s} πέρασαν.", "gui_download_upload_progress_starting": "{0:s}, %p% (υπολογισμός)", @@ -62,8 +62,8 @@ "gui_receive_quit_warning": "Αυτή τη στιγμή παραλαμβάνονται αρχείων. Είστε σίγουρος/η πώς θέλετε να κλείσετε το OnionShare;", "gui_quit_warning_quit": "Έξοδος", "gui_quit_warning_dont_quit": "Ακύρωση", - "error_rate_limit": "Κάποιος/α έκανε πολλαπλές αποτυχημένες προσπάθειες να μαντέψει τον κωδικό σας. Γι' αυτό, το OnionShare σταμάτησε τον server. Ξεκινήστε πάλι το διαμοιρασμό και στείλτε στον/ην παραλήπτη/τρια μια νέα διεύθυνση για διαμοιρασμό.", - "zip_progress_bar_format": "Συμπίεση: %p%", + "error_rate_limit": "Κάποιος/α προσπάθησε να μαντέψει τον κωδικό σας πολλές φορές. Για αυτό, το OnionShare τερματίστηκε αυτόματα. Πρέπει να ξεκινήσετε πάλι τον διαμοιρασμό και να στείλετε στον/ην παραλήπτη/τρια μια νέα διεύθυνση για να διαμοιραστούν αρχεία και μηνύματα μαζί σας.", + "zip_progress_bar_format": "Γίνεται συμπίεση: %p%", "error_stealth_not_supported": "Για τη χρήση εξουσιοδότησης πελάτη, χρειάζεστε τουλάχιστον το Tor 0.2.9.1-alpha (ή τον Tor Browser 6.5) και το python3-stem 1.5.0.", "error_ephemeral_not_supported": "Το OnionShare απαιτεί τουλάχιστον το Tor 0.2.7.1 και το python3-stem 1.4.0.", "gui_settings_window_title": "Ρυθμίσεις", @@ -71,7 +71,7 @@ "gui_settings_stealth_option": "Χρήση εξουσιοδότησης πελάτη", "gui_settings_stealth_hidservauth_string": "Έχοντας αποθηκεύσει το ιδιωτικό σας κλειδί για επαναχρησιμοποίηση, μπορείτε πλέον να επιλέξετε την αντιγραφή του HidServAuth σας.", "gui_settings_autoupdate_label": "Έλεγχος για νέα έκδοση", - "gui_settings_autoupdate_option": "Ενημερώστε με όταν είναι διαθέσιμη μια νέα έκδοση", + "gui_settings_autoupdate_option": "Ενημερώστε με μόλις γίνει διαθέσιμη μια νέα έκδοση", "gui_settings_autoupdate_timestamp": "Τελευταίος έλεγχος: {}", "gui_settings_autoupdate_timestamp_never": "Ποτέ", "gui_settings_autoupdate_check_button": "Έλεγχος για νέα έκδοση", @@ -86,20 +86,20 @@ "gui_settings_connection_type_test_button": "Έλεγχος σύνδεσης με το Tor", "gui_settings_control_port_label": "Πύλη ελέγχου", "gui_settings_socket_file_label": "Αρχείο μετάβασης", - "gui_settings_socks_label": "πύλη SOCKS", + "gui_settings_socks_label": "Πύλη SOCKS", "gui_settings_authenticate_label": "Ρυθμίσεις επαλήθευσης Tor", "gui_settings_authenticate_no_auth_option": "Χωρίς επαλήθευση ή επαλήθευση με cookie", "gui_settings_authenticate_password_option": "Κωδικός", "gui_settings_password_label": "Κωδικός", - "gui_settings_tor_bridges": "Υποστήριξη Tor bridge", - "gui_settings_tor_bridges_no_bridges_radio_option": "Να μη χρησιμοποιηθούν bridges", + "gui_settings_tor_bridges": "Υποστήριξη γεφυρών Tor", + "gui_settings_tor_bridges_no_bridges_radio_option": "Να μη χρησιμοποιηθούν γέφυρες", "gui_settings_tor_bridges_obfs4_radio_option": "Να χρησιμοποιηθούν τα ενσωματωμένα obfs4 pluggable transports", - "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Να χρησιμοποιηθούν τα ενσωματωμένα obfs4 pluggable transports (απαιτείται το obfs4proxy)", + "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Να χρησιμοποιηθούν τα ενσωματωμένα obfs4 pluggable transports (απαιτείται το πρόγραμμα obfs4proxy)", "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Να χρησιμοποιηθουν τα ενσωματωμένα meek_lite (Azure) pluggable transports", - "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Να χρησιμοποιηθούν τα ενσωματωμένα meek_lite (Azure) pluggable transports (απαιτείται το obfs4proxy)", + "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Να χρησιμοποιηθούν τα ενσωματωμένα meek_lite (Azure) pluggable transports (απαιτείται το πρόγραμμα obfs4proxy)", "gui_settings_meek_lite_expensive_warning": "Προσοχή: Τα meek_lite bridges επιβαρύνουν πολύ το Tor Project στη λειτουργία. <br><br> Χρησιμοποιήστε τα μόνο αν δεν μπορείτε να συνδεθείτε κατ' ευθείαν στο Tor μέσω obfs4 transports ή άλλων κανονικών bridges.", - "gui_settings_tor_bridges_custom_radio_option": "Χρήση παραμετροποιημένων bridges", - "gui_settings_tor_bridges_custom_label": "Αποκτήστε bridges στο <a href=\"https://bridges.torproject.org/options?lang=el\"> https://bridges.torproject.org</a>", + "gui_settings_tor_bridges_custom_radio_option": "Χρήση παραμετροποιημένων γεφυρών", + "gui_settings_tor_bridges_custom_label": "Αποκτήστε γέφυρες στο <a href=\"https://bridges.torproject.org/options?lang=el\"> https://bridges.torproject.org</a>", "gui_settings_tor_bridges_invalid": "Δεν λειτούργησε κάποιο από τα bridges που προσθέσατε.\nΞαναελέγξτε τα ή προσθέστε άλλα.", "gui_settings_button_save": "Αποθήκευση", "gui_settings_button_cancel": "Άκυρο", @@ -107,30 +107,30 @@ "gui_settings_autostop_timer_checkbox": "Χρήση χρονομέτρου αυτόματης διακοπής", "gui_settings_autostop_timer": "Διακοπή διαμοιρασμού σε:", "settings_error_unknown": "Αποτυχία σύνδεσης στον ελεγκτή Tor, γιατί οι ρυθμίσεις σας δεν βγάζουν κανένα νόημα.", - "settings_error_automatic": "Αδυναμία σύνδεσης στον ελεγκτή Tor. Λειτουργεί ο Tor Browser (διαθέσιμος στο torproject.org) στο παρασκήνιο;", - "settings_error_socket_port": "Αδυναμία σύνδεσης στον ελεγκτή Tor στις {}:{}.", - "settings_error_socket_file": "Αποτυχία σύνδεσης στον ελεγκτή Tor χρησιμοποιώντας το αρχείο socket {}.", + "settings_error_automatic": "Δεν ήταν δυνατή η σύνδεση στον ελεγκτή Tor. Λειτουργεί ο Tor Browser (διαθέσιμος στο torproject.org) στο παρασκήνιο;", + "settings_error_socket_port": "Δεν ήταν δυνατή η σύνδεση στον ελεγκτή Tor στις {}:{}.", + "settings_error_socket_file": "Δεν ήταν δυνατή η σύνδεση στον ελεγκτή Tor χρησιμοποιώντας το αρχείο socket {}.", "settings_error_auth": "Εγινε σύνδεση με {}:{}, αλλα δεν μπορεί να γίνει πιστοποίηση. Ίσως δεν είναι ελεγκτής Tor;", "settings_error_missing_password": "Έγινε σύνδεση με τον ελεγκτή Tor, αλλά απαιτείται κωδικός για πιστοποίηση.", - "settings_error_unreadable_cookie_file": "Έγινε σύνδεση με τον ελεγκτή Tor, αλλα ο κωδικός πιθανόν να είναι λάθος, ή δεν επιτρέπεται στο χρήστη να διαβάζει αρχεία cookie.", + "settings_error_unreadable_cookie_file": "Έγινε σύνδεση με τον ελεγκτή Tor, αλλα ο κωδικός ενδέχεται να είναι λανθασμένος, ή δεν σας επιτρέπεται να διαβάζετε αρχεία cookie.", "settings_error_bundled_tor_not_supported": "Η χρήση της έκδοσης Tor που περιέχεται στο OnionShare δεν είναι συμβατή με το περιβάλλον προγραμματιστή σε Windows ή macOS.", - "settings_error_bundled_tor_timeout": "Η σύνδεση με Tor αργεί αρκετά. Ισως δεν είστε συνδεδεμένοι στο Διαδίκτυο ή το ρολόι του συστήματος δεν είναι σωστό;", + "settings_error_bundled_tor_timeout": "Η σύνδεση με Tor καθυστερεί αρκετά. Ίσως δεν είστε συνδεδεμένοι στο Διαδίκτυο ή το ρολόι του συστήματος δεν είναι ρυθμισμένο σωστά;", "settings_error_bundled_tor_broken": "Το OnionShare δεν μπορεί να συνδεθεί με το Tor στο παρασκήνιο:\n{}", - "settings_test_success": "Εγινε σύνδεση με τον ελεγκτή Tor.\n\nΕκδοση Tor: {}\nΥποστηρίζει εφήμερες υπηρεσίες onion: {}.\nΥποστηρίζει πιστοποίηση πελάτη: {}.\nΥποστηρίζει νέας γενιάς διευθύνσεις .onion: {}.", - "error_tor_protocol_error": "Υπήρξε σφάλμα με το Tor: {}", + "settings_test_success": "Εγινε σύνδεση με τον ελεγκτή Tor.\n\nΕκδοση Tor: {}\nΥποστηρίζει εφήμερες υπηρεσίες onion: {}.\nΥποστηρίζει πιστοποίηση πελάτη: {}.\nΥποστηρίζει διευθύνσεις .onion νέας γενιάς: {}.", + "error_tor_protocol_error": "Προέκυψε σφάλμα με το Tor: {}", "error_tor_protocol_error_unknown": "Υπήρξε άγνωστο σφάλμα με το Tor", "error_invalid_private_key": "Αυτο το ιδιωτικό κλειδί δεν υποστηρίζεται", "connecting_to_tor": "Γίνεται σύνδεση στο δίκτυο Tor", - "update_available": "Βγήκε ενα νέο OnionShare. <a href='{}'>Κάντε κλικ εδώ</a> για να το λάβετε.<br><br>Χρησιμοποιείτε {} και το πιό πρόσφατο είναι το {}.", - "update_error_check_error": "Δεν μπόρεσε να γίνει έλεγχος για νέα έκδοση: ίσως δεν είστε συνδεδεμένοι στο Tor ή ο ιστότοπος OnionShare είναι εκτός λειτουργίας;", - "update_error_invalid_latest_version": "Δεν μπορεί να γίνει έλεγχος για νέα έκδοση: η ιστοσελίδα OnionShare αναφέρει ότι η τελευταία έκδοση είναι η μη αναγνωρίσιμη \"{}\"…", - "update_not_available": "Έχετε την πιό πρόσφατη έκδοση του OnionShare.", - "gui_tor_connection_ask": "Άνοιγμα των ρυθμίσεων για να επιλύσετε την σύνδεση με το Tor;", + "update_available": "Υπάρχει διαθέσιμη ενημέρωση. <a href='{}'>Κάντε κλικ εδώ</a> για να την αποκτήσετε.<br><br>Χρησιμοποιείτε την έκδοση {}, ενώ η πιο πρόσφατη είναι η {}.", + "update_error_check_error": "Δεν ήταν δυνατός ο έλεγχος για ενημερώσεις: ίσως δεν είστε συνδεδεμένος στο Tor ή ο ιστότοπος OnionShare είναι εκτός λειτουργίας;", + "update_error_invalid_latest_version": "Δεν ήταν δυνατός ο έλεγχος για ενημερώσεις: η ιστοσελίδα OnionShare αναφέρει ότι η πιο πρόσφατη έκδοση είναι η μη αναγνωρίσιμη \"{}\"…", + "update_not_available": "Χρησιμοποιείτε την πιο πρόσφατη έκδοση του OnionShare.", + "gui_tor_connection_ask": "Θα θέλατε να ανοίξετε τις ρυθμίσεις για να φτιάξετε την σύνδεσή σας με το Tor;", "gui_tor_connection_ask_open_settings": "Ναι", "gui_tor_connection_ask_quit": "Έξοδος", - "gui_tor_connection_error_settings": "Προσπαθήστε να αλλάξετε τον τρόπο σύνδεσης του OnionShare με το δίκτυο Tor από τις ρυθμίσεις.", - "gui_tor_connection_canceled": "Δεν μπόρεσε να γίνει σύνδεση στο Tor.\n\nΕλέγξτε ότι είστε συνδεδεμένος/η στο Διαδίκτυο, επανεκκινήστε το OnionShare και ρυθμίστε την σύνδεση με το Tor.", - "gui_tor_connection_lost": "Έγινε αποσύνδεση από το Tor.", + "gui_tor_connection_error_settings": "Ίσως να ήταν καλή ιδέα να αλλάξετε τον τρόπο σύνδεσης του OnionShare με το δίκτυο Tor από τις ρυθμίσεις.", + "gui_tor_connection_canceled": "Δεν ήταν δυνατή η σύνδεση στο δίκτυο του Tor.\n\nΕλέγξτε ότι είστε συνδεδεμένος/η στο Διαδίκτυο, επανεκκινήστε το OnionShare και ρυθμίστε την σύνδεση με το Tor.", + "gui_tor_connection_lost": "Έγινε αποσύνδεση από το δίκτυο του Tor.", "gui_server_started_after_autostop_timer": "Το χρονόμετρο αυτόματης διακοπής τελείωσε πριν την εκκίνηση του server. Παρακαλώ κάντε ένα νέο διαμοιρασμό.", "gui_server_autostop_timer_expired": "Το χρονόμετρο αυτόματης διακοπής έχει ήδη τελειώσει. Παρακαλώ ρυθμίστε το για να ξεκινήσετε το διαμοιρασμό.", "share_via_onionshare": "Μοιραστείτε μέσω OnionShare", @@ -138,15 +138,15 @@ "gui_save_private_key_checkbox": "Χρήση μόνιμης διεύθυνσης", "gui_share_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare μπορεί να <b>κατεβάσει</b> τα αρχεία σας χρησιμοποιώντας το <b>Tor Browser</b>: <img src='{}' />", "gui_receive_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare, μπορεί να <b>ανεβάσει</b> αρχεία στον υπολογιστή σας χρησιμοποιώντας το <b>Tor Browser</b>: <img src='{}' />", - "gui_url_label_persistent": "Αυτός ο διαμοιρασμός δεν θα λήξει αυτόματα.<br><br>Οποιοσδήποτε επακόλουθος διαμοιρασμός θα επαναχρησιμοποιήσει αυτή τη διεύθυνση. (Για να χρησιμοποιήσετε διευθύνσεις μιας χρήσης, απενεργοποιήστε τη λειτουργία \"Χρήση μόνιμης διεύθυνσης\" στις Ρυθμίσεις.)", - "gui_url_label_stay_open": "Αυτός ο διαμοιρασμός δε λήγει αυτόματα.", + "gui_url_label_persistent": "Αυτή η σελίδα διαμοιρασμού δεν θα πάψει να λειτουργεί αυτόματα.<br><br>Όσοι μοιράζονται αρχεία μαζί σας θα μπορέσουν να ξαναχρησιμοποιήσουν αυτή τη διεύθυνση αργότερα. (Για να χρησιμοποιήσετε διευθύνσεις μιας χρήσης, απενεργοποιήστε τη λειτουργία \"Χρήση μόνιμης διεύθυνσης\" στις Ρυθμίσεις.)", + "gui_url_label_stay_open": "Αυτή η σελίδα διαμοιρασμού δεν θα πάψει να λειτουργεί αυτόματα.", "gui_url_label_onetime": "Αυτός ο διαμοιρασμός θα σταματήσει μετά την πρώτη λήψη.", - "gui_url_label_onetime_and_persistent": "Αυτός ο διαμοιρασμός δεν θα λήξει αυτόματα.<br><br>Οποιοσδήποτε επακόλουθος διαμοιρασμός θα επαναχρησιμοποιήσει αυτή τη διεύθυνση. (Για να χρησιμοποιήσετε διευθύνσεις μιας χρήσης, απενεργοποιήστε τη λειτουργία \"Χρήση μόνιμης διεύθυνσης\" στις Ρυθμίσεις.)", - "gui_status_indicator_share_stopped": "Ετοιμο για διαμοιρασμό", - "gui_status_indicator_share_working": "Ξεκινάει…", - "gui_status_indicator_share_started": "Διαμοιράζει", + "gui_url_label_onetime_and_persistent": "Αυτή η σελίδα διαμοιρασμού δεν θα πάψει να λειτουργεί αυτόματα.<br><br>Οποιοσδήποτε επακόλουθος διαμοιρασμός θα επαναχρησιμοποιήσει αυτή τη διεύθυνση. (Για να χρησιμοποιήσετε διευθύνσεις μιας χρήσης, απενεργοποιήστε τη λειτουργία \"Χρήση μόνιμης διεύθυνσης\" στις Ρυθμίσεις.)", + "gui_status_indicator_share_stopped": "Έτοιμο για διαμοιρασμό", + "gui_status_indicator_share_working": "Εκκίνηση…", + "gui_status_indicator_share_started": "Γίνεται αποστολή", "gui_status_indicator_receive_stopped": "Έτοιμο για λήψη", - "gui_status_indicator_receive_working": "Ξεκινάει…", + "gui_status_indicator_receive_working": "Γίνεται εκκίνηση…", "gui_status_indicator_receive_started": "Γίνεται λήψη", "gui_file_info": "{} αρχεία, {}", "gui_file_info_single": "{} αρχείο, {}", @@ -186,7 +186,7 @@ "gui_add_files": "Προσθήκη αρχείων", "gui_add_folder": "Προσθήκη φακέλου", "gui_connect_to_tor_for_onion_settings": "Συνδεθείτε στο Tor για να δείτε τις ρυθμίσεις της υπηρεσίας onion", - "error_cannot_create_data_dir": "Δεν μπόρεσε να δημιουργηθεί φάκελος δεδομένων OnionShare: {}", + "error_cannot_create_data_dir": "Δεν ήταν δυνατή η δημιουργία φακέλου δεδομένων OnionShare: {}", "receive_mode_data_dir": "Τα αρχεία που στάλθηκαν σε εσας εμφανίζοντε στον φάκελο: {}", "gui_settings_data_dir_label": "Αποθήκευση αρχείων σε", "gui_settings_data_dir_browse_button": "Περιήγηση", @@ -207,7 +207,7 @@ "gui_all_modes_progress_complete": "%p%, πέρασαν {0:s}.", "gui_all_modes_progress_starting": "{0:s}, %p% (γίνεται υπολογισμός)", "gui_all_modes_progress_eta": "{0:s}, Εκτιμώμενος χρόνος: {1:s}, %p%", - "gui_share_mode_no_files": "Δεν στάλθηκαν ακόμα αρχεία", + "gui_share_mode_no_files": "Δεν έχουν αποσταλεί ακόμα αρχεία", "gui_share_mode_autostop_timer_waiting": "Αναμένεται η ολοκλήρωση της αποστολής", "gui_receive_mode_no_files": "Δεν έχει γίνει λήψη αρχείων ακόμα", "gui_receive_mode_autostop_timer_waiting": "Αναμένεται η ολοκλήρωση της λήψης", @@ -216,27 +216,27 @@ "gui_all_modes_transfer_canceled": "Ακυρώθηκε {}", "gui_stop_server_autostop_timer_tooltip": "Το χρονόμετρο αυτόματης διακοπής λήγει σε {}", "gui_start_server_autostart_timer_tooltip": "Το χρονόμετρο αυτόματης εκκίνησης λήγει σε {}", - "gui_waiting_to_start": "Προγραμματισμένο να ξεκινήσει σε {}. Πατήστε για ακύρωση.", + "gui_waiting_to_start": "Προγραμματισμένο να ξεκινήσει σε {}. Κάντε κλικ για ακύρωση.", "gui_settings_autostart_timer_checkbox": "Χρήση χρονομέτρου αυτόματης έναρξης", "gui_settings_autostart_timer": "Εκκίνηση διαμοιρασμού σε:", "gui_server_autostart_timer_expired": "Η προγραμματισμένη ώρα έχει ήδη παρέλθει. Παρακαλώ ρυθμίστε τη για να ξεκινήσετε το διαμοιρασμό.", "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Η ώρα αυτόματης διακοπής δεν μπορεί να είναι ίδια ή νωρίτερα από την ώρα έναρξης. Παρακαλούμε ρυθμίστε τη για έναρξη του διαμοιρασμού.", - "gui_status_indicator_share_scheduled": "Προγραμματισμένο…", + "gui_status_indicator_share_scheduled": "Δρομολόγηση…", "gui_status_indicator_receive_scheduled": "Προγραμματισμένο…", "days_first_letter": "ημ", "hours_first_letter": "ώ", "minutes_first_letter": "λ", "seconds_first_letter": "δ", - "gui_website_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare μπορεί <b>να επισκεφτεί</b> την ιστοσελία χρησιμοποιώντας τον <b>Tor Browser</b>: <img src='{}' />", + "gui_website_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση OnionShare μπορεί <b>να επισκεφτεί</b> την ιστοσελίδα χρησιμοποιώντας τον <b>Tor Browser</b>: <img src='{}' />", "gui_mode_website_button": "Δημοσίευση ιστοσελίδας", - "gui_website_mode_no_files": "Η ιστοσελίδα δεν έχει μοιραστεί ακόμα", - "incorrect_password": "Λάθος κωδικός πρόσβασης", + "gui_website_mode_no_files": "Δεν έχει γίνει διαμοιρασμός ιστοσελίδας ακόμα", + "incorrect_password": "Λάθος κωδικός", "gui_settings_individual_downloads_label": "Απεπιλέξτε για να επιτρέψετε τη λήψη μεμονωμένων αρχείων", "history_requests_tooltip": "{} αιτήματα δικτύου", "gui_settings_csp_header_disabled_option": "Απενεργοποίηση της κεφαλίδας Content Security Policy", "gui_settings_website_label": "Ρυθμίσεις ιστοσελίδας", "gui_open_folder_error": "Το άνοιγμα του φακέλου με xdg-open απέτυχε. Το αρχείο βρίσκετε : {}", - "gui_receive_flatpak_data_dir": "Επειδή εγκαταστήσατε το OnionShare με χρήση του Flatpak, πρέπει να αποθηκεύσετε τα αρχεία σε φάκελο ~/OnionShare.", + "gui_receive_flatpak_data_dir": "Επειδή έχετε εγκαταστήσει το OnionShare μέσω Flatpak, θα πρέπει να αποθηκεύσετε τα αρχεία μέσα σε έναν φάκελο στο ~/OnionShare.", "gui_chat_stop_server": "Τερματισμός διακομιστή συνομιλίας", "gui_chat_start_server": "Έναρξη διακομιστή συνομιλίας", "mode_settings_website_disable_csp_checkbox": "Μην στέλνετε κεφαλίδα με περιεχόμενο από την πολιτικής ασφάλειας σας (επιτρέπει στην ιστοσελίδα σας να χρησιμοποιεί πόρους τρίτων)", @@ -248,19 +248,19 @@ "mode_settings_autostop_timer_checkbox": "Προγραμματισμένος τερματισμός", "mode_settings_autostart_timer_checkbox": "Προγραμματισμένη εκκίνηση", "mode_settings_public_checkbox": "Χωρίς χρήση κωδικού πρόσβασης", - "mode_settings_persistent_checkbox": "Αποθήκευση της καρτέλας και αυτόματο άνοιγμά της με την έναρξη του OnionShare.", + "mode_settings_persistent_checkbox": "Αποθήκευση της καρτέλας και αυτόματο άνοιγμά της με την έναρξη του OnionShare", "mode_settings_advanced_toggle_hide": "Απόκρυψη προχωρημένων ρυθμίσεων", "mode_settings_advanced_toggle_show": "Εμφάνιση προχωρημένων ρυθμίσεων", "gui_quit_warning_cancel": "Άκυρο", - "gui_quit_warning_description": "Είναι ενεργή η κοινή χρήση σε ορισμένες καρτέλες. Εάν κάνετε έξοδο, όλες οι καρτέλες σας θα κλείσουν. Είστε σίγουροι;", - "gui_quit_warning_title": "Είστε σίγουροι;", + "gui_quit_warning_description": "Είναι ενεργή η κοινή χρήση σε ορισμένες καρτέλες. Εάν κάνετε έξοδο, όλες οι καρτέλες σας θα κλείσουν. Είστε σίγουρος/η;", + "gui_quit_warning_title": "Είστε σίγουρος/η;", "gui_close_tab_warning_cancel": "Άκυρο", "gui_close_tab_warning_close": "Κλείσιμο", - "gui_close_tab_warning_website_description": "Φιλοξενείτε ενεργά έναν ιστότοπο. Είστε βέβαιοι ότι θέλετε να κλείσετε την καρτέλα;", - "gui_close_tab_warning_receive_description": "Η λήψη αρχείων δεν ολοκληρώθηκε. Είστε βέβαιοι ότι θέλετε να κλείσετε την καρτέλα;", - "gui_close_tab_warning_share_description": "Η αποστολή αρχείων δεν ολοκληρώθηκε. Είστε βέβαιοι ότι θέλετε να κλείσετε την καρτέλα;", - "gui_close_tab_warning_persistent_description": "Η καρτέλα δεν είναι μόνιμη. Εάν την κλείσετε, θα χαθεί η διεύθυνση onion που χρησιμοποιεί. Είστε βέβαιοι ότι θέλετε να την κλείσετε;", - "gui_close_tab_warning_title": "Είστε σίγουροι;", + "gui_close_tab_warning_website_description": "Φιλοξενείτε έναν ιστότοπο. Είστε βέβαιος/η ότι θέλετε να κλείσετε την καρτέλα;", + "gui_close_tab_warning_receive_description": "Η λήψη αρχείων δεν έχει ολοκληρωθεί. Είστε βέβαιος/η ότι θέλετε να κλείσετε την καρτέλα;", + "gui_close_tab_warning_share_description": "Η αποστολή αρχείων δεν έχει ολοκληρωθεί ακόμα. Είστε βέβαιος/η ότι θέλετε να κλείσετε την καρτέλα;", + "gui_close_tab_warning_persistent_description": "Η καρτέλα δεν είναι μόνιμη. Εάν την κλείσετε, θα χαθεί η διεύθυνση onion που χρησιμοποιείτε. Είστε βέβαιοι ότι θέλετε να την κλείσετε;", + "gui_close_tab_warning_title": "Είστε σίγουρος/η;", "gui_tab_name_chat": "Συνομιλία", "gui_tab_name_website": "Ιστότοπος", "gui_tab_name_receive": "Λήψη", @@ -270,9 +270,9 @@ "gui_main_page_receive_button": "Έναρξη λήψης", "gui_main_page_share_button": "Έναρξη διαμοιρασμού", "gui_new_tab_chat_button": "Συνομιλήστε ανώνυμα", - "gui_new_tab_website_button": "Φιλοξενήστε έναν ιστότοπο", + "gui_new_tab_website_button": "Φιλοξενία ιστότοπου", "gui_new_tab_receive_button": "Λήψη αρχείων", - "gui_new_tab_share_button": "Διαμοιράστε αρχεία", + "gui_new_tab_share_button": "Διαμοιρασμός αρχείων", "gui_new_tab_tooltip": "Άνοιγμα νέας καρτέλας", "gui_new_tab": "Νέα καρτέλα", "gui_qr_code_dialog_title": "Κώδικας QR OnionShare", @@ -282,5 +282,15 @@ "error_port_not_available": "Η θύρα OnionShare δεν είναι διαθέσιμη", "gui_rendezvous_cleanup_quit_early": "Πρόωρη έξοδος", "gui_rendezvous_cleanup": "Αναμονή για τερματισμό των κυκλωμάτων του Tor για να βεβαιωθείτε ότι τα αρχεία σας έχουν μεταφερθεί με επιτυχία.\n\nΑυτό μπορεί να διαρκέσει λίγα λεπτά.", - "gui_chat_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση του OnionShare μπορεί <b>να συμμετέχει στο chat</b> με χρήση του <b>Tor Browser</b>: <img src='{}' />" -} + "gui_chat_url_description": "<b>Οποιοσδήποτε</b> με αυτή τη διεύθυνση του OnionShare μπορεί <b>να συμμετέχει στο δωμάτιο συνομιλίας</b> με χρήση του <b>Tor Browser</b>: <img src='{}' />", + "gui_color_mode_changed_notice": "Επανεκκινήστε το OnionShare για εφαρμοστεί το νέο χρώμα.", + "history_receive_read_message_button": "Ανάγνωση μηνύματος", + "mode_settings_receive_webhook_url_checkbox": "Χρήση ειδοποίησης webhook", + "mode_settings_receive_disable_files_checkbox": "Απενεργοποίηση της μεταφόρτωσης αρχείων", + "mode_settings_receive_disable_text_checkbox": "Απενεργοποίηση υποβολής κειμένου", + "mode_settings_title_label": "Προσαρμοσμένος τίτλος", + "gui_status_indicator_chat_started": "Σε συνομιλία", + "gui_status_indicator_chat_scheduled": "Δρομολόγηση…", + "gui_status_indicator_chat_working": "Εκκίνηση…", + "gui_status_indicator_chat_stopped": "Έτοιμο για συνομιλία" +}
\ No newline at end of file diff --git a/desktop/src/onionshare/resources/locale/en.json b/desktop/src/onionshare/resources/locale/en.json index f7b8f7bb..3a5c2ecd 100644 --- a/desktop/src/onionshare/resources/locale/en.json +++ b/desktop/src/onionshare/resources/locale/en.json @@ -33,6 +33,7 @@ "gui_show_url_qr_code": "Show QR Code", "gui_qr_code_dialog_title": "OnionShare QR Code", "gui_waiting_to_start": "Scheduled to start in {}. Click to cancel.", + "gui_please_wait_no_button": "Starting…", "gui_please_wait": "Starting… Click to cancel.", "error_rate_limit": "Someone has made too many wrong attempts to guess your password, so OnionShare has stopped the server. Start sharing again and send the recipient a new address to share.", "zip_progress_bar_format": "Compressing: %p%", @@ -101,6 +102,10 @@ "gui_status_indicator_receive_working": "Starting…", "gui_status_indicator_receive_scheduled": "Scheduled…", "gui_status_indicator_receive_started": "Receiving", + "gui_status_indicator_chat_stopped": "Ready to chat", + "gui_status_indicator_chat_working": "Starting…", + "gui_status_indicator_chat_scheduled": "Scheduled…", + "gui_status_indicator_chat_started": "Chatting", "gui_file_info": "{} files, {}", "gui_file_info_single": "{} file, {}", "history_in_progress_tooltip": "{} in progress", @@ -110,6 +115,10 @@ "gui_receive_mode_warning": "Receive mode lets people upload files to your computer.<br><br><b>Some files can potentially take control of your computer if you open them. Only open things from people you trust, or if you know what you are doing.</b>", "gui_open_folder_error": "Failed to open folder with xdg-open. The file is here: {}", "gui_settings_language_label": "Preferred language", + "gui_settings_theme_label": "Theme", + "gui_settings_theme_auto": "Auto", + "gui_settings_theme_light": "Light", + "gui_settings_theme_dark": "Dark", "gui_settings_language_changed_notice": "Restart OnionShare for the new language to be applied.", "gui_color_mode_changed_notice": "Restart OnionShare for the new color mode to be applied.", "systray_menu_exit": "Quit", @@ -165,6 +174,7 @@ "gui_quit_warning_cancel": "Cancel", "mode_settings_advanced_toggle_show": "Show advanced settings", "mode_settings_advanced_toggle_hide": "Hide advanced settings", + "mode_settings_title_label": "Custom title", "mode_settings_persistent_checkbox": "Save this tab, and automatically open it when I open OnionShare", "mode_settings_public_checkbox": "Don't use a password", "mode_settings_autostart_timer_checkbox": "Start onion service at scheduled time", @@ -174,6 +184,9 @@ "mode_settings_share_autostop_sharing_checkbox": "Stop sharing after files have been sent (uncheck to allow downloading individual files)", "mode_settings_receive_data_dir_label": "Save files to", "mode_settings_receive_data_dir_browse_button": "Browse", + "mode_settings_receive_disable_text_checkbox": "Disable submitting text", + "mode_settings_receive_disable_files_checkbox": "Disable uploading files", + "mode_settings_receive_webhook_url_checkbox": "Use notification webhook", "mode_settings_website_disable_csp_checkbox": "Don't send Content Security Policy header (allows your website to use third-party resources)", "gui_all_modes_transfer_finished_range": "Transferred {} - {}", "gui_all_modes_transfer_finished": "Transferred {}", @@ -191,5 +204,7 @@ "settings_error_bundled_tor_broken": "OnionShare could not connect to Tor:\n{}", "gui_rendezvous_cleanup": "Waiting for Tor circuits to close to be sure your files have successfully transferred.\n\nThis might take a few minutes.", "gui_rendezvous_cleanup_quit_early": "Quit Early", - "error_port_not_available": "OnionShare port not available" + "error_port_not_available": "OnionShare port not available", + "history_receive_read_message_button": "Read Message", + "error_tor_protocol_error": "There was an error with Tor: {}" }
\ No newline at end of file diff --git a/desktop/src/onionshare/resources/locale/es.json b/desktop/src/onionshare/resources/locale/es.json index 59f07406..bc30af46 100644 --- a/desktop/src/onionshare/resources/locale/es.json +++ b/desktop/src/onionshare/resources/locale/es.json @@ -296,9 +296,18 @@ "gui_main_page_website_button": "Empezar a alojar", "gui_main_page_receive_button": "Empezar a recibir", "gui_main_page_share_button": "Empezar a compartir", - "gui_chat_url_description": "<b>Cualquiera</b> con esta dirección de OnionShare puede <b>puede unirse a este cuarto de chat</b> usando el <b>Navegador Tor</b>: <img src='{}' />", + "gui_chat_url_description": "<b>Cualquiera</b> con esta dirección de OnionShare puede <b>unirse a esta sala de chat</b> usando el <b>Navegador Tor</b>: <img src='{}' />", "error_port_not_available": "Puerto OnionShare no disponible", "gui_rendezvous_cleanup_quit_early": "Salir Antes", "gui_rendezvous_cleanup": "Esperando a que los circuitos Tor se cierren para asegurar que tus archivos se hayan transferido exitosamente.\n\nEsto puede llevar unos pocos minutos.", - "gui_color_mode_changed_notice": "Reiniciar OnionShare para que sea aplicado el nuevo modo de color." + "gui_color_mode_changed_notice": "Reiniciar OnionShare para que sea aplicado el nuevo modo de color.", + "mode_settings_receive_webhook_url_checkbox": "Usar webhook de notificaciones", + "history_receive_read_message_button": "Leer mensaje", + "mode_settings_receive_disable_files_checkbox": "Deshabilitar la subida de archivos", + "mode_settings_receive_disable_text_checkbox": "Deshabilitar el envío de texto", + "mode_settings_title_label": "Título personalizado", + "gui_status_indicator_chat_started": "Chateando", + "gui_status_indicator_chat_scheduled": "Programado…", + "gui_status_indicator_chat_working": "Iniciando…", + "gui_status_indicator_chat_stopped": "Listo para chatear" } diff --git a/desktop/src/onionshare/resources/locale/fr.json b/desktop/src/onionshare/resources/locale/fr.json index b9b5cdcb..8c4bf20a 100644 --- a/desktop/src/onionshare/resources/locale/fr.json +++ b/desktop/src/onionshare/resources/locale/fr.json @@ -93,9 +93,9 @@ "settings_error_socket_file": "Impossible de se connecter au contrôleur Tor en utilisant le fichier d’interface de connexion {}.", "settings_error_auth": "Connecté à {}:{}, mais il est impossible de s’authentifier. Est-ce bien un contrôleur Tor ?", "settings_error_missing_password": "Vous êtes connecté au contrôleur Tor, mais il exige un mot de passe d’authentification.", - "settings_error_unreadable_cookie_file": "Connecté au contrôleur Tor, mais le mot de passe est peut-être erroné ou votre utilisateur n’est pas autorisé à lire le fichier témoin.", + "settings_error_unreadable_cookie_file": "Vous êtes connecté au contrôleur Tor, mais le mot de passe est peut-être erroné ou votre utilisateur n’est pas autorisé à lire le fichier témoin.", "settings_error_bundled_tor_not_supported": "Utiliser la version de Tor intégrée à OnionShare ne fonctionne pas en mode développeur sous Windows ou macOS.", - "settings_error_bundled_tor_timeout": "La connexion à Tor prend trop de temps. Vous n’êtes peut-être pas connecté à Internet ou votre horloge système est mal réglée.", + "settings_error_bundled_tor_timeout": "La connexion à Tor prend trop de temps. Vous n’êtes peut-être pas connecté à Internet ou votre horloge système est-elle mal réglée ?", "settings_error_bundled_tor_broken": "OnionShare n’a pas réussi à se connecter à Tor :\n{}", "error_tor_protocol_error": "Une erreur est survenue avec Tor : {}", "error_tor_protocol_error_unknown": "Une erreur inconnue est survenue avec Tor", @@ -295,5 +295,14 @@ "error_port_not_available": "Le port OnionShare n’est pas accessible", "gui_rendezvous_cleanup_quit_early": "Fermer avant", "gui_rendezvous_cleanup": "En attente de la fermeture des circuits Tor pour être certain que vos fichiers ont été transférés avec succès.\n\nCela pourrait prendre quelques minutes.", - "gui_color_mode_changed_notice": "Redémarrez OnionShare pour que le nouveau mode chromatique soit appliqué." + "gui_color_mode_changed_notice": "Redémarrez OnionShare pour que le nouveau mode chromatique soit appliqué.", + "history_receive_read_message_button": "Lire le message", + "mode_settings_receive_webhook_url_checkbox": "Utiliser un point d’ancrage Web de notification", + "mode_settings_receive_disable_files_checkbox": "Désactiver le téléversement de fichiers", + "mode_settings_receive_disable_text_checkbox": "Désactiver l’envoi de texte", + "mode_settings_title_label": "Titre personnalisé", + "gui_status_indicator_chat_started": "En conversation", + "gui_status_indicator_chat_scheduled": "Planifié…", + "gui_status_indicator_chat_working": "Démarrage…", + "gui_status_indicator_chat_stopped": "Prêt à dialoguer" } diff --git a/desktop/src/onionshare/resources/locale/gl.json b/desktop/src/onionshare/resources/locale/gl.json index 11848ca3..67b095cc 100644 --- a/desktop/src/onionshare/resources/locale/gl.json +++ b/desktop/src/onionshare/resources/locale/gl.json @@ -191,5 +191,15 @@ "error_port_not_available": "Non está dispoñible o porto OnionShare", "gui_rendezvous_cleanup_quit_early": "Saír axiña", "gui_rendezvous_cleanup": "Agardando a que se pechen tódolos circuitos de Tor para ter certeza de que os ficheiros foron transferidos.\n\nEsto podería tardar un pouco.", - "gui_color_mode_changed_notice": "Reinicia OnionShare para aplicar o novo modo de cor." + "gui_color_mode_changed_notice": "Reinicia OnionShare para aplicar o novo modo de cor.", + "error_tor_protocol_error": "Hai un erro con Tor: {}", + "history_receive_read_message_button": "Ler mensaxe", + "mode_settings_receive_disable_files_checkbox": "Desactivar a subida de ficheiros", + "mode_settings_receive_disable_text_checkbox": "Desactivar o envío de texto", + "mode_settings_title_label": "Título personalizado", + "mode_settings_receive_webhook_url_checkbox": "Usar webhook de notificación", + "gui_status_indicator_chat_started": "Conversando", + "gui_status_indicator_chat_scheduled": "Programado…", + "gui_status_indicator_chat_working": "Comezando…", + "gui_status_indicator_chat_stopped": "Preparado para conversar" } diff --git a/desktop/src/onionshare/resources/locale/hi.json b/desktop/src/onionshare/resources/locale/hi.json index 9cfc310d..8efb9301 100644 --- a/desktop/src/onionshare/resources/locale/hi.json +++ b/desktop/src/onionshare/resources/locale/hi.json @@ -21,7 +21,7 @@ "help_verbose": "", "help_filename": "", "help_config": "", - "gui_drag_and_drop": "साझा शुरू करने के लिए\nफाइलों एवं फोल्डरों को ड्रैग और ड्रॉप करें", + "gui_drag_and_drop": "साझा शुरू करने के लिए फाइलों एवं फोल्डरों को ड्रैग और ड्रॉप करें", "gui_add": "जोड़ें", "gui_add_files": "फाइल जोड़ें", "gui_add_folder": "फोल्डर जोड़ें", @@ -67,24 +67,24 @@ "gui_settings_sharing_label": "साझा सेटिंग्स", "gui_settings_close_after_first_download_option": "इस फाइल को भेजने के बाद साझा बंद कर दें", "gui_settings_connection_type_label": "OnionShare को Tor से कैसे जुड़ना चाहिए?", - "gui_settings_connection_type_bundled_option": "", - "gui_settings_connection_type_automatic_option": "", - "gui_settings_connection_type_control_port_option": "", - "gui_settings_connection_type_socket_file_option": "", + "gui_settings_connection_type_bundled_option": "OnionShare में निर्मित Tor संस्करण का उपयोग करें", + "gui_settings_connection_type_automatic_option": "Tor Browser के साथ ऑटो-कॉन्फ़िगरेशन का प्रयास करें", + "gui_settings_connection_type_control_port_option": "कंट्रोल पोर्ट का उपयोग करके कनेक्ट करें", + "gui_settings_connection_type_socket_file_option": "सॉकेट फ़ाइल का उपयोग करके कनेक्ट करें", "gui_settings_connection_type_test_button": "", - "gui_settings_control_port_label": "", - "gui_settings_socket_file_label": "", - "gui_settings_socks_label": "", - "gui_settings_authenticate_label": "", - "gui_settings_authenticate_no_auth_option": "", + "gui_settings_control_port_label": "कण्ट्रोल पोर्ट", + "gui_settings_socket_file_label": "सॉकेट फ़ाइल", + "gui_settings_socks_label": "SOCKS पोर्ट", + "gui_settings_authenticate_label": "Tor प्रमाणीकरण सेटिंग्स", + "gui_settings_authenticate_no_auth_option": "कोई प्रमाणीकरण या कुकी प्रमाणीकरण नहीं", "gui_settings_authenticate_password_option": "", "gui_settings_password_label": "", - "gui_settings_tor_bridges": "", - "gui_settings_tor_bridges_no_bridges_radio_option": "", - "gui_settings_tor_bridges_obfs4_radio_option": "", - "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "", - "gui_settings_tor_bridges_meek_lite_azure_radio_option": "", - "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "", + "gui_settings_tor_bridges": "Tor ब्रिज सपोर्ट", + "gui_settings_tor_bridges_no_bridges_radio_option": "ब्रिड्जेस का प्रयोग न करें", + "gui_settings_tor_bridges_obfs4_radio_option": "पहले से निर्मित obfs4 प्लगेबल ट्रांसपोर्टस का उपयोग करें", + "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "पहले से निर्मित obfs4 प्लगेबल ट्रांसपोर्टस का उपयोग करें (obfs4proxy अनिवार्य)", + "gui_settings_tor_bridges_meek_lite_azure_radio_option": "पहले से निर्मित meek_lite (Azure) प्लगेबल ट्रांसपोर्टस का उपयोग करें", + "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "पहले से निर्मित meek_lite (Azure) प्लगेबल ट्रांसपोर्टस का उपयोग करें (obfs4proxy अनिवार्य है)", "gui_settings_meek_lite_expensive_warning": "", "gui_settings_tor_bridges_custom_radio_option": "", "gui_settings_tor_bridges_custom_label": "", @@ -186,5 +186,12 @@ "gui_waiting_to_start": "{} में शुरू होने के लिए शेडयूल है। रद्द करने के लिए क्लिक करें।", "incorrect_password": "पासवर्ड गलत है", "gui_settings_individual_downloads_label": "विशिष्ट फाइलों के डाउनलोड को मंजूरी देने के लिए अचिन्हित करें", - "gui_settings_csp_header_disabled_option": "सामग्री सुरक्षा नियम हेडर को अक्षम करें" + "gui_settings_csp_header_disabled_option": "सामग्री सुरक्षा नियम हेडर को अक्षम करें", + "gui_show_url_qr_code": "क्यूआर कोड दिखाएं", + "gui_chat_stop_server": "चैट सर्वर बंद करें", + "gui_chat_start_server": "चैट सर्वर शुरू करें", + "gui_file_selection_remove_all": "सभी हटाएं", + "gui_remove": "हटाएं", + "gui_qr_code_dialog_title": "OnionShare क्यूआर कोड", + "gui_receive_flatpak_data_dir": "चूँकि आपने फ़्लैटपैक का उपयोग करके OnionShare स्थापित किया है, इसलिए आपको फ़ाइलों को ~/OnionShare फ़ोल्डर में सहेजना होगा।" } diff --git a/desktop/src/onionshare/resources/locale/hr.json b/desktop/src/onionshare/resources/locale/hr.json index 6c399c89..29252c1d 100644 --- a/desktop/src/onionshare/resources/locale/hr.json +++ b/desktop/src/onionshare/resources/locale/hr.json @@ -4,8 +4,8 @@ "no_available_port": "Priključak za pokretanje Onion usluge nije pronađen", "other_page_loaded": "Adresa učitana", "incorrect_password": "Neispravna lozinka", - "close_on_autostop_timer": "Zaustavljeno, jer je vrijeme timera za automatsko zaustavljanje isteklo", - "closing_automatically": "Zaustavljeno, jer je prijenos završen", + "close_on_autostop_timer": "Prekinuto, jer je vrijeme timera za automatsko prekidanje isteklo", + "closing_automatically": "Prekinuto, jer je prijenos završen", "large_filesize": "Upozorenje: Slanje velike količine podataka može trajati satima", "gui_drag_and_drop": "Povuci i ispusti datoteke i mape koje želiš dijeliti", "gui_add": "Dodaj", @@ -14,13 +14,13 @@ "gui_delete": "Izbriši", "gui_choose_items": "Odaberi", "gui_share_start_server": "Pokreni dijeljenje", - "gui_share_stop_server": "Zaustavi dijeljenje", - "gui_share_stop_server_autostop_timer": "Zaustavi dijeljenje ({})", - "gui_stop_server_autostop_timer_tooltip": "Timer za automatsko zaustavljanje završava pri {}", + "gui_share_stop_server": "Prekini dijeljenje", + "gui_share_stop_server_autostop_timer": "Prekini dijeljenje ({})", + "gui_stop_server_autostop_timer_tooltip": "Timer za automatsko prekidanje završava u {}", "gui_start_server_autostart_timer_tooltip": "Timer za automatsko pokretanje završava u {}", "gui_receive_start_server": "Pokreni modus primanja", - "gui_receive_stop_server": "Zaustavi modus primanja", - "gui_receive_stop_server_autostop_timer": "Zaustavi modus primanja ({} preostalo)", + "gui_receive_stop_server": "Prekini modus primanja", + "gui_receive_stop_server_autostop_timer": "Prekini modus primanja ({} preostalo)", "gui_copy_url": "Kopiraj adresu", "gui_copy_hidservauth": "Kopiraj HidServAuth", "gui_canceled": "Prekinuto", @@ -95,7 +95,7 @@ "settings_error_bundled_tor_timeout": "Povezivanje s Torom traje predugo. Možda nemaš vezu s internetom ili imaš netočno postavljen sat sustava?", "settings_error_bundled_tor_broken": "Neuspjelo povezivanje OnionShare-a s Torom:\n{}", "settings_test_success": "Povezan s Tor kontrolerom.\n\nTor verzija: {}\nPodržava kratkotrajne Onion usluge: {}.\nPodržava autentifikaciju klijenta: {}.\nPodržava .onion adrese sljedeće generacije: {}.", - "error_tor_protocol_error": "Greška s Torom: {}", + "error_tor_protocol_error": "Dogodila se greška s Torom: {}", "error_tor_protocol_error_unknown": "Nepoznata greška s Torom", "connecting_to_tor": "Povezivanje s Tor mrežom", "update_available": "Objavljen je novi OnionShare. <a href='{}'>Pritisni ovdje</a> za preuzimanje.<br><br>Trenutačno koristiš verziju {}, a najnovija verzija je {}.", @@ -108,10 +108,10 @@ "gui_tor_connection_error_settings": "U postavkama promijeni način na koji se OnionShare povezuje s Tor mrežom.", "gui_tor_connection_canceled": "Neuspjelo povezivanje s Torom.\n\nProvjeri vezu s internetom, a zatim ponovo pokreni OnionShare i postavi njegovu vezu s Torom.", "gui_tor_connection_lost": "Prekinuta veza s Torom.", - "gui_server_started_after_autostop_timer": "Vrijeme timera za automatsko zaustavljanje je isteklo prije nego što je poslužitelj započeo. Izradi novo dijeljenje.", - "gui_server_autostop_timer_expired": "Vrijeme timera za automatsko zaustavljanje je već isteklo. Za pokretanje dijeljenja, podesi vrijeme.", + "gui_server_started_after_autostop_timer": "Vrijeme timera za automatsko prekidanje je isteklo prije nego što je poslužitelj započeo. Izradi novo dijeljenje.", + "gui_server_autostop_timer_expired": "Vrijeme timera za automatsko prekidanje je već isteklo. Za pokretanje dijeljenja, podesi vrijeme.", "gui_server_autostart_timer_expired": "Planirano vrijeme je već prošlo. Za pokretanje dijeljenja, podesi vrijeme.", - "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Vrijeme za automatsko zaustavljanje ne može biti isto kao vrijeme za automatsko pokretanje ili ranije. Za pokretanje dijeljenja, podesi vrijeme.", + "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Vrijeme za automatsko prekidanje ne može biti isto kao vrijeme za automatsko pokretanje ili ranije. Za pokretanje dijeljenja, podesi vrijeme.", "share_via_onionshare": "Dijeli putem OnionSharea", "gui_connect_to_tor_for_onion_settings": "Poveži se s Torom za prikaz postavki Onion usluge", "gui_use_legacy_v2_onions_checkbox": "Koristi stare adrese", @@ -119,10 +119,10 @@ "gui_share_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>preuzeti</b> tvoje datoteke koristeći <b>Tor preglednik</b>: <img src='{}' />", "gui_website_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>posjetiti</b> tvoju web-stranicu koristeći <b>Tor preglednik</b>: <img src='{}' />", "gui_receive_url_description": "<b>Svatko</b> s ovom OnionShare adresom može <b>prenijeti</b> datoteke na tvoje računalo koristeći <b>Tor preglednik</b>: <img src='{}' />", - "gui_url_label_persistent": "Ovo se dijeljenje neće automatski zaustaviti.<br><br>Svako naredno dijeljenje ponovo koristi istu adresu. (Za korištenje jednokratne adrese, u postavkama isključi opciju „Koristi trajnu adresu”.)", - "gui_url_label_stay_open": "Ovo se dijeljenje neće automatski zaustaviti.", - "gui_url_label_onetime": "Ovo će se dijeljenje zaustaviti nakon prvog završavanja.", - "gui_url_label_onetime_and_persistent": "Ovo se dijeljenje neće automatski zaustaviti.<br><br>Svako naredno dijeljenje ponovo će koristiti istu adresu. (Za korištenje jednokratne adrese, u postavkama isključi opciju „Koristi trajnu adresu”.)", + "gui_url_label_persistent": "Ovo se dijeljenje neće automatski prekinuti.<br><br>Svako naredno dijeljenje koristit će istu adresu. (Za korištenje jednokratne adrese, u postavkama isključi opciju „Koristi trajnu adresu”.)", + "gui_url_label_stay_open": "Ovo se dijeljenje neće automatski prekinuti.", + "gui_url_label_onetime": "Ovo će se dijeljenje prekinuti nakon prvog završavanja.", + "gui_url_label_onetime_and_persistent": "Ovo se dijeljenje neće automatski prekinuti.<br><br>Svako naredno dijeljenje će koristit će istu adresu. (Za korištenje jednokratne adrese, u postavkama isključi opciju „Koristi trajnu adresu”.)", "gui_status_indicator_share_stopped": "Spremno za dijeljenje", "gui_status_indicator_share_working": "Pokretanje …", "gui_status_indicator_share_scheduled": "Planirano …", @@ -183,10 +183,10 @@ "mode_settings_website_disable_csp_checkbox": "Ne šalji zaglavlja politike sigurnosti sadržaja (omogućuje tvojim web-stranicama koristiti strane resurse)", "mode_settings_receive_data_dir_browse_button": "Pregledaj", "mode_settings_receive_data_dir_label": "Spremi datoteke u", - "mode_settings_share_autostop_sharing_checkbox": "Zaustavi dijeljenje nakon što se datoteke pošalju (deaktiviraj za preuzimanje pojedinačnih datoteka)", + "mode_settings_share_autostop_sharing_checkbox": "Prekini dijeljenje nakon što se datoteke pošalju (deaktiviraj za preuzimanje pojedinačnih datoteka)", "mode_settings_client_auth_checkbox": "Koristi autorizaciju klijenta", "mode_settings_legacy_checkbox": "Koristi stare adrese (v2 onion usluge, ne preporučuje se)", - "mode_settings_autostop_timer_checkbox": "Zaustavi onion uslugu u planirano vrijeme", + "mode_settings_autostop_timer_checkbox": "Prekini onion uslugu u planirano vrijeme", "mode_settings_autostart_timer_checkbox": "Pokreni onion uslugu u planirano vrijeme", "mode_settings_public_checkbox": "Nemoj koristiti lozinku", "mode_settings_persistent_checkbox": "Spremi ovu karticu i automatski je otvori kad otvorim OnionShare", @@ -212,10 +212,10 @@ "gui_new_tab": "Nova kartica", "gui_qr_code_description": "Skeniraj ovaj QR kȏd pomoću QR čitača, kao što je kamera na tvom telefonu, za lakše dijeljenje adrese OnionSharea.", "gui_receive_flatpak_data_dir": "Budući da je tvoj OnionShare instaliran pomoću Flatpak-a, datoteke moraš spremiti u jednu mapu u ~/OnionShare.", - "gui_tab_name_chat": "Chat", - "gui_new_tab_chat_button": "Anonimni chat", - "gui_chat_start_server": "Pokreni poslužitelja za chat", - "gui_chat_stop_server": "Zaustavi poslužitelja za chat", + "gui_tab_name_chat": "Razgovor", + "gui_new_tab_chat_button": "Razgovaraj anonimno", + "gui_chat_start_server": "Pokreni poslužitelja za razgovor", + "gui_chat_stop_server": "Prekini poslužitelja za razgovor", "gui_chat_stop_server_autostop_timer": "Zaustavi poslužitelja za chat ({})", "gui_tab_name_receive": "Primi", "gui_open_folder_error": "Otvaranje mape s xdg-open nije uspjelo. Datoteka je ovdje: {}", @@ -225,13 +225,22 @@ "gui_show_url_qr_code": "Prikaži QR-kod", "gui_file_selection_remove_all": "Ukloni sve", "gui_remove": "Ukloni", - "gui_main_page_chat_button": "Pokreni chat", + "gui_main_page_chat_button": "Pokreni razgovor", "gui_main_page_website_button": "Pokreni hosting", "gui_main_page_receive_button": "Pokreni primanje", "gui_main_page_share_button": "Pokreni dijeljenje", - "gui_chat_url_description": "<b>Svatko</b> s ovom OnionShare adresom može se <b>pridružiti sobi za chat</b> koristeći <b>Tor preglednik</b>: <img src='{}' />", + "gui_chat_url_description": "<b>Svatko</b> s ovom OnionShare adresom može se <b>pridružiti sobi za razgovor</b> koristeći <b>Tor preglednik</b>: <img src='{}' />", "error_port_not_available": "OnionShare priključak nije dostupan", "gui_rendezvous_cleanup_quit_early": "Prekini preuranjeno", "gui_rendezvous_cleanup": "Čekanje na zatvarnje Tor lanaca, kako bi se osigurao uspješan prijenos datoteka.\n\nOvo može potrajati nekoliko minuta.", - "gui_color_mode_changed_notice": "Za primjenu novog modusa boja ponovo pokreni OnionShare ." + "gui_color_mode_changed_notice": "Za primjenu novog modusa boja ponovo pokreni OnionShare .", + "history_receive_read_message_button": "Čitaj poruku", + "mode_settings_receive_disable_files_checkbox": "Onemogući prenošenje datoteka", + "mode_settings_receive_disable_text_checkbox": "Onemogući slanje teksta", + "mode_settings_title_label": "Prilagođeni naslov", + "gui_status_indicator_chat_scheduled": "Planirano …", + "gui_status_indicator_chat_working": "Pokretanje …", + "mode_settings_receive_webhook_url_checkbox": "Koristi automatsko obavještavanje", + "gui_status_indicator_chat_started": "Razgovor u tijeku", + "gui_status_indicator_chat_stopped": "Spremno za razgovor" } diff --git a/desktop/src/onionshare/resources/locale/id.json b/desktop/src/onionshare/resources/locale/id.json index 44adac8b..f4c299c5 100644 --- a/desktop/src/onionshare/resources/locale/id.json +++ b/desktop/src/onionshare/resources/locale/id.json @@ -10,7 +10,7 @@ "not_a_readable_file": "{0:s} bukan berkas yang bisa dibaca.", "no_available_port": "Tidak dapat menemukan porta yang tersedia untuk memulai layanan onion", "other_page_loaded": "Alamat dimuat", - "close_on_autostop_timer": "", + "close_on_autostop_timer": "Berhenti karena timer berhenti otomatis habis", "closing_automatically": "Terhenti karena transfer telah tuntas", "timeout_download_still_running": "", "large_filesize": "Peringatan: Mengirim dalam jumlah besar dapat memakan waktu berjam-jam", @@ -31,7 +31,7 @@ "help_verbose": "Catat kesalahan OnionShare ke stdout, dan kesalahan web ke disk", "help_filename": "Daftar berkas atau folder untuk dibagikan", "help_config": "", - "gui_drag_and_drop": "Seret dan lepas berkas dan folder\nuntuk mulai berbagi", + "gui_drag_and_drop": "Seret dan lepas berkas dan folder untuk mulai berbagi", "gui_add": "Tambahkan", "gui_delete": "Hapus", "gui_choose_items": "Pilih", @@ -62,7 +62,7 @@ "gui_receive_quit_warning": "Anda sedang dalam proses menerima berkas. Apakah Anda yakin ingin menghentikan OnionShare?", "gui_quit_warning_quit": "Keluar", "gui_quit_warning_dont_quit": "Batal", - "error_rate_limit": "", + "error_rate_limit": "Seseorang berusaha berulang kali untuk menebak kata sandi Anda, jadi OnionShare telah menghentikan server. Mulailah berbagi lagi dan kirim penerima alamat baru untuk dibagikan.", "zip_progress_bar_format": "Mengompresi: %p%", "error_stealth_not_supported": "Untuk menggunakan otorisasi klien, Anda perlu setidaknya Tor 0.2.9.1-alpha (atau Tor Browser 6.5) dan python3-stem 1.5.0.", "error_ephemeral_not_supported": "OnionShare memerlukan setidaknya Tor 0.2.7.1 dan python3-stem 1.4.0.", @@ -79,10 +79,10 @@ "gui_settings_sharing_label": "Pengaturan berbagi", "gui_settings_close_after_first_download_option": "Berhenti berbagi setelah berkas telah terkirim", "gui_settings_connection_type_label": "Bagaimana seharusnya OnionShare terhubung ke Tor?", - "gui_settings_connection_type_bundled_option": "", + "gui_settings_connection_type_bundled_option": "Gunakan versi Tor yang terintegrasi dengan OnionShare", "gui_settings_connection_type_automatic_option": "Mencoba konfigurasi otomatis dengan Tor Browser", "gui_settings_connection_type_control_port_option": "Menghubungkan menggunakan porta kontrol", - "gui_settings_connection_type_socket_file_option": "", + "gui_settings_connection_type_socket_file_option": "Hubungkan menggunakan file socket", "gui_settings_connection_type_test_button": "Menguji sambungan ke Tor", "gui_settings_control_port_label": "Port kontrol", "gui_settings_socket_file_label": "Berkas soket", @@ -91,73 +91,73 @@ "gui_settings_authenticate_no_auth_option": "Tidak ada otentikasi, atau otentikasi kuki", "gui_settings_authenticate_password_option": "Sandi", "gui_settings_password_label": "Sandi", - "gui_settings_tor_bridges": "", - "gui_settings_tor_bridges_no_bridges_radio_option": "", - "gui_settings_tor_bridges_obfs4_radio_option": "", - "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "", - "gui_settings_tor_bridges_meek_lite_azure_radio_option": "", - "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "", - "gui_settings_meek_lite_expensive_warning": "", - "gui_settings_tor_bridges_custom_radio_option": "", - "gui_settings_tor_bridges_custom_label": "", - "gui_settings_tor_bridges_invalid": "", + "gui_settings_tor_bridges": "Dukungan Tor bridge", + "gui_settings_tor_bridges_no_bridges_radio_option": "Jangan gunakan bridges", + "gui_settings_tor_bridges_obfs4_radio_option": "Gunakan obfs4 pluggable transports bawaan", + "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Gunakan obfs4 pluggable transports bawaan (memerlukan obfs4proxy)", + "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Gunakan meek_lite (Azure) pluggable transports bawaan", + "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Gunakan meek_lite (Azure) pluggable transports bawaan (memerlukan obfs4proxy)", + "gui_settings_meek_lite_expensive_warning": "Peringatan: meek_lite sangat mahal untuk dijalankan oleh Tor Project. <br><br>Gunakan hanya jika tidak dapat terhubung ke Tor secara langsung, melalui obfs4 transports,, atau bridge normal lainnya.", + "gui_settings_tor_bridges_custom_radio_option": "Gunakan bridge kustom", + "gui_settings_tor_bridges_custom_label": "Anda bisa mendapatkan bridge dari <a href=\"https://bridges.torproject.org/options\"> https://bridges.torproject.org </a>", + "gui_settings_tor_bridges_invalid": "Tak satu pun dari bridge yang Anda tambahkan bekerja.\nPeriksa kembali atau tambahkan yang lain.", "gui_settings_button_save": "Simpan", "gui_settings_button_cancel": "Batal", - "gui_settings_button_help": "", + "gui_settings_button_help": "Bantuan", "gui_settings_autostop_timer_checkbox": "", "gui_settings_autostop_timer": "", - "settings_error_unknown": "", - "settings_error_automatic": "", - "settings_error_socket_port": "", - "settings_error_socket_file": "", - "settings_error_auth": "", - "settings_error_missing_password": "", - "settings_error_unreadable_cookie_file": "", - "settings_error_bundled_tor_not_supported": "", - "settings_error_bundled_tor_timeout": "", - "settings_error_bundled_tor_broken": "", - "settings_test_success": "", - "error_tor_protocol_error": "", + "settings_error_unknown": "Tidak dapat tersambung ke pengontrol Tor karena pengaturan Anda tidak masuk akal.", + "settings_error_automatic": "Tidak dapat terhubung ke pengontrol Tor. Apakah Tor Browser (unduh di torproject.org) berjalan di latar belakang?", + "settings_error_socket_port": "Tidak dapat tersambung ke pengontrol Tor di {}:{}.", + "settings_error_socket_file": "Tidak dapat tersambung ke pengontrol Tor menggunakan file soket {}.", + "settings_error_auth": "Tersambung ke {}:{}, tetapi tidak bisa mengautentikasi. Mungkin ini bukan pengontrol Tor?", + "settings_error_missing_password": "Terhubung ke pengontrol Tor, tetapi memerlukan kata sandi untuk mengotentikasi.", + "settings_error_unreadable_cookie_file": "Terhubung ke pengontrol Tor, tetapi kata sandi mungkin salah, atau pengguna Anda tidak diizinkan untuk membaca file kuki.", + "settings_error_bundled_tor_not_supported": "Menggunakan versi Tor bawaan OnioShare tidak bekerja dalam mode pengembang di Windows atau macOS.", + "settings_error_bundled_tor_timeout": "Terlalu lama terhubung ke Tor. Mungkin Anda tidak terhubung Internet, atau jam sistem tidak akurat?", + "settings_error_bundled_tor_broken": "OnioShare tidak dapat terhubung Tor:\n{}", + "settings_test_success": "Terhubung ke pengontrol Tor.\n\nVersi tor: {}\nMendukung layanan ephemeral onion: {}.\nMendukung otentikasi klien: {}.\nMendukung alamat .onion generasi berikutnya: {}.", + "error_tor_protocol_error": "Ada kesalahan dengan Tor: {}", "error_tor_protocol_error_unknown": "", "error_invalid_private_key": "", - "connecting_to_tor": "", - "update_available": "", - "update_error_check_error": "", - "update_error_invalid_latest_version": "", - "update_not_available": "", - "gui_tor_connection_ask": "", + "connecting_to_tor": "Menghubungkan ke jaringan Tor", + "update_available": "OnionShare Baru tersedia. <a href='{}'>klik di sini</a> untuk mendapatkannya. <br><br>Anda menggunakan {} dan yang terbaru adalah {}.", + "update_error_check_error": "Tidak dapat memeriksa versi baru: Mungkin Anda tidak terhubung ke Tor, atau situs web OnionShare sedang down?", + "update_error_invalid_latest_version": "Tidak dapat memeriksa versi baru: Situs web OnionShare mengatakan bahwa versi terbaru adalah '{}' yang tidak dapat dikenali…", + "update_not_available": "Anda menjalankan OnionShare terbaru.", + "gui_tor_connection_ask": "Buka pengaturan untuk memilah koneksi ke Tor?", "gui_tor_connection_ask_open_settings": "Ya", "gui_tor_connection_ask_quit": "Keluar", - "gui_tor_connection_error_settings": "", - "gui_tor_connection_canceled": "", - "gui_tor_connection_lost": "", - "gui_server_started_after_autostop_timer": "", - "gui_server_autostop_timer_expired": "", - "share_via_onionshare": "", + "gui_tor_connection_error_settings": "Coba ubah cara OnionShare terhubung ke jaringan Tor di pengaturan.", + "gui_tor_connection_canceled": "Tidak dapat terhubung ke Tor.\n\nPastikan Anda terhubung ke Internet, kemudian buka kembali OnionShare dan atur koneksinya ke Tor.", + "gui_tor_connection_lost": "Terputus dari Tor.", + "gui_server_started_after_autostop_timer": "Timer berhenti otomatis habis sebelum server dimulai. Silakan buat pembagian baru.", + "gui_server_autostop_timer_expired": "Timer berhenti otomatis sudah habis. Silakan sesuaikan untuk mulai berbagi.", + "share_via_onionshare": "Bagikan via OnionShare", "gui_use_legacy_v2_onions_checkbox": "", "gui_save_private_key_checkbox": "", - "gui_share_url_description": "", - "gui_receive_url_description": "", - "gui_url_label_persistent": "", - "gui_url_label_stay_open": "", - "gui_url_label_onetime": "", - "gui_url_label_onetime_and_persistent": "", - "gui_status_indicator_share_stopped": "", - "gui_status_indicator_share_working": "", - "gui_status_indicator_share_started": "", - "gui_status_indicator_receive_stopped": "", - "gui_status_indicator_receive_working": "", - "gui_status_indicator_receive_started": "", - "gui_file_info": "", - "gui_file_info_single": "", - "history_in_progress_tooltip": "", - "history_completed_tooltip": "", + "gui_share_url_description": "<b>Siapa saja</b> dengan alamat OnionShare ini dapat <b>mengunduh</b> berkas Anda menggunakan <b>Tor Browser</b>:<img src='{}' />", + "gui_receive_url_description": "<b>Siapa saja</b> dengan alamat OnionShare ini dapat <b>mengunggah</b> berkas ke komputer Anda menggunakan <b>Tor Browser</b>:<img src='{}' />", + "gui_url_label_persistent": "Pembagian ini tidak akan berhenti otomatis.<br><br>Setiap pembagian selanjutnya menggunakan lagi alamat tersebut. (Untuk menggunakan alamat sekali pakai, matikan \"Gunakan alamat persisten\" di pengaturan.)", + "gui_url_label_stay_open": "Pembagian ini tidak akan berhenti otomatis.", + "gui_url_label_onetime": "Pembagian ini akan berhenti setelah penyelesaian pertama.", + "gui_url_label_onetime_and_persistent": "Pembagian ini tidak akan berhenti otomatis.<br><br>Setiap pembagian selanjutnya akan menggunakan lagi alamat tersebut. (Untuk menggunakan alamat sekali pakai, matikan \"Gunakan alamat persisten\" di pengaturan.)", + "gui_status_indicator_share_stopped": "Siap untuk berbagi", + "gui_status_indicator_share_working": "Memulai…", + "gui_status_indicator_share_started": "Berbagi", + "gui_status_indicator_receive_stopped": "Siap untuk menerima", + "gui_status_indicator_receive_working": "Memulai…", + "gui_status_indicator_receive_started": "Menerima", + "gui_file_info": "{} file, {}", + "gui_file_info_single": "{} file, {}", + "history_in_progress_tooltip": "{} sedang berlangsung", + "history_completed_tooltip": "{} selesai", "info_in_progress_uploads_tooltip": "", "info_completed_uploads_tooltip": "", "error_cannot_create_downloads_dir": "", "receive_mode_downloads_dir": "", "receive_mode_warning": "", - "gui_receive_mode_warning": "", + "gui_receive_mode_warning": "Mode menerima membiarkan orang mengunggah berkas ke komputer Anda.<br><br><b>Beberapa berkas dapat berpotensi mengambil alih komputer Anda jika Anda membukanya. Hanya buka hal-hal dari orang yang Anda percaya, atau jika Anda tahu apa yang Anda lakukan.</b>", "receive_mode_upload_starting": "", "receive_mode_received_file": "", "gui_mode_share_button": "", @@ -169,7 +169,7 @@ "gui_settings_public_mode_checkbox": "", "systray_close_server_title": "", "systray_close_server_message": "", - "systray_page_loaded_title": "", + "systray_page_loaded_title": "Halaman dimuat", "systray_download_page_loaded_message": "", "systray_upload_page_loaded_message": "", "gui_uploads": "", @@ -180,13 +180,106 @@ "gui_upload_finished": "", "gui_download_in_progress": "", "gui_open_folder_error_nautilus": "", - "gui_settings_language_label": "", - "gui_settings_language_changed_notice": "", + "gui_settings_language_label": "Bahasa", + "gui_settings_language_changed_notice": "Mulai ulang OnionShare untuk menerapkan bahasa baru.", "gui_add_files": "Tambahkan berkas", "gui_add_folder": "Tambahkan Folder", "gui_settings_onion_label": "Pengaturan Onion", "incorrect_password": "Password salah", "gui_waiting_to_start": "Dijadwalkan akan dimulai pada {}. Klik untuk membatalkan.", "gui_start_server_autostart_timer_tooltip": "Timer mulai otomatis berakhir pada {}", - "gui_stop_server_autostop_timer_tooltip": "Timer berhenti otomatis berakhir pada {}" + "gui_stop_server_autostop_timer_tooltip": "Timer berhenti otomatis berakhir pada {}", + "gui_new_tab_chat_button": "Mengobrol secara Anonim", + "gui_new_tab_website_button": "Host sebuah situs web", + "gui_main_page_share_button": "Mulai Berbagi", + "gui_main_page_website_button": "Mulai Hosting", + "gui_main_page_receive_button": "Mulai Menerima", + "gui_close_tab_warning_cancel": "Batal", + "gui_close_tab_warning_title": "Anda yakin?", + "gui_tab_name_chat": "Obrolan", + "gui_tab_name_website": "Situs web", + "gui_tab_name_receive": "Menerima", + "gui_tab_name_share": "Berbagi", + "gui_main_page_chat_button": "Mulai Obrolan", + "gui_quit_warning_title": "Anda yakin?", + "gui_receive_flatpak_data_dir": "Karena Anda menginstal OnionShare menggunakan Flatpak, Anda harus menyimpan file ke folder di ~/OnionShare.", + "mode_settings_website_disable_csp_checkbox": "Jangan kirim header Kebijakan Keamanan Konten (memungkinkan situs web Anda menggunakan sumber daya pihak ketiga)", + "gui_open_folder_error": "Gagal membuka folder dengan xdg-open. File ada di sini: {}", + "gui_status_indicator_share_scheduled": "Dijadwalkan…", + "error_cannot_create_data_dir": "Tidak dapat membuat folder data OnionShare: {}", + "history_requests_tooltip": "{} permintaan web", + "gui_status_indicator_receive_scheduled": "Dijadwalkan…", + "systray_page_loaded_message": "Alamat OnionShare dimuat", + "gui_all_modes_transfer_canceled": "Dibatalkan {}", + "gui_all_modes_transfer_canceled_range": "Dibatalkan {} - {}", + "gui_all_modes_transfer_finished": "Ditransfer {}", + "gui_all_modes_transfer_finished_range": "Ditransfer {} - {}", + "mode_settings_receive_data_dir_browse_button": "Telusur", + "mode_settings_receive_data_dir_label": "Simpan file ke", + "mode_settings_share_autostop_sharing_checkbox": "Berhenti berbagi setelah file dikirim (hapus centang untuk memperbolehkan mengunduh file individual)", + "mode_settings_client_auth_checkbox": "Gunakan otorisasi klien", + "mode_settings_legacy_checkbox": "Gunakan alamat legacy (layanan onion v2, tidak disarankan)", + "mode_settings_autostop_timer_checkbox": "Hentikan layanan onion pada waktu yang dijadwalkan", + "mode_settings_autostart_timer_checkbox": "Mulai layanan onion pada waktu yang dijadwalkan", + "mode_settings_public_checkbox": "Jangan gunakan kata sandi", + "mode_settings_persistent_checkbox": "Simpan tab ini, dan secara otomatis membukanya saat saya membuka OnionShare", + "mode_settings_advanced_toggle_hide": "Sembunyikan pengaturan lanjut", + "mode_settings_advanced_toggle_show": "Tampilkan pengaturan lanjut", + "gui_quit_warning_cancel": "Batal", + "gui_new_tab_receive_button": "Terima File", + "gui_new_tab_share_button": "Bagikan file", + "gui_new_tab_tooltip": "Buka tab baru", + "gui_new_tab": "Tab Baru", + "seconds_first_letter": "d", + "minutes_first_letter": "m", + "hours_first_letter": "j", + "days_first_letter": "h", + "gui_receive_mode_autostop_timer_waiting": "Menunggu untuk menyelesaikan penerimaan", + "gui_receive_mode_no_files": "Belum Ada File yang Diterima", + "gui_website_mode_no_files": "Belum Ada Situs Web yang Dibagikan", + "gui_share_mode_autostop_timer_waiting": "Menunggu untuk menyelesaikan pengiriman", + "gui_share_mode_no_files": "Belum Ada File yang Dikirim", + "gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%", + "gui_all_modes_progress_starting": "{0:s}, %p% (menghitung)", + "gui_all_modes_progress_complete": "%p%, {0:s} berlalu.", + "gui_all_modes_transfer_started": "Dimulai {}", + "gui_all_modes_clear_history": "Bersihkan Semua", + "gui_all_modes_history": "Riwayat", + "systray_receive_started_message": "Seseorang mengirim file kepada Anda", + "systray_receive_started_title": "Menerima Dimulai", + "systray_share_canceled_message": "Seseorang membatalkan menerima file Anda", + "systray_share_canceled_title": "Berbagi Dibatalkan", + "systray_share_completed_message": "Selesai mengirim file", + "systray_share_completed_title": "Berbagi Selesai", + "systray_share_started_message": "Mulai mengirim file ke seseorang", + "systray_share_started_title": "Berbagi dimulai", + "gui_color_mode_changed_notice": "Mulai ulang OnionShare agar mode warna baru diterapkan.", + "gui_qr_code_dialog_title": "Kode QR OnionShare", + "gui_show_url_qr_code": "Tampilkan kode QR", + "error_port_not_available": "Port OnionShare tidak tersedia", + "gui_chat_stop_server": "Hentikan server obrolan", + "gui_chat_start_server": "Mulai server obrolan", + "gui_file_selection_remove_all": "Hapus Semua", + "gui_remove": "Hapus", + "history_receive_read_message_button": "Baca Pesan", + "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Waktu berhenti otomatis tidak boleh sama atau lebih awal dari waktu mulai otomatis. Silakan sesuaikan untuk mulai berbagi.", + "gui_rendezvous_cleanup_quit_early": "Keluar Dini", + "gui_rendezvous_cleanup": "Menunggu sirkuit Tor menutup untuk memastikan berkas Anda telah berhasil ditransfer.\n\nIni mungkin perlu beberapa menit.", + "mode_settings_receive_webhook_url_checkbox": "Gunakan notifikasi webhook", + "mode_settings_receive_disable_files_checkbox": "Nonaktifkan pengunggahan berkas", + "mode_settings_receive_disable_text_checkbox": "Nonaktifkan pengiriman teks", + "mode_settings_title_label": "Judul kustom", + "gui_quit_warning_description": "Pembagian sedang aktif di beberapa tab Anda. Jika Anda keluar, seluruh tab Anda akan tertutup. Apakah Anda yakin mau keluar?", + "gui_close_tab_warning_close": "Tutup", + "gui_close_tab_warning_website_description": "Anda secara aktif menghosting situs web. Apakah Anda yakin mau menutup tab ini?", + "gui_close_tab_warning_receive_description": "Anda dalam proses menerima berkas. Apakah Anda yakin mau menutup tab ini?", + "gui_close_tab_warning_share_description": "Anda dalam proses mengirim berkas. Apakah Anda yakin mau menutup tab ini?", + "gui_close_tab_warning_persistent_description": "Tab ini persisten. Jika Anda menutup tab ini Anda akan kehilangan alamat onion yang sedang digunakan. Apakah Anda yakin mau menutup tab ini?", + "gui_chat_url_description": "<b>Siapa saja</b> dengan alamat OnionShare ini dapat <b>bergabung di ruang obrolan ini</b> menggunakan <b>Tor Browser</b>:<img src='{}' />", + "gui_website_url_description": "<b>Siapa saja</b> dengan alamat OnionShare ini dapat <b>mengunjungi</b> situs web Anda menggunakan <b>Tor Browser</b>:<img src='{}' />", + "gui_server_autostart_timer_expired": "Waktu yang dijadwalkan telah terlewati. Silakan sesuaikan waktu untuk memulai berbagi.", + "gui_status_indicator_chat_started": "Mengobrol", + "gui_status_indicator_chat_scheduled": "Menjadwalkan…", + "gui_status_indicator_chat_working": "Memulai…", + "gui_status_indicator_chat_stopped": "Siap untuk mengobrol" } diff --git a/desktop/src/onionshare/resources/locale/is.json b/desktop/src/onionshare/resources/locale/is.json index 039b12f7..bdbc0e6b 100644 --- a/desktop/src/onionshare/resources/locale/is.json +++ b/desktop/src/onionshare/resources/locale/is.json @@ -288,5 +288,15 @@ "error_port_not_available": "OnionShare-gátt ekki tiltæk", "gui_rendezvous_cleanup_quit_early": "Hætta snemma", "gui_rendezvous_cleanup": "Bíð eftir að Tor-rásir lokist svo öruggt sé að tekist hafi að flytja skrárnar þínar.\n\nÞetta gæti tekið nokkrar mínútur.", - "gui_color_mode_changed_notice": "Endurræstu OnionShare svo nýja litastefið taki gildi." + "gui_color_mode_changed_notice": "Endurræstu OnionShare svo nýja litastefið taki gildi.", + "history_receive_read_message_button": "Lesa skilaboð", + "mode_settings_receive_webhook_url_checkbox": "Nota webhook fyrir tilkynningar", + "mode_settings_receive_disable_files_checkbox": "Gera innsendingu skráa óvirka", + "mode_settings_receive_disable_text_checkbox": "Gera innsendingu texta óvirka", + "mode_settings_title_label": "Sérsniðinn titill", + "gui_status_indicator_chat_started": "Spjalla", + "gui_status_indicator_chat_scheduled": "Áætlað…", + "gui_status_indicator_chat_working": "Ræsi…", + "gui_status_indicator_chat_stopped": "Tilbúið í spjall", + "gui_please_wait_no_button": "Ræsi…" } diff --git a/desktop/src/onionshare/resources/locale/it.json b/desktop/src/onionshare/resources/locale/it.json index f04bf3ef..1adee18b 100644 --- a/desktop/src/onionshare/resources/locale/it.json +++ b/desktop/src/onionshare/resources/locale/it.json @@ -70,7 +70,7 @@ "help_receive": "Ricevi le condivisioni invece di inviarle", "gui_settings_stealth_option": "Usa l'autorizzazione client (legacy)", "gui_settings_stealth_hidservauth_string": "Avendo salvato la tua chiave privata per il riutilizzo, puoi cliccare per copiare il tuo HidServAuth.", - "gui_settings_autoupdate_label": "Controlla se c'è una nuova versione", + "gui_settings_autoupdate_label": "Verifica se c'è una nuova versione", "gui_settings_autoupdate_option": "Avvisami quando è disponibile una nuova versione", "gui_settings_autoupdate_timestamp": "Ultimo controllo: {}", "gui_settings_autoupdate_timestamp_never": "Mai", @@ -213,7 +213,7 @@ "gui_share_mode_autostop_timer_waiting": "In attesa di finire l'invio", "gui_receive_mode_no_files": "Nessun file ricevuto ancora", "gui_receive_mode_autostop_timer_waiting": "In attesa di finire la ricezione", - "gui_stop_server_autostop_timer_tooltip": "Il timer auto-stop terminerà alle {}", + "gui_stop_server_autostop_timer_tooltip": "Il timer di arresto automatico termina alle {}", "gui_start_server_autostart_timer_tooltip": "Il timer Auto-start termina alle {}", "gui_waiting_to_start": "Programmato per avviarsi in {}. Clicca per annullare.", "gui_settings_autostart_timer_checkbox": "Usa il timer a partenza automatica", @@ -263,7 +263,7 @@ "gui_quit_warning_description": "La condivisione è attiva in alcune delle tue schede. Uscendo, tutte le tue schede verranno chiuse. Sei sicuro di voler uscire?", "gui_quit_warning_title": "Sei sicuro?", "gui_close_tab_warning_close": "Chiudi", - "gui_close_tab_warning_website_description": "Stai ospitando attivamente un sito web. Sei sicuro di voler chiudere questa scheda?", + "gui_close_tab_warning_website_description": "Stai ospitando un sito web. Sei sicuro di voler chiudere questa scheda?", "mode_settings_website_disable_csp_checkbox": "Non inviare l'intestazione della Politica sulla Sicurezza dei Contenuti (consente al sito web di utilizzare risorse di terze parti)", "mode_settings_receive_data_dir_browse_button": "Naviga", "mode_settings_client_auth_checkbox": "Usa l'autorizzazione del client", @@ -280,5 +280,7 @@ "mode_settings_legacy_checkbox": "Usa un indirizzo legacy (servizio onion v2, non consigliato)", "mode_settings_public_checkbox": "Non usare una password", "gui_rendezvous_cleanup_quit_early": "Chiudi in anticipo", - "gui_rendezvous_cleanup": "In attesa che i circuiti Tor si chiudano per essere sicuri che i file siano stati trasferiti con successo.\n\nQuesto potrebbe richiedere alcuni minuti." + "gui_rendezvous_cleanup": "In attesa che i circuiti Tor si chiudano per assicurarsi che i file siano stati trasferiti con successo.\n\nQuesto potrebbe richiedere alcuni minuti.", + "error_port_not_available": "Porta OnionShare non disponibile", + "gui_color_mode_changed_notice": "Riavvia OnionShare per applicare la nuova modalità colore." } diff --git a/desktop/src/onionshare/resources/locale/lt.json b/desktop/src/onionshare/resources/locale/lt.json index b34bb52a..f3e76e9b 100644 --- a/desktop/src/onionshare/resources/locale/lt.json +++ b/desktop/src/onionshare/resources/locale/lt.json @@ -4,10 +4,10 @@ "no_available_port": "", "other_page_loaded": "Adresas įkeltas", "incorrect_password": "Neteisingas slaptažodis", - "close_on_autostop_timer": "", + "close_on_autostop_timer": "Sustabdyta, nes baigėsi automatinio sustabdymo laikmatis", "closing_automatically": "Sustabdyta, nes perdavimas yra užbaigtas", "large_filesize": "Įspėjimas: Didelio viešinio siuntimas gali užtrukti ilgą laiką (kelias valandas)", - "gui_drag_and_drop": "Norėdami bendrinti,\ntempkite čia failus ir aplankus", + "gui_drag_and_drop": "Norėdami bendrinti, tempkite failus ir aplankus čia", "gui_add": "Pridėti", "gui_add_files": "Pridėti failus", "gui_add_folder": "Pridėti aplanką", @@ -16,8 +16,8 @@ "gui_share_start_server": "Pradėti bendrinti", "gui_share_stop_server": "Nustoti bendrinti", "gui_share_stop_server_autostop_timer": "Nustoti bendrinti ({})", - "gui_stop_server_autostop_timer_tooltip": "", - "gui_start_server_autostart_timer_tooltip": "", + "gui_stop_server_autostop_timer_tooltip": "Automatinio sustabdymo laikmatis baigiasi {}", + "gui_start_server_autostart_timer_tooltip": "Automatinio paleidimo laikmatis baigiasi {}", "gui_receive_start_server": "Įjungti gavimo veikseną", "gui_receive_stop_server": "Išjungti gavimo veikseną", "gui_receive_stop_server_autostop_timer": "Išjungti gavimo veikseną (Liko {})", @@ -28,9 +28,9 @@ "gui_copied_url": "OnionShare adresas nukopijuotas į iškarpinę", "gui_copied_hidservauth_title": "HidServAuth nukopijuota", "gui_copied_hidservauth": "HidServAuth eilutė nukopijuota į iškarpinę", - "gui_waiting_to_start": "", + "gui_waiting_to_start": "Planuojama pradėti {}. Spustelėkite , jei norite atšaukti.", "gui_please_wait": "Pradedama… Spustelėkite norėdami atsisakyti.", - "error_rate_limit": "", + "error_rate_limit": "Kažkas padarė per daug klaidingų bandymų atspėti jūsų slaptažodį, todėl „OnionShare“ sustabdė serverį. Vėl pradėkite bendrinti ir nusiųskite gavėjui naują bendrinimo adresą.", "zip_progress_bar_format": "Glaudinama: %p%", "error_stealth_not_supported": "", "error_ephemeral_not_supported": "", @@ -40,7 +40,7 @@ "gui_settings_stealth_hidservauth_string": "", "gui_settings_autoupdate_label": "Tikrinti, ar yra nauja versija", "gui_settings_autoupdate_option": "Pranešti, kai bus prieinama nauja versija", - "gui_settings_autoupdate_timestamp": "", + "gui_settings_autoupdate_timestamp": "Paskutinį kartą tikrinta: {}", "gui_settings_autoupdate_timestamp_never": "Niekada", "gui_settings_autoupdate_check_button": "Tikrinti, ar yra nauja versija", "gui_settings_general_label": "Bendri nustatymai", @@ -50,25 +50,25 @@ "gui_settings_csp_header_disabled_option": "", "gui_settings_individual_downloads_label": "", "gui_settings_connection_type_label": "Kaip OnionShare turėtų jungtis prie Tor?", - "gui_settings_connection_type_bundled_option": "", - "gui_settings_connection_type_automatic_option": "", - "gui_settings_connection_type_control_port_option": "", - "gui_settings_connection_type_socket_file_option": "", - "gui_settings_connection_type_test_button": "", - "gui_settings_control_port_label": "", - "gui_settings_socket_file_label": "", + "gui_settings_connection_type_bundled_option": "Naudokite „Tor“ versiją, integruotą į „OnionShare“", + "gui_settings_connection_type_automatic_option": "Bandyti automatiškai konfigūruoti naudojant „Tor“ naršyklę", + "gui_settings_connection_type_control_port_option": "Prisijunkti naudojant valdymo prievadą", + "gui_settings_connection_type_socket_file_option": "Prisijungti naudojant socket failą", + "gui_settings_connection_type_test_button": "Tikrinti ryšį su „Tor“", + "gui_settings_control_port_label": "Valdymo prievadas", + "gui_settings_socket_file_label": "Socket failas", "gui_settings_socks_label": "SOCKS prievadas", - "gui_settings_authenticate_label": "", - "gui_settings_authenticate_no_auth_option": "", + "gui_settings_authenticate_label": "Tor autentifikavimo nustatymai", + "gui_settings_authenticate_no_auth_option": "Jokio autentifikavimo ar slapukų autentifikavimo", "gui_settings_authenticate_password_option": "Slaptažodis", "gui_settings_password_label": "Slaptažodis", - "gui_settings_tor_bridges": "", - "gui_settings_tor_bridges_no_bridges_radio_option": "", - "gui_settings_tor_bridges_obfs4_radio_option": "", - "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "", - "gui_settings_tor_bridges_meek_lite_azure_radio_option": "", - "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "", - "gui_settings_meek_lite_expensive_warning": "", + "gui_settings_tor_bridges": "„Tor“ tilto palaikymas", + "gui_settings_tor_bridges_no_bridges_radio_option": "Nenaudoti tiltų", + "gui_settings_tor_bridges_obfs4_radio_option": "Naudoti integruotą obfs4 prijungiamą transportą", + "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Naudoti integruotą obfs4 prijungiamą transportą (reikalingas obfs4proxy)", + "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Naudoti integruotus meek_lite („Azure“) prijungiamus transportus", + "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Naudoti integruotus meek_lite („Azure“) prijungiamus transportus (reikalingas obfs4proxy)", + "gui_settings_meek_lite_expensive_warning": "Įspėjimas: <br><br>Meek_lite tiltai labai brangiai kainuoja „Tor“ projektui.<br><br>Jais naudokitės tik tuo atveju, jei negalite prisijungti prie „Tor“ tiesiogiai, per obfs4 transportą ar kitus įprastus tiltus.", "gui_settings_tor_bridges_custom_radio_option": "Naudoti tinkintus tinklų tiltus", "gui_settings_tor_bridges_custom_label": "Galite gauti tinklų tiltus iš <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>", "gui_settings_tor_bridges_invalid": "Nei vienas iš jūsų pridėtų tinklų tiltų neveikia.\nPatikrinkite juos dar kartą arba pridėkite kitus.", @@ -79,60 +79,60 @@ "gui_settings_autostop_timer": "", "gui_settings_autostart_timer_checkbox": "", "gui_settings_autostart_timer": "", - "settings_error_unknown": "", - "settings_error_automatic": "", - "settings_error_socket_port": "", - "settings_error_socket_file": "", - "settings_error_auth": "", - "settings_error_missing_password": "", - "settings_error_unreadable_cookie_file": "", - "settings_error_bundled_tor_not_supported": "", - "settings_error_bundled_tor_timeout": "", + "settings_error_unknown": "Nepavyksta prisijungti prie „Tor“ valdiklio, nes jūsų nustatymai nustatyti nesuprantamai.", + "settings_error_automatic": "Nepavyko prisijungti prie „Tor“ valdiklio. Ar „Tor“ naršyklė (prieinama torproject.org) veikia fone?", + "settings_error_socket_port": "Nepavyksta prisijungti prie „Tor“ valdiklio adresu {}:{}.", + "settings_error_socket_file": "Negalima prisijungti prie „Tor“ valdiklio naudojant lizdo failą {}.", + "settings_error_auth": "Prisijungta prie {}:{}, bet negalima patvirtinti autentiškumo. Galbūt tai ne „Tor“ valdiklis?", + "settings_error_missing_password": "Prisijungta prie „Tor“ valdiklio, tačiau norint jį autentifikuoti reikia slaptažodžio.", + "settings_error_unreadable_cookie_file": "Prisijungta prie „Tor“ valdiklio, bet slaptažodis gali būti klaidingas arba jūsų naudotojui neleidžiama skaityti slapukų failo.", + "settings_error_bundled_tor_not_supported": "Naudojant „Tor“ versiją, kuri pateikiama kartu su \"OnionShare\", \"Windows\" arba \"macOS\" sistemose ji neveiks kūrėjo režime.", + "settings_error_bundled_tor_timeout": "Per ilgai trunka prisijungimas prie „Tor“. Galbūt nesate prisijungę prie interneto arba turite netikslų sistemos laikrodį?", "settings_error_bundled_tor_broken": "OnionShare nepavyko prisijungti prie Tor:\n{}", - "settings_test_success": "", - "error_tor_protocol_error": "", + "settings_test_success": "Prisijungta prie „Tor“ valdiklio.\n\n„Tor“ versija: {}\nPalaiko efemerines onion paslaugas: {}.\nPalaiko kliento autentifikavimą: {}.\nPalaiko naujos kartos .onion adresus: {}.", + "error_tor_protocol_error": "Įvyko „Tor“ klaida: {}", "error_tor_protocol_error_unknown": "", "connecting_to_tor": "Jungiamasi prie Tor tinklo", - "update_available": "", - "update_error_invalid_latest_version": "", - "update_error_check_error": "", + "update_available": "Išleistas naujas „OnionShare“. <a href='{}'>Paspauskite čia</a>, kad jį gautumėte.<br><br>Jūs naudojate {}, o naujausia versija yra {}.", + "update_error_invalid_latest_version": "Nepavyko patikrinti naujos versijos: „OnionShare“ svetainė sako, kad naujausia versija yra neatpažįstama „{}“…", + "update_error_check_error": "Nepavyko patikrinti naujos versijos: Galbūt nesate prisijungę prie „Tor“ arba „OnionShare“ svetainė neveikia?", "update_not_available": "Jūs naudojate naujausią OnionShare versiją.", - "gui_tor_connection_ask": "", + "gui_tor_connection_ask": "Atidarykite nustatymus, kad sutvarkytumėte ryšį su „Tor“?", "gui_tor_connection_ask_open_settings": "Taip", "gui_tor_connection_ask_quit": "Išeiti", "gui_tor_connection_error_settings": "Pabandykite nustatymuose pakeisti tai, kaip OnionShare jungiasi prie Tor tinklo.", "gui_tor_connection_canceled": "Nepavyko prisijungti prie Tor.\n\nĮsitikinkite, kad esate prisijungę prie interneto, o tuomet iš naujo atverkite OnionShare ir nustatykite prisijungimą prie Tor.", "gui_tor_connection_lost": "Atsijungta nuo Tor.", - "gui_server_started_after_autostop_timer": "", - "gui_server_autostop_timer_expired": "", - "gui_server_autostart_timer_expired": "", - "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "", + "gui_server_started_after_autostop_timer": "Automatinio sustabdymo laikmatis baigėsi prieš paleidžiant serverį. Prašome sukurti naują bendrinimą.", + "gui_server_autostop_timer_expired": "Automatinio sustabdymo laikmatis jau baigėsi. Sureguliuokite jį, kad pradėtumėte dalintis.", + "gui_server_autostart_timer_expired": "Numatytas laikas jau praėjo. Pakoreguokite jį, kad galėtumėte pradėti dalintis.", + "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Automatinio sustabdymo laikas negali būti toks pat arba ankstesnis už automatinio paleidimo laiką. Sureguliuokite jį, kad galėtumėte pradėti dalytis.", "share_via_onionshare": "Bendrinti per OnionShare", "gui_connect_to_tor_for_onion_settings": "", "gui_use_legacy_v2_onions_checkbox": "", "gui_save_private_key_checkbox": "", "gui_share_url_description": "<b>Visi</b>, turintys šį OnionShare adresą gali <b>atsisiųsti</b> jūsų failus, naudodamiesi <b>Tor Naršykle</b>: <img src='{}' />", - "gui_website_url_description": "", - "gui_receive_url_description": "", - "gui_url_label_persistent": "", - "gui_url_label_stay_open": "", - "gui_url_label_onetime": "", - "gui_url_label_onetime_and_persistent": "", - "gui_status_indicator_share_stopped": "", + "gui_website_url_description": "<b>Kiekvienas</b>, turintis šį „OnionShare“ adresą, gali <b>apsilankyti</b> jūsų svetainėje naudodamas <b>„Tor“ naršyklę</b>: <img src='{}' />", + "gui_receive_url_description": "<b>Kiekvienas</b>, turintis šį „OnionShare“ adresą, gali <b>įkelti</b> failus į jūsų kompiuterį naudodamas <b>„Tor“ naršyklę</b>: <img src='{}' />", + "gui_url_label_persistent": "Šis bendrinimas nebus automatiškai sustabdytas.<br><br>Kiekvienas vėlesnis bendrinimas pakartotinai naudoja adresą. (Norėdami naudoti vienkartinius adresus, nustatymuose išjunkite \"Naudoti nuolatinį adresą\".)", + "gui_url_label_stay_open": "Šis bendrinimas nebus automatiškai sustabdytas.", + "gui_url_label_onetime": "Šis bendrinimas pabaigus bus automatiškai sustabdytas.", + "gui_url_label_onetime_and_persistent": "Šis bendrinimas nebus automatiškai sustabdytas.<br><br>Kiekvienas vėlesnis bendrinimas pakartotinai naudos adresą. (Norėdami naudoti vienkartinius adresus, nustatymuose išjunkite \"Naudoti nuolatinį adresą\".)", + "gui_status_indicator_share_stopped": "Parengta dalintis", "gui_status_indicator_share_working": "Pradedama…", - "gui_status_indicator_share_scheduled": "", - "gui_status_indicator_share_started": "", - "gui_status_indicator_receive_stopped": "", - "gui_status_indicator_receive_working": "", - "gui_status_indicator_receive_scheduled": "", + "gui_status_indicator_share_scheduled": "Suplanuota…", + "gui_status_indicator_share_started": "Dalijimasis", + "gui_status_indicator_receive_stopped": "Parengta gauti", + "gui_status_indicator_receive_working": "Pradedama…", + "gui_status_indicator_receive_scheduled": "Suplanuota…", "gui_status_indicator_receive_started": "Gaunama", - "gui_file_info": "", - "gui_file_info_single": "", - "history_in_progress_tooltip": "", - "history_completed_tooltip": "", - "history_requests_tooltip": "", + "gui_file_info": "{} failai, {}", + "gui_file_info_single": "{} failas, {}", + "history_in_progress_tooltip": "{} vykdoma", + "history_completed_tooltip": "{} baigta", + "history_requests_tooltip": "{} žiniatinklio užklausos", "error_cannot_create_data_dir": "Nepavyko sukurti OnionShare duomenų aplanko: {}", - "gui_receive_mode_warning": "", + "gui_receive_mode_warning": "Gavimo režimas leidžia žmonėms nusiųsti failus į jūsų kompiuterį. <br><br><b>Kai kurie failai gali perimti kompiuterio valdymą, jei juos atidarysite. Atidarykite failus tik iš žmonių, kuriais pasitikite, arba jei žinote, ką darote.</b>", "gui_mode_share_button": "", "gui_mode_receive_button": "", "gui_mode_website_button": "", @@ -147,67 +147,93 @@ "systray_menu_exit": "Išeiti", "systray_page_loaded_title": "Puslapis įkeltas", "systray_page_loaded_message": "OnionShare adresas įkeltas", - "systray_share_started_title": "", + "systray_share_started_title": "Pradėtas dalijimasis", "systray_share_started_message": "Pradedama kažkam siųsti failus", - "systray_share_completed_title": "", + "systray_share_completed_title": "Dalijimasis baigtas", "systray_share_completed_message": "Failų siuntimas užbaigtas", - "systray_share_canceled_title": "", - "systray_share_canceled_message": "", - "systray_receive_started_title": "", + "systray_share_canceled_title": "Dalijimasis atšauktas", + "systray_share_canceled_message": "Kažkas atšaukė jūsų failų gavimą", + "systray_receive_started_title": "Pradėtas gavimas", "systray_receive_started_message": "Kažkas siunčia jums failus", "gui_all_modes_history": "Istorija", - "gui_all_modes_clear_history": "", - "gui_all_modes_transfer_started": "", - "gui_all_modes_transfer_finished_range": "", - "gui_all_modes_transfer_finished": "", - "gui_all_modes_transfer_canceled_range": "", - "gui_all_modes_transfer_canceled": "", - "gui_all_modes_progress_complete": "", + "gui_all_modes_clear_history": "Išvalyti viską", + "gui_all_modes_transfer_started": "Pradėta {}", + "gui_all_modes_transfer_finished_range": "Perkelta {} - {}", + "gui_all_modes_transfer_finished": "Perkelta {}", + "gui_all_modes_transfer_canceled_range": "Atšaukta {} - {}", + "gui_all_modes_transfer_canceled": "Atšaukta {}", + "gui_all_modes_progress_complete": "Praėjo %p%, {0:s}.", "gui_all_modes_progress_starting": "{0:s}, %p% (apskaičiuojama)", - "gui_all_modes_progress_eta": "", + "gui_all_modes_progress_eta": "{0:s}, Preliminarus laikas: {1:s}, %p%", "gui_share_mode_no_files": "Kol kas nėra išsiųstų failų", - "gui_share_mode_autostop_timer_waiting": "", - "gui_website_mode_no_files": "", + "gui_share_mode_autostop_timer_waiting": "Laukiama, kol bus baigtas siuntimas", + "gui_website_mode_no_files": "Dar nėra bendrinama jokia svetainė", "gui_receive_mode_no_files": "Kol kas nėra gautų failų", - "gui_receive_mode_autostop_timer_waiting": "", - "days_first_letter": "d.", - "hours_first_letter": "", - "minutes_first_letter": "", - "seconds_first_letter": "", + "gui_receive_mode_autostop_timer_waiting": "Laukiama, kol bus baigtas gavimas", + "days_first_letter": "d", + "hours_first_letter": "val", + "minutes_first_letter": "min", + "seconds_first_letter": "s", "gui_new_tab": "Nauja kortelė", "gui_new_tab_tooltip": "Atverti naują kortelę", - "gui_new_tab_share_button": "", + "gui_new_tab_share_button": "Dalytis failais", "gui_new_tab_share_description": "", - "gui_new_tab_receive_button": "", + "gui_new_tab_receive_button": "Gauti failus", "gui_new_tab_receive_description": "", - "gui_new_tab_website_button": "", + "gui_new_tab_website_button": "Talpinti svetainę", "gui_new_tab_website_description": "", "gui_close_tab_warning_title": "Ar tikrai?", - "gui_close_tab_warning_persistent_description": "", - "gui_close_tab_warning_share_description": "", - "gui_close_tab_warning_receive_description": "", - "gui_close_tab_warning_website_description": "", + "gui_close_tab_warning_persistent_description": "Šis skirtukas yra nuolatinis. Jei jį uždarysite, prarasite jo naudojamą onion adresą. Ar tikrai norite jį uždaryti?", + "gui_close_tab_warning_share_description": "Šiuo metu siunčiate failus. Ar tikrai norite uždaryti šį skirtuką?", + "gui_close_tab_warning_receive_description": "Šiuo metu gaunate failus. Ar tikrai norite uždaryti šį skirtuką?", + "gui_close_tab_warning_website_description": "Aktyviai talpinate svetainę. Ar tikrai norite uždaryti šį skirtuką?", "gui_close_tab_warning_close": "Užverti", "gui_close_tab_warning_cancel": "Atsisakyti", "gui_quit_warning_title": "Ar tikrai?", - "gui_quit_warning_description": "", + "gui_quit_warning_description": "Kuriuose skirtukuose yra aktyviai dalijamasi . Jei išeisite, visi skirtukai bus uždaryti. Ar tikrai norite baigti?", "gui_quit_warning_quit": "Išeiti", "gui_quit_warning_cancel": "Atsisakyti", "mode_settings_advanced_toggle_show": "Rodyti išplėstinius nustatymus", "mode_settings_advanced_toggle_hide": "Slėpti išplėstinius nustatymus", - "mode_settings_persistent_checkbox": "", + "mode_settings_persistent_checkbox": "Išsaugoti šį skirtuką ir automatiškai jį atidaryti, kai atidarysiu „OnionShare“", "mode_settings_public_checkbox": "Nenaudoti slaptažodžio", - "mode_settings_autostart_timer_checkbox": "", - "mode_settings_autostop_timer_checkbox": "", - "mode_settings_legacy_checkbox": "", - "mode_settings_client_auth_checkbox": "", - "mode_settings_share_autostop_sharing_checkbox": "", + "mode_settings_autostart_timer_checkbox": "Pradėti onion paslaugos paleidimą suplanuotu laiku", + "mode_settings_autostop_timer_checkbox": "Sustabdyti onion paslaugos paleidimą suplanuotu laiku", + "mode_settings_legacy_checkbox": "Naudoti senąjį adresą (nerekomenduojama naudoti v2 onion paslaugos)", + "mode_settings_client_auth_checkbox": "Naudoti kliento autorizavimą", + "mode_settings_share_autostop_sharing_checkbox": "Sustabdyti dalijimąsi po to, kai failai buvo išsiųsti (atžymėkite, jei norite leisti atsisiųsti atskirus failus)", "mode_settings_receive_data_dir_label": "Įrašyti failus į", "mode_settings_receive_data_dir_browse_button": "Naršyti", - "mode_settings_website_disable_csp_checkbox": "", + "mode_settings_website_disable_csp_checkbox": "Nesiųskite turinio saugumo politikos antraštės (leidžia jūsų svetainei naudoti trečiųjų šalių išteklius)", "gui_file_selection_remove_all": "Šalinti visus", "gui_remove": "Šalinti", "gui_qr_code_dialog_title": "OnionShare QR kodas", "gui_show_url_qr_code": "Rodyti QR kodą", - "gui_open_folder_error": "Nepavyko atverti aplanko naudojant xdg-open. Failas yra čia: {}" + "gui_open_folder_error": "Nepavyko atverti aplanko naudojant xdg-open. Failas yra čia: {}", + "gui_chat_stop_server": "Sustabdyti pokalbių serverį", + "gui_chat_start_server": "Pradėti pokalbių serverį", + "history_receive_read_message_button": "Skaityti žinutę", + "mode_settings_title_label": "Pasirinktinis pavadinimas", + "gui_main_page_chat_button": "Pradėti pokalbį", + "gui_main_page_receive_button": "Pradėti gavimą", + "gui_main_page_share_button": "Pradėti dalintis", + "gui_new_tab_chat_button": "Kalbėtis anonimiškai", + "gui_status_indicator_chat_scheduled": "Suplanuota…", + "gui_status_indicator_chat_working": "Pradedama…", + "gui_tab_name_chat": "Pokalbiai", + "gui_tab_name_website": "Tinklalapis", + "gui_tab_name_receive": "Gauti", + "gui_tab_name_share": "Dalintis", + "gui_receive_flatpak_data_dir": "Kadangi „OnionShare“ įdiegėte naudodami „Flatpak“, turite išsaugoti failus aplanke, esančiame ~/OnionShare.", + "mode_settings_receive_webhook_url_checkbox": "Naudoti pranešimų webhook", + "gui_main_page_website_button": "Pradėti talpinimą", + "gui_status_indicator_chat_started": "Kalbamasi", + "gui_status_indicator_chat_stopped": "Paruošta pokalbiui", + "gui_color_mode_changed_notice": "Iš naujo paleiskite „OnionShare“, kad būtų pritaikytas naujas spalvų režimas.", + "mode_settings_receive_disable_files_checkbox": "Išjungti failų įkėlimą", + "mode_settings_receive_disable_text_checkbox": "Išjungti teksto pateikimą", + "gui_rendezvous_cleanup": "Laukiama, kol užsidarys „Tor“ grandinės, kad įsitikintume, jog jūsų failai sėkmingai perkelti.\n\nTai gali užtrukti kelias minutes.", + "gui_rendezvous_cleanup_quit_early": "Išeiti anksčiau", + "error_port_not_available": "„OnionShare“ prievadas nepasiekiamas", + "gui_chat_url_description": "<b>Kiekvienas</b>, turintis šį „OnionShare“ adresą, gali <b>prisijungti prie šio pokalbių kambario</b> naudodamas <b>„Tor“ naršyklę</b>: <img src='{}' />" } diff --git a/desktop/src/onionshare/resources/locale/nb_NO.json b/desktop/src/onionshare/resources/locale/nb_NO.json index 54db60df..f2ee1477 100644 --- a/desktop/src/onionshare/resources/locale/nb_NO.json +++ b/desktop/src/onionshare/resources/locale/nb_NO.json @@ -118,7 +118,7 @@ "settings_error_bundled_tor_timeout": "Det tar for lang tid å koble til Tor. Kanskje du ikke er koblet til Internett, eller har du kanskje en unøyaktig systemklokke?", "settings_error_bundled_tor_broken": "OnionShare kunne ikke koble til Tor i bakgrunnen:\n{}", "settings_test_success": "Koblet til Tor-kontrolleren.\n\nTor-versjon: {}.\nStøtter flyktige løk-tjenester: {}.\nStøtter klientidentifisering: {}.\nStøtter nestegenerasjons .onion-adresser: {}.", - "error_tor_protocol_error": "Feil med Tor: {}", + "error_tor_protocol_error": "Det oppsto en feil med Tor: {}", "error_tor_protocol_error_unknown": "Ukjent feil med Tor", "error_invalid_private_key": "Denne private nøkkeltypen er ikke støttet", "connecting_to_tor": "Kobler til Tor-nettverket", @@ -296,5 +296,10 @@ "error_port_not_available": "OnionShare-port ikke tilgjengelig", "gui_rendezvous_cleanup_quit_early": "Avslutt tidlig", "gui_rendezvous_cleanup": "Venter på at Tor-kretsene lukkes for å være sikker på at filene dine er overført.\n\nDette kan ta noen minutter.", - "gui_color_mode_changed_notice": "Start OnionShare på nytt for å bruke nytt fargemodus." + "gui_color_mode_changed_notice": "Start OnionShare på nytt for å bruke nytt fargemodus.", + "history_receive_read_message_button": "Les melding", + "mode_settings_receive_webhook_url_checkbox": "Bruk varsling webhook", + "mode_settings_receive_disable_files_checkbox": "Deaktiver opplasting av filer", + "mode_settings_receive_disable_text_checkbox": "Deaktiver innsending av tekst", + "mode_settings_title_label": "Egendefinert tittel" } diff --git a/desktop/src/onionshare/resources/locale/nl.json b/desktop/src/onionshare/resources/locale/nl.json index 2b5ced73..32e8f204 100644 --- a/desktop/src/onionshare/resources/locale/nl.json +++ b/desktop/src/onionshare/resources/locale/nl.json @@ -26,7 +26,7 @@ "help_verbose": "Log OnionShare fouten naar stdout, en web fouten naar disk", "help_filename": "Lijst van bestanden of mappen om te delen", "help_config": "Instelbaar pad naar JSON configuratie bestand (optioneel)", - "gui_drag_and_drop": "Sleep en zet\nbestanden hier neer om het delen te starten", + "gui_drag_and_drop": "Sleep bestanden hier naar toe om het delen te starten", "gui_add": "Toevoegen", "gui_delete": "Verwijder", "gui_choose_items": "Kies", @@ -75,7 +75,7 @@ "gui_settings_button_help": "Help", "gui_settings_autostop_timer": "Stop het delen om:", "settings_saved": "Instellingen opgeslagen in {}", - "settings_error_unknown": "Kan geen verbinding maken met de Tor controller omdat je instellingen nergens op slaan.", + "settings_error_unknown": "Kan geen verbinding maken met de Tor controller, omdat je instellingen nergens op slaan.", "settings_error_automatic": "Kon geen verbinding maken met de Tor controller. Draait Tor Browser (beschikbaar via torproject.org) in de achtergrond?", "settings_error_socket_port": "Kan geen verbinding maken met de Tor controller op {}:{}.", "settings_error_socket_file": "Kan geen verbinding maken met de Tor controller via socket bestand {}.", @@ -88,9 +88,9 @@ "settings_test_success": "Verbonden met de Tor controller.\n\nTor versie: {}\nOndersteunt ephemeral onion services: {}.\nOndersteunt client authentication: {}.\nOndersteunt next-gen .onion addresses: {}.", "error_tor_protocol_error": "Er was een fout met Tor: {}", "connecting_to_tor": "Verbinden met het Tor netwerk", - "update_available": "Nieuwe OnionShare is uitgekomen. <a href='{}'>Klik hier</a> om hem te krijgen.<br><br>Jij gebruikt {} and de laatste is {}.", - "update_error_check_error": "Kon niet controleren op een nieuwe versie: de OnionShare website meldt dat de laatste versie de onherkenbare is '{}' is…", - "update_error_invalid_latest_version": "Kon niet controleren op een nieuwe versie: Wellicht ben je niet met Tor verbonden, of de OnionShare website is niet beschikbaar?", + "update_available": "Nieuwe OnionShare is uitgekomen. <a href='{}'>Klik hier</a> om hem te krijgen.<br><br>Jij gebruikt {} en de laatste is {}.", + "update_error_check_error": "Kon niet controleren op een nieuwe versie: Wellicht ben je niet met Tor verbonden, of de OnionShare website is niet beschikbaar?", + "update_error_invalid_latest_version": "Kon niet controleren op een nieuwe versie: de OnionShare website meldt dat de laatste versie de onherkenbare is '{}' is…", "update_not_available": "Je draait de laatst beschikbare OnionShare.", "gui_tor_connection_ask": "Open de instellingen om het verbindingsprobleem met Tor op te lossen?", "gui_tor_connection_ask_open_settings": "Ja", @@ -139,7 +139,7 @@ "gui_use_legacy_v2_onions_checkbox": "Gebruik ouderwetse adressen", "gui_save_private_key_checkbox": "Gebruik een vast adres", "gui_share_url_description": "<b>1Iedereen</b>2 met dit OnionShare-adres kan je bestanden <b>3binnenhalen</b>4 met de <b>5Tor Browser</b>6: <img src='{}' />", - "gui_receive_url_description": "<b>1Iedereen</b>2 met dit OnionShare adres kan bestanden op je computer <b>3plaatsen</b>4 met de <b>5Tor Browser</b>6: <img src='{}' />7", + "gui_receive_url_description": "<b>Iedereen</b> met dit OnionShare adres kan bestanden op je computer <b>plaatsen</b> met de <b>Tor Browser</b>: <img src='{}' />", "gui_url_label_persistent": "Deze share stopt niet vanzelf. <br><br>Elke volgende share zal het adres hergebruiken. (Om eenmalige adressen te gebruiken, zet \"Gebruik vast adres\" uit in de settings.)", "gui_url_label_stay_open": "Deze share stopt niet automatisch.", "gui_url_label_onetime": "Deze share stopt na de eerste voltooiïng.", @@ -262,10 +262,10 @@ "mode_settings_client_auth_checkbox": "Gebruik client authorisatie", "mode_settings_autostop_timer_checkbox": "Stop onion service op een geplande tijd", "mode_settings_autostart_timer_checkbox": "Start onion service op een geplande tijd", - "mode_settings_persistent_checkbox": "Bewaar dit tabblad, en open het automatisch wanneer ik OnionShare open", + "mode_settings_persistent_checkbox": "Bewaar dit tabblad en open het automatisch wanneer ik OnionShare open", "gui_quit_warning_description": "Delen is actief op sommige van uw tabbladen. Als u stopt, worden al uw tabbladen gesloten. Weet u zeker dat u wilt stoppen?", "gui_close_tab_warning_website_description": "U host actief een website. Weet u zeker dat u dit tabblad wilt sluiten?", - "gui_close_tab_warning_persistent_description": "Dit tabblad is pertinent. Als je het sluit, verlies je het onion adres dat wordt gebruikt. Weet u zeker dat u het wilt sluiten?", + "gui_close_tab_warning_persistent_description": "Dit tabblad heeft een vast onion adres. Als je het tabblad sluit wordt het gebruikte onion adres opgeheven. Weet je zeker dat je dit wil sluiten?", "gui_tab_name_chat": "Chat", "gui_tab_name_website": "Website", "gui_tab_name_receive": "Ontvang", @@ -286,5 +286,19 @@ "gui_chat_stop_server": "Stop chat server", "gui_chat_start_server": "Start chat server", "gui_file_selection_remove_all": "Alles verwijderen", - "gui_remove": "Verwijderen" + "gui_remove": "Verwijderen", + "gui_rendezvous_cleanup": "Wachten op Tor circuits om af te sluiten, om zeker te stellen dat je bestanden succesvol zijn verplaatst\n\nDit kan enkele minuten duren.", + "mode_settings_receive_disable_text_checkbox": "Schakel het versturen van tekst uit", + "mode_settings_receive_disable_files_checkbox": "Schakel uploaden bestanden uit", + "mode_settings_receive_webhook_url_checkbox": "Gebruik notificatie webhook", + "gui_rendezvous_cleanup_quit_early": "Vervroegd afsluiten", + "error_port_not_available": "OnionShare poort is niet beschikbaar", + "history_receive_read_message_button": "Lees bericht", + "gui_chat_url_description": "<b>Iedereen</b> met dit OnionShare adres kan<b>in deze chatkamer aansluiten </b> met de <b>Tor Browser</b>: <img src='{}' />", + "mode_settings_title_label": "Handmatige titel", + "gui_status_indicator_chat_working": "Starten…", + "gui_status_indicator_chat_started": "in gesprek", + "gui_status_indicator_chat_scheduled": "Ingepland…", + "gui_color_mode_changed_notice": "Herstart OnionShare om de nieuwe kleur toe te passen.", + "gui_status_indicator_chat_stopped": "Klaar om te chatten" } diff --git a/desktop/src/onionshare/resources/locale/pl.json b/desktop/src/onionshare/resources/locale/pl.json index b44e5e13..2ef34565 100644 --- a/desktop/src/onionshare/resources/locale/pl.json +++ b/desktop/src/onionshare/resources/locale/pl.json @@ -7,10 +7,10 @@ "give_this_url_receive_stealth": "Przekaż ten adres i linijkę HidServAuth do nadawcy:", "ctrlc_to_stop": "Przyciśnij kombinację klawiszy Ctrl i C aby zatrzymać serwer", "not_a_file": "{0:s} nie jest prawidłowym plikiem.", - "not_a_readable_file": "{0:s} nie jest plikiem do odczytu.", + "not_a_readable_file": "Nie można odczytać {0:s}.", "no_available_port": "Nie można znaleźć dostępnego portu aby włączyć usługę onion", "other_page_loaded": "Adres został wczytany", - "close_on_autostop_timer": "Zatrzymano, ponieważ czasomierz automatycznego zatrzymania wygasł", + "close_on_autostop_timer": "Zatrzymano, ponieważ upłynął czas automatycznego zatrzymania", "closing_automatically": "Zatrzymano, ponieważ transfer został zakończony", "timeout_download_still_running": "Czekam na ukończenie pobierania", "large_filesize": "Uwaga: Wysyłanie dużego pliku może zająć kilka godzin", @@ -283,5 +283,8 @@ "gui_close_tab_warning_share_description": "Jesteś w trakcie wysyłania plików. Czy na pewno chcesz zamknąć tę kartę?", "gui_close_tab_warning_persistent_description": "Ta zakładka jest trwała. Jeśli ją zamkniesz, stracisz adres cebulowy, którego używa. Czy na pewno chcesz ją zamknąć?", "gui_color_mode_changed_notice": "Uruchom ponownie OnionShare aby zastosować nowy tryb kolorów.", - "gui_chat_url_description": "<b>Każdy</b> z tym adresem OnionShare może <b>dołączyć do tego pokoju</b> używając <b>Przeglądarki Tor</b>: <img src='{}' />" + "gui_chat_url_description": "<b>Każdy</b> z tym adresem OnionShare może <b>dołączyć do tego pokoju</b> używając <b>Przeglądarki Tor</b>: <img src='{}' />", + "mode_settings_receive_disable_files_checkbox": "Wyłącz wysyłanie plików", + "gui_status_indicator_chat_scheduled": "Zaplanowane…", + "gui_status_indicator_chat_working": "Uruchamianie…" } diff --git a/desktop/src/onionshare/resources/locale/pt_BR.json b/desktop/src/onionshare/resources/locale/pt_BR.json index 5ea5c5ce..bc7fe0c7 100644 --- a/desktop/src/onionshare/resources/locale/pt_BR.json +++ b/desktop/src/onionshare/resources/locale/pt_BR.json @@ -286,5 +286,15 @@ "error_port_not_available": "Porta OnionShare não disponível", "gui_chat_url_description": "<b>Qualquer um</b> com este endereço OnionShare pode <b>entrar nesta sala de chat</b> usando o <b>Tor Browser</b>: <img src='{}' />", "gui_rendezvous_cleanup_quit_early": "Fechar facilmente", - "gui_rendezvous_cleanup": "Aguardando o fechamento dos circuitos do Tor para ter certeza de que seus arquivos foram transferidos com sucesso.\n\nIsso pode demorar alguns minutos." + "gui_rendezvous_cleanup": "Aguardando o fechamento dos circuitos do Tor para ter certeza de que seus arquivos foram transferidos com sucesso.\n\nIsso pode demorar alguns minutos.", + "gui_color_mode_changed_notice": "Reinicie o OnionShare para que o novo modo de cor seja aplicado.", + "history_receive_read_message_button": "Ler mensagem", + "mode_settings_receive_webhook_url_checkbox": "Usar webhook de notificação", + "mode_settings_receive_disable_files_checkbox": "Desativar o carregamento de arquivos", + "mode_settings_receive_disable_text_checkbox": "Desativar envio de texto", + "mode_settings_title_label": "Título personalizado", + "gui_status_indicator_chat_started": "Conversando", + "gui_status_indicator_chat_scheduled": "Programando…", + "gui_status_indicator_chat_working": "Começando…", + "gui_status_indicator_chat_stopped": "Pronto para conversar" } diff --git a/desktop/src/onionshare/resources/locale/ru.json b/desktop/src/onionshare/resources/locale/ru.json index 6205acca..47e7e4d1 100644 --- a/desktop/src/onionshare/resources/locale/ru.json +++ b/desktop/src/onionshare/resources/locale/ru.json @@ -126,7 +126,7 @@ "settings_error_bundled_tor_timeout": "Подключение к Tor занимает слишком много времени. Возможно, отсутствует подключение к сети Интернет, или у вас неточно настроено системное время?", "settings_error_bundled_tor_broken": "Ошибка подключения OnionShare к Tor в фоновом режиме:\n{}", "settings_test_success": "Подключено к контроллеру Tor.\n\nВерсия Tor: {}\nПоддержка временных \"луковых\" сервисов: {}.\nПоддержка аутентификации клиента: {}.\nПоддержка адресов .onion следующего поколения: {}.", - "error_tor_protocol_error": "Ошибка Tor: {}", + "error_tor_protocol_error": "Была обнаружена ошибка Tor: {}", "error_tor_protocol_error_unknown": "Неизвестная ошибка Tor", "error_invalid_private_key": "Этот приватный ключ не поддерживается", "connecting_to_tor": "Подключение к сети Tor", @@ -283,5 +283,14 @@ "gui_rendezvous_cleanup_quit_early": "Выйти Раньше", "gui_rendezvous_cleanup": "Ожидается завершение соединений с сетью Tor для подтверждения успешной отправки ваших файлов.\n\nЭто может занять несколько минут.", "gui_color_mode_changed_notice": "Перезапустите OnionShare чтобы изменения цветовой гаммы вступили в силу.", - "gui_chat_url_description": "<b>Каждый</b> у кого есть этот адрес OnionShare может <b>присоединиться к этому чату</b> при помощи <b>Tor Browser</b>: <img src='{}' />" + "gui_chat_url_description": "<b>Каждый</b> у кого есть этот адрес OnionShare может <b>присоединиться к этому чату</b> при помощи <b>Tor Browser</b>: <img src='{}' />", + "history_receive_read_message_button": "Прочитать сообщение", + "mode_settings_receive_webhook_url_checkbox": "Использовать веб-хук для отправки уведомлений", + "mode_settings_receive_disable_files_checkbox": "Запретить передачу файлов", + "mode_settings_receive_disable_text_checkbox": "Запретить отправку текста", + "mode_settings_title_label": "Собственное название", + "gui_status_indicator_chat_started": "Чат активен", + "gui_status_indicator_chat_scheduled": "По расписанию…", + "gui_status_indicator_chat_working": "Запуск…", + "gui_status_indicator_chat_stopped": "Готов начать чат" } diff --git a/desktop/src/onionshare/resources/locale/si.json b/desktop/src/onionshare/resources/locale/si.json new file mode 100644 index 00000000..b55cde27 --- /dev/null +++ b/desktop/src/onionshare/resources/locale/si.json @@ -0,0 +1,195 @@ +{ + "not_a_readable_file": "", + "other_page_loaded": "", + "incorrect_password": "", + "close_on_autostop_timer": "", + "closing_automatically": "", + "large_filesize": "", + "gui_drag_and_drop": "", + "gui_add": "එකතු කරන්න", + "gui_add_files": "", + "gui_add_folder": "", + "gui_remove": "ඉවත් කරන්න", + "gui_file_selection_remove_all": "", + "gui_choose_items": "", + "gui_share_start_server": "", + "gui_share_stop_server": "", + "gui_share_stop_server_autostop_timer": "", + "gui_chat_start_server": "", + "gui_chat_stop_server": "", + "gui_stop_server_autostop_timer_tooltip": "", + "gui_start_server_autostart_timer_tooltip": "", + "gui_receive_start_server": "", + "gui_receive_stop_server": "", + "gui_receive_stop_server_autostop_timer": "", + "gui_receive_flatpak_data_dir": "", + "gui_copy_url": "", + "gui_copy_hidservauth": "", + "gui_canceled": "", + "gui_copied_url_title": "", + "gui_copied_url": "", + "gui_copied_hidservauth_title": "", + "gui_copied_hidservauth": "", + "gui_show_url_qr_code": "", + "gui_qr_code_dialog_title": "", + "gui_waiting_to_start": "", + "gui_please_wait": "", + "error_rate_limit": "", + "zip_progress_bar_format": "", + "gui_settings_window_title": "", + "gui_settings_autoupdate_label": "", + "gui_settings_autoupdate_option": "", + "gui_settings_autoupdate_timestamp": "", + "gui_settings_autoupdate_timestamp_never": "", + "gui_settings_autoupdate_check_button": "", + "gui_settings_connection_type_label": "", + "gui_settings_connection_type_bundled_option": "", + "gui_settings_connection_type_automatic_option": "", + "gui_settings_connection_type_control_port_option": "", + "gui_settings_connection_type_socket_file_option": "", + "gui_settings_connection_type_test_button": "", + "gui_settings_control_port_label": "", + "gui_settings_socket_file_label": "", + "gui_settings_socks_label": "", + "gui_settings_authenticate_label": "", + "gui_settings_authenticate_no_auth_option": "", + "gui_settings_authenticate_password_option": "", + "gui_settings_password_label": "", + "gui_settings_tor_bridges": "", + "gui_settings_tor_bridges_no_bridges_radio_option": "", + "gui_settings_tor_bridges_obfs4_radio_option": "", + "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "", + "gui_settings_tor_bridges_meek_lite_azure_radio_option": "", + "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "", + "gui_settings_meek_lite_expensive_warning": "", + "gui_settings_tor_bridges_custom_radio_option": "", + "gui_settings_tor_bridges_custom_label": "", + "gui_settings_tor_bridges_invalid": "", + "gui_settings_button_save": "", + "gui_settings_button_cancel": "", + "gui_settings_button_help": "", + "settings_test_success": "", + "connecting_to_tor": "", + "update_available": "", + "update_error_invalid_latest_version": "", + "update_error_check_error": "", + "update_not_available": "", + "gui_tor_connection_ask": "", + "gui_tor_connection_ask_open_settings": "", + "gui_tor_connection_ask_quit": "", + "gui_tor_connection_error_settings": "", + "gui_tor_connection_canceled": "", + "gui_tor_connection_lost": "", + "gui_server_started_after_autostop_timer": "", + "gui_server_autostop_timer_expired": "", + "gui_server_autostart_timer_expired": "", + "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "", + "share_via_onionshare": "", + "gui_share_url_description": "", + "gui_website_url_description": "", + "gui_receive_url_description": "", + "gui_chat_url_description": "", + "gui_url_label_persistent": "", + "gui_url_label_stay_open": "", + "gui_url_label_onetime": "", + "gui_url_label_onetime_and_persistent": "", + "gui_status_indicator_share_stopped": "", + "gui_status_indicator_share_working": "", + "gui_status_indicator_share_scheduled": "", + "gui_status_indicator_share_started": "", + "gui_status_indicator_receive_stopped": "", + "gui_status_indicator_receive_working": "", + "gui_status_indicator_receive_scheduled": "", + "gui_status_indicator_receive_started": "", + "gui_file_info": "", + "gui_file_info_single": "", + "history_in_progress_tooltip": "", + "history_completed_tooltip": "", + "history_requests_tooltip": "", + "error_cannot_create_data_dir": "", + "gui_receive_mode_warning": "", + "gui_open_folder_error": "", + "gui_settings_language_label": "", + "gui_settings_language_changed_notice": "", + "gui_color_mode_changed_notice": "", + "systray_menu_exit": "", + "systray_page_loaded_title": "", + "systray_page_loaded_message": "", + "systray_share_started_title": "", + "systray_share_started_message": "", + "systray_share_completed_title": "", + "systray_share_completed_message": "", + "systray_share_canceled_title": "", + "systray_share_canceled_message": "", + "systray_receive_started_title": "", + "systray_receive_started_message": "", + "gui_all_modes_history": "", + "gui_all_modes_clear_history": "", + "gui_all_modes_transfer_started": "", + "gui_all_modes_progress_complete": "", + "gui_all_modes_progress_starting": "", + "gui_all_modes_progress_eta": "", + "gui_share_mode_no_files": "", + "gui_share_mode_autostop_timer_waiting": "", + "gui_website_mode_no_files": "", + "gui_receive_mode_no_files": "", + "gui_receive_mode_autostop_timer_waiting": "", + "days_first_letter": "", + "hours_first_letter": "", + "minutes_first_letter": "", + "seconds_first_letter": "", + "gui_new_tab": "", + "gui_new_tab_tooltip": "", + "gui_new_tab_share_button": "", + "gui_new_tab_receive_button": "", + "gui_new_tab_website_button": "", + "gui_new_tab_chat_button": "", + "gui_main_page_share_button": "", + "gui_main_page_receive_button": "", + "gui_main_page_website_button": "", + "gui_main_page_chat_button": "", + "gui_tab_name_share": "", + "gui_tab_name_receive": "", + "gui_tab_name_website": "", + "gui_tab_name_chat": "", + "gui_close_tab_warning_title": "", + "gui_close_tab_warning_persistent_description": "", + "gui_close_tab_warning_share_description": "", + "gui_close_tab_warning_receive_description": "", + "gui_close_tab_warning_website_description": "", + "gui_close_tab_warning_close": "", + "gui_close_tab_warning_cancel": "", + "gui_quit_warning_title": "", + "gui_quit_warning_description": "", + "gui_quit_warning_quit": "", + "gui_quit_warning_cancel": "", + "mode_settings_advanced_toggle_show": "", + "mode_settings_advanced_toggle_hide": "", + "mode_settings_persistent_checkbox": "", + "mode_settings_public_checkbox": "", + "mode_settings_autostart_timer_checkbox": "", + "mode_settings_autostop_timer_checkbox": "", + "mode_settings_legacy_checkbox": "", + "mode_settings_client_auth_checkbox": "", + "mode_settings_share_autostop_sharing_checkbox": "", + "mode_settings_receive_data_dir_label": "", + "mode_settings_receive_data_dir_browse_button": "", + "mode_settings_website_disable_csp_checkbox": "", + "gui_all_modes_transfer_finished_range": "", + "gui_all_modes_transfer_finished": "", + "gui_all_modes_transfer_canceled_range": "", + "gui_all_modes_transfer_canceled": "", + "settings_error_unknown": "", + "settings_error_automatic": "", + "settings_error_socket_port": "", + "settings_error_socket_file": "", + "settings_error_auth": "", + "settings_error_missing_password": "", + "settings_error_unreadable_cookie_file": "", + "settings_error_bundled_tor_not_supported": "", + "settings_error_bundled_tor_timeout": "", + "settings_error_bundled_tor_broken": "", + "gui_rendezvous_cleanup": "", + "gui_rendezvous_cleanup_quit_early": "", + "error_port_not_available": "" +} diff --git a/desktop/src/onionshare/resources/locale/sr_Latn.json b/desktop/src/onionshare/resources/locale/sr_Latn.json index 18dfad44..d94fe024 100644 --- a/desktop/src/onionshare/resources/locale/sr_Latn.json +++ b/desktop/src/onionshare/resources/locale/sr_Latn.json @@ -7,7 +7,7 @@ "close_on_autostop_timer": "Prekid rada zato što je isteklo vreme na auto-stop tajmeru", "closing_automatically": "Prekid rada zato što je prenos završen", "large_filesize": "Upozorenje: Slanje velikih fajlova može trajati satima", - "gui_drag_and_drop": "Prevuci i otpusti datoteke i fascikle\nda bi započeo deljenje", + "gui_drag_and_drop": "Prevuci i otpusti datoteke i fascikle da bi započeo deljenje", "gui_add": "Dodaj", "gui_add_files": "Dodaj datoteke", "gui_add_folder": "Dodat fascikle", @@ -99,8 +99,8 @@ "error_tor_protocol_error_unknown": "Došlo je do nepoznate greške sa Torom", "connecting_to_tor": "Povezivanje sa Tor mrežom", "update_available": "Novi OnionShare objavljen. <a href='{}'>Klikni ovde</a> da bi ga dobio.<br><br>Trenutno koristiš {} a najnoviji je {}.", - "update_error_check_error": "Nije moguće proveriti novu verziju: na sajtu OnionShare piše da je najnovija verzija neprepoznatljiva ' {} '…", - "update_error_invalid_latest_version": "Nije moguće proveriti novu verziju: možda niste povezani sa Torom ili je sajt OnionShare oboren?", + "update_error_check_error": "Nije moguće proveriti novu verziju: Mođda nije povezana na Tor, ili sajt OnionShare ne radi?", + "update_error_invalid_latest_version": "Nije moguće proveriti novu verziju: Sajt OnionShare kaže da poslednja verzija nije prepoznata '{}'…", "update_not_available": "Da li koristite najnoviji OnionShare.", "gui_tor_connection_ask": "Da li otvoriti podešavanja da biste podesili vezu sa Torom?", "gui_tor_connection_ask_open_settings": "Da", @@ -179,5 +179,54 @@ "days_first_letter": "d", "hours_first_letter": "h", "minutes_first_letter": "m", - "seconds_first_letter": "s" + "seconds_first_letter": "s", + "gui_rendezvous_cleanup_quit_early": "Prestani", + "gui_rendezvous_cleanup": "Čekajući da se Tor čvorovi zatvore da bi bili sigurni da su vaši fajlovi uspešno preneti.\n\nOvo može trajati nekoliko minuta.", + "error_port_not_available": "OnionShare port nije dostupan", + "mode_settings_website_disable_csp_checkbox": "Ne šaljite zaglavlje smernica za bezbednost sadržaja (omogućava vašem veb sajtu da koristi nezavisne resurse)", + "mode_settings_share_autostop_sharing_checkbox": "Zaustavite deljenje nakon slanja fajlova (uklonite oznaku da bi omogućili preuzimanje pojedinačnih fajlova)", + "gui_quit_warning_description": "Deljenje je aktivno u nekim vašim jezičcima. Ako želite napustiti, svi važi jezičci će biti zatvoreni. Da li ste sigurni da želite napustiti?", + "gui_close_tab_warning_website_description": "Aktivno hostujete veb sajt. Da li ste sigurni da želite da zatvorite ovaj jezičak?", + "gui_close_tab_warning_receive_description": "U procesu ste primanja fajlova. Da li ste sigurni da želite da zatvorite ovaj jezičak?", + "gui_close_tab_warning_share_description": "U procesu ste slanja fajlova. Da li ste sigurni da želite zatvoriti ovaj jezičak?", + "gui_close_tab_warning_persistent_description": "Ovaj jezičak je postojan. Ako ga zatvorite, izgubićete onion adresu koju koristite. Da li ste sigurni da želite zatvoriti?", + "mode_settings_receive_data_dir_browse_button": "Pronađi", + "mode_settings_receive_data_dir_label": "Sačuvaj fajlove u", + "mode_settings_client_auth_checkbox": "Koristi klijentsku autorizaciju", + "mode_settings_legacy_checkbox": "Koristite zastarelu adresu (v2 onion servis, nije preporučeno)", + "mode_settings_autostop_timer_checkbox": "Zaustavi onion servis u planirano vreme", + "mode_settings_autostart_timer_checkbox": "Pokreni onion servis u planirano vreme", + "mode_settings_public_checkbox": "Ne koristi lozinku", + "mode_settings_persistent_checkbox": "Sačuvaj ovaj jezičak i automatski ga otvori kada otvorim OnionShare", + "gui_quit_warning_cancel": "Otkaži", + "gui_close_tab_warning_cancel": "Otkaži", + "mode_settings_advanced_toggle_hide": "Sakrij napredne postavke", + "mode_settings_advanced_toggle_show": "Prikaži napredne postavke", + "gui_quit_warning_title": "Da li ste sigurni?", + "gui_close_tab_warning_close": "Zatvori", + "gui_close_tab_warning_title": "Da li ste sigurni?", + "gui_tab_name_chat": "Ćaskanje", + "gui_tab_name_website": "Veb sajt", + "gui_tab_name_receive": "Prijem", + "gui_tab_name_share": "Deli", + "gui_main_page_chat_button": "Pokreni ćaskanje", + "gui_new_tab_website_button": "Hosting veb sajta", + "gui_main_page_website_button": "Pokreni hosting", + "gui_main_page_receive_button": "Pokreni primanje", + "gui_main_page_share_button": "Pokreni deljenje", + "gui_new_tab_chat_button": "Anonimno ćaskanje", + "gui_new_tab_receive_button": "Primanje fajlova", + "gui_new_tab_share_button": "Deli fajlove", + "gui_new_tab_tooltip": "Otvori novi jezičak", + "gui_new_tab": "Novi jezičak", + "gui_color_mode_changed_notice": "Ponovo pokrenite OnionShare da bi primenili novi režim boja.", + "gui_open_folder_error": "Neuspelo otvaranje fascikle sa xdg-open. Fajl je ovde: {}", + "gui_chat_url_description": "<b>Bilo ko</b> sa ovom OnionShare adresom može <b>pristupiti ovoj sobi za ćaskawe</b> koristeći <b>Tor pregledač</b>: <img src='{}' />", + "gui_qr_code_dialog_title": "OnionShare QR kod", + "gui_show_url_qr_code": "Prikaži QR kod", + "gui_receive_flatpak_data_dir": "Pošto ste instalirali OnionShare koristeći Flatpak, morate čuvati fajlove u falcikli ~/OnionShare.", + "gui_chat_stop_server": "Zaustavi server za ćaskanje", + "gui_chat_start_server": "Pokreni server za ćaskanje", + "gui_file_selection_remove_all": "Ukloni sve", + "gui_remove": "Ukloni" } diff --git a/desktop/src/onionshare/resources/locale/sv.json b/desktop/src/onionshare/resources/locale/sv.json index 1e2b951f..a3c97704 100644 --- a/desktop/src/onionshare/resources/locale/sv.json +++ b/desktop/src/onionshare/resources/locale/sv.json @@ -118,7 +118,7 @@ "settings_error_bundled_tor_timeout": "Det tar för lång tid att ansluta till Tor. Kanske är du inte ansluten till Internet, eller har en felaktig systemklocka?", "settings_error_bundled_tor_broken": "OnionShare kunde inte ansluta till Tor:\n{}", "settings_test_success": "Ansluten till Tor-regulatorn.\n\nTor-version: {}\nStöder efemära onion-tjänster: {}.\nStöder klientautentisering: {}.\nStöder nästa generations .onion-adresser: {}.", - "error_tor_protocol_error": "Det fanns ett fel med Tor: {}", + "error_tor_protocol_error": "Det uppstod ett fel med Tor: {}", "error_tor_protocol_error_unknown": "Det fanns ett okänt fel med Tor", "error_invalid_private_key": "Denna privata nyckeltyp stöds inte", "connecting_to_tor": "Ansluter till Tor-nätverket", @@ -126,7 +126,7 @@ "update_error_check_error": "Det gick inte att söka efter ny version: Kanske är du inte ansluten till Tor eller OnionShare-webbplatsen är nere?", "update_error_invalid_latest_version": "Det gick inte att söka efter ny version: OnionShare-webbplatsen säger att den senaste versionen är den oigenkännliga \"{}\"…", "update_not_available": "Du kör den senaste OnionShare.", - "gui_tor_connection_ask": "Öppna inställningarna för att sortera ut anslutning till Tor?", + "gui_tor_connection_ask": "Öppna inställningarna för att reda ut anslutning till Tor?", "gui_tor_connection_ask_open_settings": "Ja", "gui_tor_connection_ask_quit": "Avsluta", "gui_tor_connection_error_settings": "Försök att ändra hur OnionShare ansluter till Tor-nätverket i inställningarna.", @@ -219,7 +219,7 @@ "gui_settings_autostart_timer_checkbox": "Använd automatisk start-tidtagare", "gui_settings_autostart_timer": "Starta delning vid:", "gui_server_autostart_timer_expired": "Den schemalagda tiden har redan passerat. Vänligen justera den för att starta delning.", - "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Den automatiska stopp-tiden kan inte vara samma eller tidigare än den automatiska starttiden. Vänligen justera den för att starta delning.", + "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Den automatiska stopp-tiden kan inte vara samma eller tidigare än den automatiska starttiden. Vänligen justera den för att starta delning.", "gui_status_indicator_share_scheduled": "Planerad…", "gui_status_indicator_receive_scheduled": "Planerad…", "days_first_letter": "d", @@ -242,17 +242,17 @@ "systray_individual_file_downloaded_message": "Individuell fil {} visad", "gui_settings_website_label": "Webbplatsinställningar", "gui_settings_csp_header_disabled_option": "Inaktivera rubriken för innehållssäkerhetspolicy", - "gui_close_tab_warning_persistent_description": "Den här fliken är beständig. Om du stänger den förlorar du onion-adressen som den använder. Är du säker på att du vill stänga den?", + "gui_close_tab_warning_persistent_description": "Denna flik är beständig. Om du stänger den förlorar du onion-adressen som den använder. Är du säker på att du vill stänga den?", "mode_settings_website_disable_csp_checkbox": "Inaktivera rubriken för innehållssäkerhetspolicy (tillåter din webbplats att använda resurser från tredje part)", "mode_settings_receive_data_dir_browse_button": "Bläddra", "mode_settings_receive_data_dir_label": "Spara filer till", "mode_settings_share_autostop_sharing_checkbox": "Stoppa delning efter att filer har skickats (avmarkera för att tillåta hämtning av enskilda filer)", "mode_settings_client_auth_checkbox": "Använd klientauktorisering", - "mode_settings_legacy_checkbox": "Använd en äldre adress (v2 oniontjänst, rekommenderas inte)", + "mode_settings_legacy_checkbox": "Använd en äldre adress (v2-oniontjänst, rekommenderas inte)", "mode_settings_autostart_timer_checkbox": "Starta oniontjänsten vid schemalagd tid", "mode_settings_autostop_timer_checkbox": "Stoppa oniontjänsten vid schemalagd tid", "mode_settings_public_checkbox": "Använd inte ett lösenord", - "mode_settings_persistent_checkbox": "Spara den här fliken och öppna den automatiskt när jag öppnar OnionShare", + "mode_settings_persistent_checkbox": "Spara denna flik och öppna den automatiskt när jag öppnar OnionShare", "mode_settings_advanced_toggle_hide": "Dölj avancerade inställningar", "mode_settings_advanced_toggle_show": "Visa avancerade inställningar", "gui_quit_warning_cancel": "Avbryt", @@ -260,9 +260,9 @@ "gui_quit_warning_title": "Är du säker?", "gui_close_tab_warning_cancel": "Avbryt", "gui_close_tab_warning_close": "Stäng", - "gui_close_tab_warning_website_description": "Du är aktivt värd för en webbplats. Är du säker på att du vill stänga den här fliken?", - "gui_close_tab_warning_receive_description": "Du håller på att ta emot filer. Är du säker på att du vill stänga den här fliken?", - "gui_close_tab_warning_share_description": "Du håller på att skicka filer. Är du säker på att du vill stänga den här fliken?", + "gui_close_tab_warning_website_description": "Du är aktivt värd för en webbplats. Är du säker på att du vill stänga denna flik?", + "gui_close_tab_warning_receive_description": "Du håller på att ta emot filer. Är du säker på att du vill stänga denna flik?", + "gui_close_tab_warning_share_description": "Du håller på att skicka filer. Är du säker på att du vill stänga denna flik?", "gui_close_tab_warning_title": "Är du säker?", "gui_new_tab_website_description": "Var värd till en statisk HTML-onionwebbplats från din dator.", "gui_new_tab_website_button": "Publicera webbplats", @@ -280,18 +280,28 @@ "gui_chat_start_server": "Starta chattservern", "gui_file_selection_remove_all": "Ta bort alla", "gui_remove": "Ta bort", - "gui_main_page_share_button": "Börja dela", + "gui_main_page_share_button": "Starta delning", "error_port_not_available": "OnionShare-porten är inte tillgänglig", "gui_rendezvous_cleanup_quit_early": "Avsluta tidigt", "gui_rendezvous_cleanup": "Väntar på att Tor-kretsar stänger för att vara säker på att dina filer har överförts.\n\nDet kan ta några minuter.", - "gui_tab_name_chat": "Chatta", + "gui_tab_name_chat": "Chatt", "gui_tab_name_website": "Webbplats", "gui_tab_name_receive": "Ta emot", "gui_tab_name_share": "Dela", "gui_main_page_chat_button": "Börja chatta", "gui_main_page_website_button": "Börja publicera", - "gui_main_page_receive_button": "Börja ta emot", + "gui_main_page_receive_button": "Starta mottagning", "gui_new_tab_chat_button": "Chatta anonymt", - "gui_open_folder_error": "Misslyckades att öppna mappen med xdg-open. Filen finns här: {}", - "gui_chat_url_description": "<b>Alla</b> med denna OnionShare-adress kan <b>gå med i detta chattrum</b> med <b>Tor Browser</b>: <img src='{}' />" + "gui_open_folder_error": "Det gick inte att öppna mappen med xdg-open. Filen finns här: {}", + "gui_chat_url_description": "<b>Alla</b> med denna OnionShare-adress kan <b>gå med i detta chattrum</b> med <b>Tor Browser</b>: <img src='{}' />", + "gui_status_indicator_chat_stopped": "Redo att chatta", + "gui_status_indicator_chat_scheduled": "Schemalagd…", + "history_receive_read_message_button": "Läs meddelandet", + "mode_settings_receive_webhook_url_checkbox": "Använd aviseringswebhook", + "mode_settings_receive_disable_files_checkbox": "Inaktivera uppladdning av filer", + "mode_settings_receive_disable_text_checkbox": "Inaktivera att skicka text", + "mode_settings_title_label": "Anpassad titel", + "gui_color_mode_changed_notice": "Starta om OnionShare för att det nya färgläget ska tillämpas.", + "gui_status_indicator_chat_started": "Chattar", + "gui_status_indicator_chat_working": "Startar…" } diff --git a/desktop/src/onionshare/resources/locale/tr.json b/desktop/src/onionshare/resources/locale/tr.json index d3d09298..e00c3aba 100644 --- a/desktop/src/onionshare/resources/locale/tr.json +++ b/desktop/src/onionshare/resources/locale/tr.json @@ -5,17 +5,17 @@ "not_a_file": "{0:s} dosya değil.", "other_page_loaded": "Adres yüklendi", "closing_automatically": "Aktarım tamamlandığından durduruldu", - "large_filesize": "Uyarı: Büyük bir paylaşma göndermek saatler sürebilir", + "large_filesize": "Uyarı: Büyük bir paylaşım saatler sürebilir", "help_local_only": "Tor kullanmayın (sadece geliştirme için)", "help_stay_open": "Dosyalar gönderildikten sonra paylaşmaya devam et", "help_debug": "OnionShare hatalarını stdout'a ve web hatalarını diske yaz", "help_filename": "Paylaşmak için dosya ve klasörler listesi", - "gui_drag_and_drop": "Paylaşmaya başlamak için dosya ve klasörleri sürükleyip bırakın", + "gui_drag_and_drop": "Paylaşıma başlamak için dosya ve klasörleri sürükleyip bırakın", "gui_add": "Ekle", "gui_delete": "Sil", "gui_choose_items": "Seç", "gui_share_start_server": "Paylaşmaya başla", - "gui_share_stop_server": "Paylaşmayı durdur", + "gui_share_stop_server": "Paylaşımı durdur", "gui_copy_url": "Adresi Kopyala", "gui_downloads": "İndirilenler:", "gui_canceled": "İptal edilen", @@ -33,9 +33,9 @@ "help_stealth": "İstemci yetkilendirmesini kullan (gelişmiş)", "help_receive": "Paylaşımı göndermek yerine, almak", "help_config": "Özel JSON config dosyası konumu (isteğe bağlı)", - "gui_add_files": "Dosya Ekle", - "gui_add_folder": "Klasör Ekle", - "gui_share_stop_server_autostop_timer": "Paylaşmayı Durdur ({})", + "gui_add_files": "Dosya ekle", + "gui_add_folder": "Klasör ekle", + "gui_share_stop_server_autostop_timer": "Paylaşımı Durdur ({})", "gui_share_stop_server_autostop_timer_tooltip": "Otomatik durdurma zamanlayıcısı {} sonra biter", "gui_receive_start_server": "Alma Modunu Başlat", "gui_receive_stop_server": "Alma Modunu Durdur", @@ -106,7 +106,7 @@ "settings_error_bundled_tor_timeout": "Tor bağlantısının kurulması gecikiyor. İnternet bağlantınız kesik ya da sistem saatiniz hatalı olabilir mi?", "settings_error_bundled_tor_broken": "OnionShare, Tor ile bağlantı kuramadı:\n{}", "settings_test_success": "Tor denetleyicisi ile bağlantı kuruldu.\n\nTor sürümü: {}\nGeçici onion hizmetleri desteği: {}.\nİstemci kimlik doğrulaması desteği: {}.\nYeni nesil .onion adresleri desteği: {}.", - "error_tor_protocol_error": "Tor ile ilgili bir sorun çıktı: {}", + "error_tor_protocol_error": "Tor ile ilgili bir hata oluştu: {}", "error_tor_protocol_error_unknown": "Tor ile ilgili bilinmeyen bir sorun çıktı", "error_invalid_private_key": "Bu özel anahtar türü desteklenmiyor", "connecting_to_tor": "Tor ağı ile bağlantı kuruluyor", @@ -237,8 +237,8 @@ "gui_new_tab_tooltip": "Yeni bir sekme aç", "gui_new_tab": "Yeni Sekme", "gui_remove": "Kaldır", - "gui_file_selection_remove_all": "Tümünü Kaldır", - "gui_chat_start_server": "Sohbet sunucusu başlat", + "gui_file_selection_remove_all": "Tümünü kaldır", + "gui_chat_start_server": "Sohbet sunucusunu başlat", "gui_chat_stop_server": "Sohbet sunucusunu durdur", "gui_receive_flatpak_data_dir": "OnionShare'i Flatpak kullanarak kurduğunuz için, dosyaları ~/OnionShare içindeki bir klasöre kaydetmelisiniz.", "gui_show_url_qr_code": "QR Kodu Göster", @@ -258,5 +258,14 @@ "error_port_not_available": "OnionShare bağlantı noktası kullanılamıyor", "gui_rendezvous_cleanup_quit_early": "Erken Çık", "gui_rendezvous_cleanup": "Dosyalarınızın başarıyla aktarıldığından emin olmak için Tor devrelerinin kapanması bekleniyor.\n\nBu, birkaç dakika sürebilir.", - "gui_color_mode_changed_notice": "Yeni renk modunun uygulanması için OnionShare'i yeniden başlatın." + "gui_color_mode_changed_notice": "Yeni renk modunun uygulanması için OnionShare'i yeniden başlatın.", + "history_receive_read_message_button": "Mesajı Oku", + "mode_settings_receive_webhook_url_checkbox": "Bildirim web kancası kullan", + "mode_settings_receive_disable_files_checkbox": "Dosya yüklemeyi devre dışı bırak", + "mode_settings_receive_disable_text_checkbox": "Metin göndermeyi devre dışı bırak", + "mode_settings_title_label": "Özel başlık", + "gui_status_indicator_chat_started": "Sohbet ediliyor", + "gui_status_indicator_chat_scheduled": "Zamanlandı…", + "gui_status_indicator_chat_working": "Başlatılıyor…", + "gui_status_indicator_chat_stopped": "Sohbet etmeye hazır" } diff --git a/desktop/src/onionshare/resources/locale/uk.json b/desktop/src/onionshare/resources/locale/uk.json index 0cd71586..cf971be0 100644 --- a/desktop/src/onionshare/resources/locale/uk.json +++ b/desktop/src/onionshare/resources/locale/uk.json @@ -60,7 +60,7 @@ "gui_settings_control_port_label": "Порт керування", "gui_settings_socket_file_label": "Файл сокета", "gui_settings_socks_label": "SOCKS порт", - "gui_settings_authenticate_label": "Параметри автентифікації Tor", + "gui_settings_authenticate_label": "Налаштування автентифікації Tor", "gui_settings_authenticate_no_auth_option": "Без автентифікації або автентифікація через cookie", "gui_settings_authenticate_password_option": "Пароль", "gui_settings_password_label": "Пароль", @@ -92,14 +92,14 @@ "settings_error_bundled_tor_timeout": "Надто довге з'єднання з Tor. Можливо, відсутнє з'єднання з Інтернетом або у вас неточний системний час?", "settings_error_bundled_tor_broken": "OnionShare не вдалося з'єднатися з Tor:\n{}", "settings_test_success": "З'єднано з контролером Tor.\n\nВерсія Tor: {}\nПідтримка ephemeral onion services: {}.\nПідтримка автентифікації клієнта: {}.\nПідтримка .onion адрес наступного покоління: {}.", - "error_tor_protocol_error": "Сталася помилка з Tor: {}", + "error_tor_protocol_error": "Сталася помилка Tor: {}", "error_tor_protocol_error_unknown": "Сталася невідома помилка з Tor", "connecting_to_tor": "З'єднання з мережею Tor", "update_available": "Випущено новий OnionShare. <a href='{}'>Натисніть тут,</a> щоб його отримати.<br><br>Ваша версія {}, а найновіша {}.", "update_error_check_error": "Не вдалося перевірити наявність нових версій: можливо, ви не під'єднані до Tor або вебсайт OnionShare не працює?", "update_error_invalid_latest_version": "Не вдалося перевірити наявність нової версії: вебсайт OnionShare повідомляє, що не вдалося розпізнати найновішу версію '{}'…", "update_not_available": "У вас найновіша версія OnionShare.", - "gui_tor_connection_ask": "Відкрити параметри для перевірки з'єднання з Tor?", + "gui_tor_connection_ask": "Відкрити налаштування для перевірки з'єднання з Tor?", "gui_tor_connection_ask_open_settings": "Так", "gui_tor_connection_ask_quit": "Вийти", "gui_tor_connection_error_settings": "Спробуйте змінити в параметрах, як OnionShare з'єднується з мережею Tor.", @@ -132,7 +132,7 @@ "history_in_progress_tooltip": "{} в процесі", "history_completed_tooltip": "{} завершено", "error_cannot_create_data_dir": "Не вдалося створити теку даних OnionShare: {}", - "gui_receive_mode_warning": "Режим отримання дозволяє завантажувати файли до вашого комп'ютера.<br><br><b>Деякі файли, потенційно, можуть заволодіти вашим комп'ютером, у разі їх відкриття. Відкривайте файли лише від довірених осіб, або якщо впевнені в своїх діях.</b>", + "gui_receive_mode_warning": "Режим отримання дозволяє завантажувати файли до вашого комп'ютера.<br><br><b>Деякі файли, потенційно, можуть заволодіти вашим комп'ютером, у разі їх відкриття. Відкривайте файли лише від довірених осіб, або якщо ви впевнені у своїх діях.</b>", "gui_mode_share_button": "Поділитися файлами", "gui_mode_receive_button": "Отримання Файлів", "gui_settings_receiving_label": "Параметри отримання", @@ -233,5 +233,14 @@ "error_port_not_available": "Порт OnionShare недоступний", "gui_rendezvous_cleanup_quit_early": "Вийти раніше", "gui_rendezvous_cleanup": "Очікування закриття схем Tor, щоб переконатися, що файли успішно передано.\n\nЦе може тривати кілька хвилин.", - "gui_color_mode_changed_notice": "Перезапустіть OnionShare, щоб застосувати новий колірний режим." + "gui_color_mode_changed_notice": "Перезапустіть OnionShare, щоб застосувати новий колірний режим.", + "mode_settings_receive_webhook_url_checkbox": "Застосовувати мережні обробники сповіщень", + "history_receive_read_message_button": "Читати повідомлення", + "mode_settings_receive_disable_files_checkbox": "Вимкнути передавання файлів", + "mode_settings_receive_disable_text_checkbox": "Вимкнути надсилання тексту", + "mode_settings_title_label": "Власний заголовок", + "gui_status_indicator_chat_scheduled": "Заплановано…", + "gui_status_indicator_chat_started": "Спілкування", + "gui_status_indicator_chat_working": "Початок…", + "gui_status_indicator_chat_stopped": "Готовий до спілкування" } diff --git a/desktop/src/onionshare/resources/locale/yo.json b/desktop/src/onionshare/resources/locale/yo.json index 96b5a0d1..fdd6dbea 100644 --- a/desktop/src/onionshare/resources/locale/yo.json +++ b/desktop/src/onionshare/resources/locale/yo.json @@ -7,14 +7,14 @@ "give_this_url_receive_stealth": "", "ctrlc_to_stop": "", "not_a_file": "", - "not_a_readable_file": "", + "not_a_readable_file": "{0:s} je oun ti a ko le ka.", "no_available_port": "", - "other_page_loaded": "", - "close_on_autostop_timer": "", - "closing_automatically": "", + "other_page_loaded": "Adiresi ti wole", + "close_on_autostop_timer": "O danuduro nitori akoko idaduro aifowoyi ti pe", + "closing_automatically": "Odanuduro nitori o ti fi ranse tan", "timeout_download_still_running": "", "timeout_upload_still_running": "", - "large_filesize": "", + "large_filesize": "Ikilo: Fi fi nkan repete ranse le gba aimoye wakati", "systray_menu_exit": "", "systray_download_started_title": "", "systray_download_started_message": "", @@ -32,16 +32,16 @@ "help_verbose": "", "help_filename": "", "help_config": "", - "gui_drag_and_drop": "", - "gui_add": "", + "gui_drag_and_drop": "Wo awon iwe pelebe ati apamowo re sibi lati bere sini fi ranse", + "gui_add": "Fikun", "gui_delete": "", - "gui_choose_items": "", - "gui_share_start_server": "", - "gui_share_stop_server": "", - "gui_share_stop_server_autostop_timer": "", + "gui_choose_items": "Yan", + "gui_share_start_server": "Bere si ni pin", + "gui_share_stop_server": "Dawo pinpin duro", + "gui_share_stop_server_autostop_timer": "Dawo pinpin duro ({})", "gui_share_stop_server_autostop_timer_tooltip": "", - "gui_receive_start_server": "", - "gui_receive_stop_server": "", + "gui_receive_start_server": "Bere ipele gbigba", + "gui_receive_stop_server": "Duro ipele gbigba", "gui_receive_stop_server_autostop_timer": "", "gui_receive_stop_server_autostop_timer_tooltip": "", "gui_copy_url": "", @@ -181,5 +181,14 @@ "gui_download_in_progress": "", "gui_open_folder_error_nautilus": "", "gui_settings_language_label": "", - "gui_settings_language_changed_notice": "" + "gui_settings_language_changed_notice": "", + "gui_start_server_autostart_timer_tooltip": "Akoko ti nbere laifowoyi duro ni {}", + "gui_stop_server_autostop_timer_tooltip": "Akoko ti nduro laifowoyi dopin ni {}", + "gui_chat_stop_server": "Da olupin iregbe duro", + "gui_chat_start_server": "Bere olupin iregbe", + "gui_file_selection_remove_all": "Yo gbogbo re kuro", + "gui_remove": "Yokuro", + "gui_add_folder": "S'afikun folda", + "gui_add_files": "S'afikun faili", + "incorrect_password": "Ashiko oro igbaniwole" } diff --git a/desktop/src/onionshare/resources/locale/zh_Hans.json b/desktop/src/onionshare/resources/locale/zh_Hans.json index a37d0c58..d14b5754 100644 --- a/desktop/src/onionshare/resources/locale/zh_Hans.json +++ b/desktop/src/onionshare/resources/locale/zh_Hans.json @@ -285,5 +285,15 @@ "gui_chat_url_description": "<b>任何</b>有这个OnionShare地址的人均可 <b>加入这个聊天室</b>,方法是使用<b>Tor浏览器</b>:<img src='{}' />", "gui_rendezvous_cleanup_quit_early": "提前退出", "gui_rendezvous_cleanup": "等待Tor电路关闭,以确保文件传输成功。\n\n这可能需要几分钟。", - "gui_color_mode_changed_notice": "要使即将应用的新色彩模式生效,请重启 OnionShare.。" + "gui_color_mode_changed_notice": "要使即将应用的新色彩模式生效,请重启 OnionShare.。", + "history_receive_read_message_button": "读取消息", + "mode_settings_receive_webhook_url_checkbox": "使用通知 webhook", + "mode_settings_receive_disable_files_checkbox": "禁用上传文件", + "mode_settings_receive_disable_text_checkbox": "禁用提交文本", + "mode_settings_title_label": "自定义标题", + "gui_status_indicator_chat_started": "正在聊天", + "gui_status_indicator_chat_scheduled": "已安排…", + "gui_status_indicator_chat_working": "启动中…", + "gui_status_indicator_chat_stopped": "准备好聊天", + "gui_please_wait_no_button": "启动中…" } diff --git a/desktop/src/onionshare/settings_dialog.py b/desktop/src/onionshare/settings_dialog.py index 3f913bcd..e8d2752c 100644 --- a/desktop/src/onionshare/settings_dialog.py +++ b/desktop/src/onionshare/settings_dialog.py @@ -19,13 +19,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. """ from PySide2 import QtCore, QtWidgets, QtGui +from PySide2.QtCore import Slot,Qt +from PySide2.QtGui import QPalette, QColor import sys import platform import datetime import re import os - -from onionshare_cli import common from onionshare_cli.settings import Settings from onionshare_cli.onion import ( Onion, @@ -47,11 +47,7 @@ from onionshare_cli.onion import ( from . import strings from .widgets import Alert from .update_checker import ( - UpdateCheckerCheckError, - UpdateCheckerInvalidLatestVersion, - UpdateChecker, - UpdateThread, -) + UpdateThread) from .tor_connection_dialog import TorConnectionDialog from .gui_common import GuiCommon @@ -129,6 +125,20 @@ class SettingsDialog(QtWidgets.QDialog): language_layout.addWidget(self.language_combobox) language_layout.addStretch() + #Theme Settings + theme_label = QtWidgets.QLabel(strings._("gui_settings_theme_label")) + self.theme_combobox = QtWidgets.QComboBox() + theme_choices = [ + strings._("gui_settings_theme_auto"), + strings._("gui_settings_theme_light"), + strings._("gui_settings_theme_dark") + ] + self.theme_combobox.addItems(theme_choices) + theme_layout = QtWidgets.QHBoxLayout() + theme_layout.addWidget(theme_label) + theme_layout.addWidget(self.theme_combobox) + theme_layout.addStretch() + # Connection type: either automatic, control port, or socket file # Bundled Tor @@ -457,6 +467,8 @@ class SettingsDialog(QtWidgets.QDialog): layout.addSpacing(20) layout.addLayout(language_layout) layout.addSpacing(20) + layout.addLayout(theme_layout) + layout.addSpacing(20) layout.addStretch() layout.addLayout(buttons_layout) @@ -483,6 +495,9 @@ class SettingsDialog(QtWidgets.QDialog): locale_index = self.language_combobox.findData(locale) self.language_combobox.setCurrentIndex(locale_index) + theme_choice = self.old_settings.get("theme") + self.theme_combobox.setCurrentIndex(theme_choice) + connection_type = self.old_settings.get("connection_type") if connection_type == "bundled": if self.connection_type_bundled_radio.isEnabled(): @@ -828,6 +843,12 @@ class SettingsDialog(QtWidgets.QDialog): notice = strings._("gui_settings_language_changed_notice") Alert(self.common, notice, QtWidgets.QMessageBox.Information) + + # If color mode changed, inform user they need to restart OnionShare + if changed(settings, self.old_settings, ["theme"]): + notice = strings._("gui_color_mode_changed_notice") + Alert(self.common, notice, QtWidgets.QMessageBox.Information) + # Save the new settings settings.save() @@ -937,6 +958,10 @@ class SettingsDialog(QtWidgets.QDialog): settings = Settings(self.common) settings.load() # To get the last update timestamp + # Theme + theme_index = self.theme_combobox.currentIndex() + settings.set("theme",theme_index) + # Language locale_index = self.language_combobox.currentIndex() locale = self.language_combobox.itemData(locale_index) diff --git a/desktop/src/onionshare/strings.py b/desktop/src/onionshare/strings.py index a3db202c..c4192a33 100644 --- a/desktop/src/onionshare/strings.py +++ b/desktop/src/onionshare/strings.py @@ -18,7 +18,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ import json -import locale import os strings = {} diff --git a/desktop/src/onionshare/tab/mode/__init__.py b/desktop/src/onionshare/tab/mode/__init__.py index 0cbccc51..aeecaf66 100644 --- a/desktop/src/onionshare/tab/mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/__init__.py @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ -from PySide2 import QtCore, QtWidgets, QtGui +from PySide2 import QtCore, QtWidgets from onionshare_cli.common import AutoStopTimer @@ -158,9 +158,16 @@ class Mode(QtWidgets.QWidget): ) ) else: - self.server_status.server_button.setText( - strings._("gui_please_wait") - ) + if self.common.platform == "Windows" or self.settings.get( + "general", "autostart_timer" + ): + self.server_status.server_button.setText( + strings._("gui_please_wait") + ) + else: + self.server_status.server_button.setText( + strings._("gui_please_wait_no_button") + ) # If the auto-stop timer has stopped, stop the server if self.server_status.status == ServerStatus.STATUS_STARTED: @@ -354,14 +361,19 @@ class Mode(QtWidgets.QWidget): self.app.onion.scheduled_key = None self.app.onion.scheduled_auth_cookie = None self.startup_thread.quit() - if self.onion_thread: - self.common.log("Mode", "cancel_server: quitting onion thread") - self.onion_thread.terminate() - self.onion_thread.wait() - if self.web_thread: - self.common.log("Mode", "cancel_server: quitting web thread") - self.web_thread.terminate() - self.web_thread.wait() + + # Canceling only works in Windows + # https://github.com/onionshare/onionshare/issues/1371 + if self.common.platform == "Windows": + if self.onion_thread: + self.common.log("Mode", "cancel_server: quitting onion thread") + self.onion_thread.terminate() + self.onion_thread.wait() + if self.web_thread: + self.common.log("Mode", "cancel_server: quitting web thread") + self.web_thread.terminate() + self.web_thread.wait() + self.stop_server() def cancel_server_custom(self): @@ -379,10 +391,10 @@ class Mode(QtWidgets.QWidget): if self.server_status.status != ServerStatus.STATUS_STOPPED: try: self.web.stop(self.app.port) - except: + except Exception: # Probably we had no port to begin with (Onion service didn't start) pass - self.app.cleanup() + self.web.cleanup() self.stop_server_custom() @@ -447,12 +459,24 @@ class Mode(QtWidgets.QWidget): """ pass + def handle_request_upload_includes_message(self, event): + """ + Handle REQUEST_UPLOAD_INCLUDES_MESSAGE event. + """ + pass + def handle_request_upload_file_renamed(self, event): """ Handle REQUEST_UPLOAD_FILE_RENAMED event. """ pass + def handle_request_upload_message(self, event): + """ + Handle REQUEST_UPLOAD_MESSAGE event. + """ + pass + def handle_request_upload_set_dir(self, event): """ Handle REQUEST_UPLOAD_SET_DIR event. diff --git a/desktop/src/onionshare/tab/mode/chat_mode/__init__.py b/desktop/src/onionshare/tab/mode/chat_mode/__init__.py index 2312a64e..fe3e69f1 100644 --- a/desktop/src/onionshare/tab/mode/chat_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/chat_mode/__init__.py @@ -18,19 +18,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ -import os -import random -import string - from PySide2 import QtCore, QtWidgets, QtGui -from onionshare_cli.onion import * -from onionshare_cli.common import Common from onionshare_cli.web import Web from .. import Mode from .... import strings -from ....widgets import MinimumWidthWidget +from ....widgets import MinimumSizeWidget from ....gui_common import GuiCommon @@ -68,6 +62,11 @@ class ChatMode(Mode): self.image = QtWidgets.QWidget() self.image.setLayout(image_layout) + # Set title placeholder + self.mode_settings_widget.title_lineedit.setPlaceholderText( + strings._("gui_tab_name_chat") + ) + # Server status self.server_status.set_mode("chat") self.server_status.server_started_finished.connect(self.update_primary_action) @@ -83,17 +82,16 @@ class ChatMode(Mode): # Top bar top_bar_layout = QtWidgets.QHBoxLayout() - top_bar_layout.addStretch() + # Add space at the top, same height as the toggle history bar in other modes + top_bar_layout.addWidget(MinimumSizeWidget(0, 30)) # Main layout self.main_layout = QtWidgets.QVBoxLayout() self.main_layout.addLayout(top_bar_layout) - self.main_layout.addStretch() self.main_layout.addWidget(header_label) - self.main_layout.addWidget(self.primary_action) + self.main_layout.addWidget(self.primary_action, stretch=1) self.main_layout.addWidget(self.server_status) - self.main_layout.addStretch() - self.main_layout.addWidget(MinimumWidthWidget(700)) + self.main_layout.addWidget(MinimumSizeWidget(700, 0)) # Column layout self.column_layout = QtWidgets.QHBoxLayout() diff --git a/desktop/src/onionshare/tab/mode/file_selection.py b/desktop/src/onionshare/tab/mode/file_selection.py index e9604ec5..302f07b9 100644 --- a/desktop/src/onionshare/tab/mode/file_selection.py +++ b/desktop/src/onionshare/tab/mode/file_selection.py @@ -72,8 +72,8 @@ class DropHereWidget(QtWidgets.QWidget): def resize(self, w, h): self.setGeometry(0, 0, w, h) self.image_label.setGeometry(0, 0, w, h - 100) - self.header_label.setGeometry(0, 310, w, h - 380) - self.text_label.setGeometry(0, 360, w, h - 400) + self.header_label.setGeometry(0, 290, w, h - 360) + self.text_label.setGeometry(0, 340, w, h - 380) class DropCountLabel(QtWidgets.QLabel): diff --git a/desktop/src/onionshare/tab/mode/history.py b/desktop/src/onionshare/tab/mode/history.py index 45e37c75..091905f7 100644 --- a/desktop/src/onionshare/tab/mode/history.py +++ b/desktop/src/onionshare/tab/mode/history.py @@ -148,6 +148,7 @@ class ShareHistoryItem(HistoryItem): # Change the label self.label.setText(self.get_finished_label_text(self.started_dt)) + self.label.setStyleSheet(self.common.gui.css["history_default_label"]) self.status = HistoryItem.STATUS_FINISHED else: @@ -253,7 +254,7 @@ class ReceiveHistoryItemFile(QtWidgets.QWidget): try: # If nautilus is available, open it subprocess.Popen(["xdg-open", self.dir]) - except: + except Exception: Alert( self.common, strings._("gui_open_folder_error").format(abs_filename), @@ -268,6 +269,60 @@ class ReceiveHistoryItemFile(QtWidgets.QWidget): subprocess.Popen(["explorer", f"/select,{abs_filename}"]) +class ReceiveHistoryItemMessage(QtWidgets.QWidget): + def __init__( + self, + common, + ): + super(ReceiveHistoryItemMessage, self).__init__() + self.common = common + self.filename = None + + # Read message button + message_pixmap = QtGui.QPixmap.fromImage( + QtGui.QImage(GuiCommon.get_resource_path("images/open_message.png")) + ) + message_icon = QtGui.QIcon(message_pixmap) + self.message_button = QtWidgets.QPushButton( + strings._("history_receive_read_message_button") + ) + self.message_button.setStyleSheet(self.common.gui.css["receive_message_button"]) + self.message_button.clicked.connect(self.open_message) + self.message_button.setIcon(message_icon) + self.message_button.setIconSize(message_pixmap.rect().size()) + + # Layouts + layout = QtWidgets.QHBoxLayout() + layout.addWidget(self.message_button) + layout.addStretch() + self.setLayout(layout) + + self.hide() + + def set_filename(self, new_filename): + self.filename = new_filename + self.show() + + def open_message(self): + """ + Open the message in the operating system's default text editor + """ + self.common.log("ReceiveHistoryItemMessage", "open_message", self.filename) + + # Linux + if self.common.platform == "Linux" or self.common.platform == "BSD": + # If nautilus is available, open it + subprocess.Popen(["xdg-open", self.filename]) + + # macOS + elif self.common.platform == "Darwin": + subprocess.call(["open", self.filename]) + + # Windows + elif self.common.platform == "Windows": + subprocess.Popen(["notepad", self.filename]) + + class ReceiveHistoryItem(HistoryItem): def __init__(self, common, id, content_length): super(ReceiveHistoryItem, self).__init__() @@ -277,6 +332,12 @@ class ReceiveHistoryItem(HistoryItem): self.started = datetime.now() self.status = HistoryItem.STATUS_STARTED + self.common.log( + "ReceiveHistoryItem", + "__init__", + f"id={self.id} content_length={self.content_length}", + ) + # Label self.label = QtWidgets.QLabel( strings._("gui_all_modes_transfer_started").format( @@ -295,6 +356,9 @@ class ReceiveHistoryItem(HistoryItem): self.common.gui.css["downloads_uploads_progress_bar"] ) + # The message widget, if a message was included + self.message = ReceiveHistoryItemMessage(self.common) + # This layout contains file widgets self.files_layout = QtWidgets.QVBoxLayout() self.files_layout.setContentsMargins(0, 0, 0, 0) @@ -305,6 +369,7 @@ class ReceiveHistoryItem(HistoryItem): # Layout layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label) + layout.addWidget(self.message) layout.addWidget(self.progress_bar) layout.addWidget(files_widget) layout.addStretch() @@ -313,6 +378,9 @@ class ReceiveHistoryItem(HistoryItem): # We're also making a dictionary of file widgets, to make them easier to access self.files = {} + def includes_message(self, message_filename): + self.message.set_filename(message_filename) + def update(self, data): """ Using the progress from Web, update the progress bar and file size labels @@ -372,6 +440,7 @@ class ReceiveHistoryItem(HistoryItem): # Change the label self.label.setText(self.get_finished_label_text(self.started)) + self.label.setStyleSheet(self.common.gui.css["history_default_label"]) elif data["action"] == "canceled": # Change the status @@ -412,6 +481,7 @@ class IndividualFileHistoryItem(HistoryItem): self.common.gui.css["history_individual_file_timestamp_label"] ) self.path_label = QtWidgets.QLabel(self.path) + self.path_label.setStyleSheet(self.common.gui.css["history_default_label"]) self.status_code_label = QtWidgets.QLabel() # Progress bar @@ -560,6 +630,13 @@ class HistoryItemList(QtWidgets.QScrollArea): if id in self.items: self.items[id].cancel() + def includes_message(self, id, message_filename): + """ + Show message button for receive mode + """ + if id in self.items: + self.items[id].includes_message(message_filename) + def reset(self): """ Reset all items, emptying the list. Override this method. @@ -637,6 +714,7 @@ class History(QtWidgets.QWidget): self.not_empty_layout.addLayout(header_layout) self.not_empty_layout.addWidget(self.item_list) self.not_empty = QtWidgets.QWidget() + self.not_empty.setStyleSheet(self.common.gui.css["downloads_uploads_not_empty"]) self.not_empty.setLayout(self.not_empty_layout) # Layout @@ -653,7 +731,7 @@ class History(QtWidgets.QWidget): """ Add a new item. """ - self.common.log("History", "add", f"id: {id}, item: {item}") + self.common.log("History", "add", f"id: {id}") # Hide empty, show not empty self.empty.hide() @@ -674,6 +752,12 @@ class History(QtWidgets.QWidget): """ self.item_list.cancel(id) + def includes_message(self, id, message_filename): + """ + Show the message button + """ + self.item_list.includes_message(id, message_filename) + def reset(self): """ Reset all items. diff --git a/desktop/src/onionshare/tab/mode/mode_settings_widget.py b/desktop/src/onionshare/tab/mode/mode_settings_widget.py index a3a315c9..9f55dbaf 100644 --- a/desktop/src/onionshare/tab/mode/mode_settings_widget.py +++ b/desktop/src/onionshare/tab/mode/mode_settings_widget.py @@ -23,7 +23,7 @@ from PySide2 import QtCore, QtWidgets from ... import strings -class ModeSettingsWidget(QtWidgets.QWidget): +class ModeSettingsWidget(QtWidgets.QScrollArea): """ All of the common settings for each mode are in this widget """ @@ -57,6 +57,16 @@ class ModeSettingsWidget(QtWidgets.QWidget): else: self.public_checkbox.setCheckState(QtCore.Qt.Unchecked) + # Title + title_label = QtWidgets.QLabel(strings._("mode_settings_title_label")) + self.title_lineedit = QtWidgets.QLineEdit() + self.title_lineedit.editingFinished.connect(self.title_editing_finished) + if self.settings.get("general", "title"): + self.title_lineedit.setText(self.settings.get("general", "title")) + title_layout = QtWidgets.QHBoxLayout() + title_layout.addWidget(title_label) + title_layout.addWidget(self.title_lineedit) + # Whether or not to use an auto-start timer self.autostart_timer_checkbox = QtWidgets.QCheckBox() self.autostart_timer_checkbox.clicked.connect( @@ -152,6 +162,7 @@ class ModeSettingsWidget(QtWidgets.QWidget): # Advanced group itself advanced_layout = QtWidgets.QVBoxLayout() advanced_layout.setContentsMargins(0, 0, 0, 0) + advanced_layout.addLayout(title_layout) advanced_layout.addLayout(autostart_timer_layout) advanced_layout.addLayout(autostop_timer_layout) advanced_layout.addWidget(self.legacy_checkbox) @@ -166,7 +177,15 @@ class ModeSettingsWidget(QtWidgets.QWidget): layout.addWidget(self.public_checkbox) layout.addWidget(self.advanced_widget) layout.addWidget(self.toggle_advanced_button) - self.setLayout(layout) + layout.addStretch() + main_widget = QtWidgets.QWidget() + main_widget.setLayout(layout) + + self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) + self.setWidgetResizable(True) + self.setFrameShape(QtWidgets.QFrame.NoFrame) + self.setWidget(main_widget) self.update_ui() @@ -203,6 +222,33 @@ class ModeSettingsWidget(QtWidgets.QWidget): self.legacy_checkbox.hide() self.client_auth_checkbox.hide() + def title_editing_finished(self): + if self.title_lineedit.text().strip() == "": + self.title_lineedit.setText("") + self.settings.set("general", "title", None) + if self.tab.mode == self.common.gui.MODE_SHARE: + self.tab.change_title.emit( + self.tab.tab_id, strings._("gui_tab_name_share") + ) + elif self.tab.mode == self.common.gui.MODE_RECEIVE: + self.tab.change_title.emit( + self.tab.tab_id, strings._("gui_tab_name_receive") + ) + elif self.tab.mode == self.common.gui.MODE_WEBSITE: + self.tab.change_title.emit( + self.tab.tab_id, strings._("gui_tab_name_website") + ) + elif self.tab.mode == self.common.gui.MODE_CHAT: + self.tab.change_title.emit( + self.tab.tab_id, strings._("gui_tab_name_chat") + ) + elif self.tab_mode is None: + pass + else: + title = self.title_lineedit.text() + self.settings.set("general", "title", title) + self.tab.change_title.emit(self.tab.tab_id, title) + def persistent_checkbox_clicked(self): self.settings.set("persistent", "enabled", self.persistent_checkbox.isChecked()) self.settings.set("persistent", "mode", self.tab.mode) diff --git a/desktop/src/onionshare/tab/mode/receive_mode/__init__.py b/desktop/src/onionshare/tab/mode/receive_mode/__init__.py index 8a848128..d07b5ffc 100644 --- a/desktop/src/onionshare/tab/mode/receive_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/receive_mode/__init__.py @@ -26,7 +26,7 @@ from onionshare_cli.web import Web from ..history import History, ToggleHistory, ReceiveHistoryItem from .. import Mode from .... import strings -from ....widgets import MinimumWidthWidget, Alert +from ....widgets import MinimumSizeWidget, Alert from ....gui_common import GuiCommon @@ -60,6 +60,8 @@ class ReceiveMode(Mode): self.image.setLayout(image_layout) # Settings + + # Data dir data_dir_label = QtWidgets.QLabel( strings._("mode_settings_receive_data_dir_label") ) @@ -74,9 +76,60 @@ class ReceiveMode(Mode): data_dir_layout.addWidget(data_dir_label) data_dir_layout.addWidget(self.data_dir_lineedit) data_dir_layout.addWidget(data_dir_button) - self.mode_settings_widget.mode_specific_layout.addLayout(data_dir_layout) + # Disable text or files + self.disable_text_checkbox = self.settings.get("receive", "disable_files") + self.disable_text_checkbox = QtWidgets.QCheckBox() + self.disable_text_checkbox.clicked.connect(self.disable_text_checkbox_clicked) + self.disable_text_checkbox.setText( + strings._("mode_settings_receive_disable_text_checkbox") + ) + self.disable_files_checkbox = self.settings.get("receive", "disable_files") + self.disable_files_checkbox = QtWidgets.QCheckBox() + self.disable_files_checkbox.clicked.connect(self.disable_files_checkbox_clicked) + self.disable_files_checkbox.setText( + strings._("mode_settings_receive_disable_files_checkbox") + ) + disable_layout = QtWidgets.QHBoxLayout() + disable_layout.addWidget(self.disable_text_checkbox) + disable_layout.addWidget(self.disable_files_checkbox) + disable_layout.addStretch() + self.mode_settings_widget.mode_specific_layout.addLayout(disable_layout) + + # Webhook URL + webhook_url = self.settings.get("receive", "webhook_url") + self.webhook_url_checkbox = QtWidgets.QCheckBox() + self.webhook_url_checkbox.clicked.connect(self.webhook_url_checkbox_clicked) + self.webhook_url_checkbox.setText( + strings._("mode_settings_receive_webhook_url_checkbox") + ) + self.webhook_url_lineedit = QtWidgets.QLineEdit() + self.webhook_url_lineedit.editingFinished.connect( + self.webhook_url_editing_finished + ) + self.webhook_url_lineedit.setPlaceholderText( + "https://example.com/post-when-file-uploaded" + ) + webhook_url_layout = QtWidgets.QHBoxLayout() + webhook_url_layout.addWidget(self.webhook_url_checkbox) + webhook_url_layout.addWidget(self.webhook_url_lineedit) + if webhook_url is not None and webhook_url != "": + self.webhook_url_checkbox.setCheckState(QtCore.Qt.Checked) + self.webhook_url_lineedit.setText( + self.settings.get("receive", "webhook_url") + ) + self.show_webhook_url() + else: + self.webhook_url_checkbox.setCheckState(QtCore.Qt.Unchecked) + self.hide_webhook_url() + self.mode_settings_widget.mode_specific_layout.addLayout(webhook_url_layout) + + # Set title placeholder + self.mode_settings_widget.title_lineedit.setPlaceholderText( + strings._("gui_tab_name_receive") + ) + # Server status self.server_status.set_mode("receive") self.server_status.server_started_finished.connect(self.update_primary_action) @@ -129,8 +182,8 @@ class ReceiveMode(Mode): self.main_layout = QtWidgets.QVBoxLayout() self.main_layout.addWidget(header_label) self.main_layout.addWidget(receive_warning) - self.main_layout.addWidget(self.primary_action) - self.main_layout.addWidget(MinimumWidthWidget(525)) + self.main_layout.addWidget(self.primary_action, stretch=1) + self.main_layout.addWidget(MinimumSizeWidget(525, 0)) # Row layout content_row = QtWidgets.QHBoxLayout() @@ -138,10 +191,8 @@ class ReceiveMode(Mode): content_row.addWidget(self.image) row_layout = QtWidgets.QVBoxLayout() row_layout.addLayout(top_bar_layout) - row_layout.addStretch() - row_layout.addLayout(content_row) + row_layout.addLayout(content_row, stretch=1) row_layout.addWidget(self.server_status) - row_layout.addStretch() # Column layout self.column_layout = QtWidgets.QHBoxLayout() @@ -183,6 +234,36 @@ class ReceiveMode(Mode): self.data_dir_lineedit.setText(selected_dir) self.settings.set("receive", "data_dir", selected_dir) + def disable_text_checkbox_clicked(self): + self.settings.set( + "receive", "disable_text", self.disable_text_checkbox.isChecked() + ) + + def disable_files_checkbox_clicked(self): + self.settings.set( + "receive", "disable_files", self.disable_files_checkbox.isChecked() + ) + + def webhook_url_checkbox_clicked(self): + if self.webhook_url_checkbox.isChecked(): + if self.settings.get("receive", "webhook_url"): + self.webhook_url_lineedit.setText( + self.settings.get("receive", "webhook_url") + ) + self.show_webhook_url() + else: + self.settings.set("receive", "webhook_url", None) + self.hide_webhook_url() + + def webhook_url_editing_finished(self): + self.settings.set("receive", "webhook_url", self.webhook_url_lineedit.text()) + + def hide_webhook_url(self): + self.webhook_url_lineedit.hide() + + def show_webhook_url(self): + self.webhook_url_lineedit.show() + def get_stop_server_autostop_timer_text(self): """ Return the string to put on the stop server button, if there's an auto-stop timer @@ -220,6 +301,16 @@ class ReceiveMode(Mode): # Hide and reset the uploads if we have previously shared self.reset_info_counters() + # Set proxies for webhook URL + if self.common.gui.local_only: + self.web.proxies = None + else: + (socks_address, socks_port) = self.common.gui.onion.get_tor_socks_port() + self.web.proxies = { + "http": f"socks5h://{socks_address}:{socks_port}", + "https": f"socks5h://{socks_address}:{socks_port}", + } + def start_server_step2_custom(self): """ Step 2 in starting the server. @@ -248,8 +339,11 @@ class ReceiveMode(Mode): Handle REQUEST_STARTED event. """ item = ReceiveHistoryItem( - self.common, event["data"]["id"], event["data"]["content_length"] + self.common, + event["data"]["id"], + event["data"]["content_length"], ) + self.history.add(event["data"]["id"], item) self.toggle_history.update_indicator(True) self.history.in_progress_count += 1 @@ -269,6 +363,12 @@ class ReceiveMode(Mode): {"action": "progress", "progress": event["data"]["progress"]}, ) + def handle_request_upload_includes_message(self, event): + """ + Handle REQUEST_UPLOAD_INCLUDES_MESSAGE event. + """ + self.history.includes_message(event["data"]["id"], event["data"]["filename"]) + def handle_request_upload_file_renamed(self, event): """ Handle REQUEST_UPLOAD_FILE_RENAMED event. diff --git a/desktop/src/onionshare/tab/mode/share_mode/__init__.py b/desktop/src/onionshare/tab/mode/share_mode/__init__.py index 74a4e2c2..4056d92e 100644 --- a/desktop/src/onionshare/tab/mode/share_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/share_mode/__init__.py @@ -21,7 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. import os from PySide2 import QtCore, QtWidgets, QtGui -from onionshare_cli.onion import * from onionshare_cli.common import Common from onionshare_cli.web import Web @@ -30,7 +29,7 @@ from .. import Mode from ..file_selection import FileSelection from ..history import History, ToggleHistory, ShareHistoryItem from .... import strings -from ....widgets import Alert, MinimumWidthWidget +from ....widgets import MinimumSizeWidget from ....gui_common import GuiCommon @@ -77,6 +76,11 @@ class ShareMode(Mode): for filename in self.filenames: self.file_selection.file_list.add_file(filename) + # Set title placeholder + self.mode_settings_widget.title_lineedit.setPlaceholderText( + strings._("gui_tab_name_share") + ) + # Server status self.server_status.set_mode("share", self.file_selection) self.server_status.server_started.connect(self.file_selection.server_started) @@ -156,9 +160,9 @@ class ShareMode(Mode): self.main_layout = QtWidgets.QVBoxLayout() self.main_layout.addLayout(top_bar_layout) self.main_layout.addLayout(self.file_selection) - self.main_layout.addWidget(self.primary_action) + self.main_layout.addWidget(self.primary_action, stretch=1) self.main_layout.addWidget(self.server_status) - self.main_layout.addWidget(MinimumWidthWidget(700)) + self.main_layout.addWidget(MinimumSizeWidget(700, 0)) # Column layout self.column_layout = QtWidgets.QHBoxLayout() diff --git a/desktop/src/onionshare/tab/mode/share_mode/threads.py b/desktop/src/onionshare/tab/mode/share_mode/threads.py index 6f5c44ea..839d30ea 100644 --- a/desktop/src/onionshare/tab/mode/share_mode/threads.py +++ b/desktop/src/onionshare/tab/mode/share_mode/threads.py @@ -36,7 +36,7 @@ class CompressThread(QtCore.QThread): # prepare files to share def set_processed_size(self, x): - if self.mode._zip_progress_bar != None: + if self.mode._zip_progress_bar is not None: self.mode._zip_progress_bar.update_processed_size_signal.emit(x) def run(self): @@ -47,9 +47,6 @@ class CompressThread(QtCore.QThread): self.mode.filenames, processed_size_callback=self.set_processed_size ) self.success.emit() - self.mode.app.cleanup_filenames += ( - self.mode.web.share_mode.cleanup_filenames - ) except OSError as e: self.error.emit(e.strerror) diff --git a/desktop/src/onionshare/tab/mode/website_mode/__init__.py b/desktop/src/onionshare/tab/mode/website_mode/__init__.py index 6aa83de0..577ea28e 100644 --- a/desktop/src/onionshare/tab/mode/website_mode/__init__.py +++ b/desktop/src/onionshare/tab/mode/website_mode/__init__.py @@ -19,12 +19,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. """ import os -import random -import string from PySide2 import QtCore, QtWidgets, QtGui -from onionshare_cli.onion import * from onionshare_cli.common import Common from onionshare_cli.web import Web @@ -32,7 +29,7 @@ from .. import Mode from ..file_selection import FileSelection from ..history import History, ToggleHistory from .... import strings -from ....widgets import Alert, MinimumWidthWidget +from ....widgets import MinimumSizeWidget from ....gui_common import GuiCommon @@ -77,6 +74,11 @@ class WebsiteMode(Mode): for filename in self.filenames: self.file_selection.file_list.add_file(filename) + # Set title placeholder + self.mode_settings_widget.title_lineedit.setPlaceholderText( + strings._("gui_tab_name_website") + ) + # Server status self.server_status.set_mode("website", self.file_selection) self.server_status.server_started.connect(self.file_selection.server_started) @@ -156,9 +158,9 @@ class WebsiteMode(Mode): self.main_layout = QtWidgets.QVBoxLayout() self.main_layout.addLayout(top_bar_layout) self.main_layout.addLayout(self.file_selection) - self.main_layout.addWidget(self.primary_action) + self.main_layout.addWidget(self.primary_action, stretch=1) self.main_layout.addWidget(self.server_status) - self.main_layout.addWidget(MinimumWidthWidget(700)) + self.main_layout.addWidget(MinimumSizeWidget(700, 0)) # Column layout self.column_layout = QtWidgets.QHBoxLayout() diff --git a/desktop/src/onionshare/tab/server_status.py b/desktop/src/onionshare/tab/server_status.py index 8c1c9655..ba5ff165 100644 --- a/desktop/src/onionshare/tab/server_status.py +++ b/desktop/src/onionshare/tab/server_status.py @@ -17,8 +17,6 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ - -import platform import textwrap from PySide2 import QtCore, QtWidgets, QtGui from PySide2.QtCore import Qt @@ -163,7 +161,7 @@ class ServerStatus(QtWidgets.QWidget): self.url.setText(wrapped_onion_url) else: self.url.setText(self.get_url()) - except: + except Exception: pass def show_url(self): @@ -308,13 +306,18 @@ class ServerStatus(QtWidgets.QWidget): ) ) else: - self.server_button.setText(strings._("gui_please_wait")) + if self.common.platform == "Windows": + self.server_button.setText(strings._("gui_please_wait")) + else: + self.server_button.setText( + strings._("gui_please_wait_no_button") + ) else: self.server_button.setStyleSheet( self.common.gui.css["server_status_button_working"] ) self.server_button.setEnabled(False) - self.server_button.setText(strings._("gui_please_wait")) + self.server_button.setText(strings._("gui_please_wait_no_button")) def server_button_clicked(self): """ @@ -381,7 +384,10 @@ class ServerStatus(QtWidgets.QWidget): self.start_server() elif self.status == self.STATUS_STARTED: self.stop_server() - elif self.status == self.STATUS_WORKING: + elif self.status == self.STATUS_WORKING and ( + self.common.platform == "Windows" + or self.settings.get("general", "autostart_timer") + ): self.cancel_server() self.button_clicked.emit() diff --git a/desktop/src/onionshare/tab/tab.py b/desktop/src/onionshare/tab/tab.py index 2d4e164c..09982de9 100644 --- a/desktop/src/onionshare/tab/tab.py +++ b/desktop/src/onionshare/tab/tab.py @@ -452,20 +452,20 @@ class Tab(QtWidgets.QWidget): # Chat mode if self.chat_mode.server_status.status == ServerStatus.STATUS_STOPPED: self.set_server_status_indicator_stopped( - strings._("gui_status_indicator_receive_stopped") + strings._("gui_status_indicator_chat_stopped") ) elif self.chat_mode.server_status.status == ServerStatus.STATUS_WORKING: if self.settings.get("general", "autostart_timer"): self.set_server_status_indicator_working( - strings._("gui_status_indicator_receive_scheduled") + strings._("gui_status_indicator_chat_scheduled") ) else: self.set_server_status_indicator_working( - strings._("gui_status_indicator_receive_working") + strings._("gui_status_indicator_chat_working") ) elif self.chat_mode.server_status.status == ServerStatus.STATUS_STARTED: self.set_server_status_indicator_started( - strings._("gui_status_indicator_receive_started") + strings._("gui_status_indicator_chat_started") ) def set_server_status_indicator_stopped(self, label_text): @@ -540,6 +540,9 @@ class Tab(QtWidgets.QWidget): elif event["type"] == Web.REQUEST_CANCELED: mode.handle_request_canceled(event) + elif event["type"] == Web.REQUEST_UPLOAD_INCLUDES_MESSAGE: + mode.handle_request_upload_includes_message(event) + elif event["type"] == Web.REQUEST_UPLOAD_FILE_RENAMED: mode.handle_request_upload_file_renamed(event) @@ -665,7 +668,7 @@ class Tab(QtWidgets.QWidget): if self.close_dialog.clickedButton() == self.close_dialog.accept_button: self.common.log("Tab", "close_tab", "close, closing tab") self.get_mode().stop_server() - self.app.cleanup() + self.get_mode().web.cleanup() return True # Cancel else: @@ -678,4 +681,4 @@ class Tab(QtWidgets.QWidget): self.get_mode().web.stop(self.get_mode().app.port) self.get_mode().web_thread.quit() self.get_mode().web_thread.wait() - self.app.cleanup() + self.get_mode().web.cleanup() diff --git a/desktop/src/onionshare/tab_widget.py b/desktop/src/onionshare/tab_widget.py index b9a70011..a955ea53 100644 --- a/desktop/src/onionshare/tab_widget.py +++ b/desktop/src/onionshare/tab_widget.py @@ -176,6 +176,11 @@ class TabWidget(QtWidgets.QTabWidget): ) tab.init(mode_settings) + + # Make sure the title is set + if tab.get_mode(): + tab.get_mode().mode_settings_widget.title_editing_finished() + # If it's persistent, set the persistent image in the tab self.change_persistent(tab.tab_id, tab.settings.get("persistent", "enabled")) @@ -183,8 +188,13 @@ class TabWidget(QtWidgets.QTabWidget): self.bring_to_front.emit() def change_title(self, tab_id, title): + shortened_title = title + if len(shortened_title) > 11: + shortened_title = shortened_title[:10] + "..." + index = self.indexOf(self.tabs[tab_id]) - self.setTabText(index, title) + self.setTabText(index, shortened_title) + self.setTabToolTip(index, title) def change_icon(self, tab_id, icon_path): index = self.indexOf(self.tabs[tab_id]) diff --git a/desktop/src/onionshare/threads.py b/desktop/src/onionshare/threads.py index 214344f7..c9a3dba4 100644 --- a/desktop/src/onionshare/threads.py +++ b/desktop/src/onionshare/threads.py @@ -158,14 +158,14 @@ class AutoStartTimer(QtCore.QThread): ) try: # Sleep until scheduled time - while autostart_timer_datetime_delta > 0 and self.canceled == False: + while autostart_timer_datetime_delta > 0 and self.canceled is False: time.sleep(0.1) now = QtCore.QDateTime.currentDateTime() autostart_timer_datetime_delta = now.secsTo( self.mode.server_status.autostart_timer_datetime ) # Timer has now finished - if self.canceled == False: + if self.canceled is False: self.mode.server_status.server_button.setText( strings._("gui_please_wait") ) @@ -252,7 +252,7 @@ class EventHandlerThread(QtCore.QThread): "EventHandler", "run", f"invalid event type: {obj}" ) - except: + except Exception: pass if self.should_quit: diff --git a/desktop/src/onionshare/tor_connection_dialog.py b/desktop/src/onionshare/tor_connection_dialog.py index c3644f8b..b5c2f61c 100644 --- a/desktop/src/onionshare/tor_connection_dialog.py +++ b/desktop/src/onionshare/tor_connection_dialog.py @@ -166,7 +166,7 @@ class TorConnectionThread(QtCore.QThread): else: self.canceled_connecting_to_tor.emit() - except BundledTorCanceled as e: + except BundledTorCanceled: self.common.log( "TorConnectionThread", "run", "caught exception: BundledTorCanceled" ) diff --git a/desktop/src/onionshare/update_checker.py b/desktop/src/onionshare/update_checker.py index 1d8e8b07..e9dbc060 100644 --- a/desktop/src/onionshare/update_checker.py +++ b/desktop/src/onionshare/update_checker.py @@ -19,14 +19,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. """ from PySide2 import QtCore -import datetime, time, socket, re, platform +import datetime +import re import socks from distutils.version import LooseVersion as Version from onionshare_cli.settings import Settings -from onionshare_cli.onion import Onion - -from . import strings class UpdateCheckerCheckError(Exception): @@ -170,7 +168,7 @@ class UpdateChecker(QtCore.QObject): settings.save() # Do we need to update? - update_url = f"https://github.com/micahflee/onionshare/releases/tag/v{latest_version}" + update_url = "https://onionshare.org" installed_version = self.common.version if installed_version < latest_version: self.update_available.emit( diff --git a/desktop/src/onionshare/widgets.py b/desktop/src/onionshare/widgets.py index a1880a2e..c239d03a 100644 --- a/desktop/src/onionshare/widgets.py +++ b/desktop/src/onionshare/widgets.py @@ -84,14 +84,15 @@ class AddFileDialog(QtWidgets.QFileDialog): QtWidgets.QDialog.accept(self) -class MinimumWidthWidget(QtWidgets.QWidget): +class MinimumSizeWidget(QtWidgets.QWidget): """ - An empty widget with a minimum width, just to force layouts to behave + An empty widget with a minimum width and height, just to force layouts to behave """ - def __init__(self, width): - super(MinimumWidthWidget, self).__init__() + def __init__(self, width, height): + super(MinimumSizeWidget, self).__init__() self.setMinimumWidth(width) + self.setMinimumHeight(height) class Image(qrcode.image.base.BaseImage): diff --git a/desktop/src/org.onionshare.OnionShare.appdata.xml b/desktop/src/org.onionshare.OnionShare.appdata.xml index 3cee6454..a53bc930 100644 --- a/desktop/src/org.onionshare.OnionShare.appdata.xml +++ b/desktop/src/org.onionshare.OnionShare.appdata.xml @@ -13,17 +13,17 @@ <launchable type="desktop-id">org.onionshare.OnionShare.desktop</launchable> <screenshots> <screenshot type="default"> - <image>https://raw.githubusercontent.com/micahflee/onionshare/master/docs/source/_static/screenshots/tabs.png</image> + <image>https://docs.onionshare.org/2.3.3/en/_images/tabs.png</image> <caption>Types of services that OnionShare supports</caption> </screenshot> </screenshots> - <url type="bugtracker">https://github.com/micahflee/onionshare/issues/</url> + <url type="bugtracker">https://github.com/onionshare/onionshare/issues/</url> <url type="help">https://onionshare.org/</url> <url type="homepage">https://onionshare.org/</url> <developer_name>Micah Lee</developer_name> <update_contact>micah@micahflee.com</update_contact> <content_rating type="oars-1.1" /> <releases> - <release type="development" date="2021-02-22" version="2.3.1" /> + <release type="development" date="2021-08-20" version="2.3.3" /> </releases> </component> diff --git a/desktop/src/setup.py b/desktop/src/setup.py index 83aeeba1..cd3c21f6 100644 --- a/desktop/src/setup.py +++ b/desktop/src/setup.py @@ -18,19 +18,19 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ - -# This setup.py file is used for snap and flatpak packaging. For other packaging, -# OnionShare uses briefcase. - -import os import setuptools -version = "2.3.1" +version = "2.3.3" setuptools.setup( name="onionshare", version=version, - description="OnionShare lets you securely and anonymously send and receive files. It works by starting a web server, making it accessible as a Tor onion service, and generating an unguessable web address so others can download files from you, or upload files to you. It does _not_ require setting up a separate server or using a third party file-sharing service.", + description=( + "OnionShare lets you securely and anonymously send and receive files. It works by starting a web " + "server, making it accessible as a Tor onion service, and generating an unguessable web address so " + "others can download files from you, or upload files to you. It does _not_ require setting up a " + "separate server or using a third party file-sharing service." + ), author="Micah Lee", author_email="micah@micahflee.com", maintainer="Micah Lee", diff --git a/desktop/tests/conftest.py b/desktop/tests/conftest.py index 65d13fa6..b17aa45c 100644 --- a/desktop/tests/conftest.py +++ b/desktop/tests/conftest.py @@ -1,19 +1,20 @@ import sys - -# Force tests to look for resources in the source code tree -sys.onionshare_dev_mode = True - -# Let OnionShare know the tests are running, to avoid colliding with settings files -sys.onionshare_test_mode = True - import os import shutil import tempfile from datetime import datetime, timedelta import pytest +from PySide2 import QtTest + +from onionshare_cli import common, web, settings -from PySide2 import QtTest, QtGui + +# Force tests to look for resources in the source code tree +sys.onionshare_dev_mode = True + +# Let OnionShare know the tests are running, to avoid colliding with settings files +sys.onionshare_test_mode = True @staticmethod @@ -36,9 +37,6 @@ sys.path.insert( ), ) -from onionshare_cli import common, web, settings - - # The temporary directory for CLI tests test_temp_dir = None @@ -69,7 +67,7 @@ def temp_dir(): @pytest.fixture def temp_dir_1024(temp_dir): - """ Create a temporary directory that has a single file of a + """Create a temporary directory that has a single file of a particular size (1024 bytes). """ @@ -83,7 +81,7 @@ def temp_dir_1024(temp_dir): # pytest > 2.9 only needs @pytest.fixture @pytest.yield_fixture def temp_dir_1024_delete(temp_dir): - """ Create a temporary directory that has a single file of a + """Create a temporary directory that has a single file of a particular size (1024 bytes). The temporary directory (including the file inside) will be deleted after fixture usage. """ @@ -97,7 +95,7 @@ def temp_dir_1024_delete(temp_dir): @pytest.fixture def temp_file_1024(temp_dir): - """ Create a temporary file of a particular size (1024 bytes). """ + """Create a temporary file of a particular size (1024 bytes).""" with tempfile.NamedTemporaryFile(delete=False, dir=temp_dir) as tmp_file: tmp_file.write(b"*" * 1024) @@ -141,7 +139,7 @@ def default_zw(): tmp_dir = os.path.dirname(zw.zip_filename) try: shutil.rmtree(tmp_dir, ignore_errors=True) - except: + except Exception: pass diff --git a/desktop/tests/gui_base_test.py b/desktop/tests/gui_base_test.py index 214da945..acaa9739 100644 --- a/desktop/tests/gui_base_test.py +++ b/desktop/tests/gui_base_test.py @@ -1,11 +1,7 @@ -import pytest import unittest - -import json import os import requests import shutil -import base64 import tempfile import secrets import platform @@ -13,14 +9,12 @@ import platform from PySide2 import QtCore, QtTest, QtWidgets from onionshare_cli.common import Common -from onionshare_cli.settings import Settings -from onionshare_cli.onion import Onion -from onionshare_cli.web import Web from onionshare import Application, MainWindow, GuiCommon from onionshare.tab.mode.share_mode import ShareMode from onionshare.tab.mode.receive_mode import ReceiveMode from onionshare.tab.mode.website_mode import WebsiteMode +from onionshare.tab.mode.chat_mode import ChatMode from onionshare import strings @@ -140,6 +134,17 @@ class GuiBaseTest(unittest.TestCase): return tab + def new_chat_tab(self): + tab = self.gui.tabs.widget(0) + self.verify_new_tab(tab) + + # Chat + tab.chat_button.click() + self.assertFalse(tab.new_tab.isVisible()) + self.assertTrue(tab.chat_mode.isVisible()) + + return tab + def close_all_tabs(self): for _ in range(self.gui.tabs.count()): tab = self.gui.tabs.widget(0) @@ -368,6 +373,7 @@ class GuiBaseTest(unittest.TestCase): and not tab.settings.get("share", "autostop_sharing") ) or (type(tab.get_mode()) == WebsiteMode) + or (type(tab.get_mode()) == ChatMode) ): tab.get_mode().server_status.server_button.click() self.assertEqual(tab.get_mode().server_status.status, 0) @@ -459,6 +465,20 @@ class GuiBaseTest(unittest.TestCase): # We should have timed out now self.assertEqual(tab.get_mode().server_status.status, 0) + def hit_405(self, url, expected_resp, data = {}, methods = [] ): + """Test various HTTP methods and the response""" + for method in methods: + if method == "put": + r = requests.put(url, data = data) + if method == "post": + r = requests.post(url, data = data) + if method == "delete": + r = requests.delete(url) + if method == "options": + r = requests.options(url) + self.assertTrue(expected_resp in r.text) + self.assertFalse('Werkzeug' in r.headers) + # Grouped tests follow from here def run_all_common_setup_tests(self): diff --git a/desktop/tests/run.sh b/desktop/tests/run.sh index 833c1516..0f019b05 100755 --- a/desktop/tests/run.sh +++ b/desktop/tests/run.sh @@ -2,4 +2,5 @@ pytest -v tests/test_gui_tabs.py && \ pytest -v tests/test_gui_share.py && \ pytest -v tests/test_gui_receive.py && \ -pytest -v tests/test_gui_website.py +pytest -v tests/test_gui_website.py && \ +pytest -v tests/test_gui_chat.py diff --git a/desktop/tests/test_gui_chat.py b/desktop/tests/test_gui_chat.py new file mode 100644 index 00000000..15ecaa44 --- /dev/null +++ b/desktop/tests/test_gui_chat.py @@ -0,0 +1,98 @@ +import requests + +from PySide2 import QtTest + +from .gui_base_test import GuiBaseTest + + +class TestChat(GuiBaseTest): + # Shared test methods + + def view_chat(self, tab): + """Test that we can view the chat room""" + url = f"http://127.0.0.1:{tab.app.port}/" + if tab.settings.get("general", "public"): + r = requests.get(url) + else: + r = requests.get( + url, + auth=requests.auth.HTTPBasicAuth( + "onionshare", tab.get_mode().server_status.web.password + ), + ) + + QtTest.QTest.qWait(500, self.gui.qtapp) + self.assertTrue("Chat <b>requires JavaScript</b>" in r.text) + + cookies_dict = requests.utils.dict_from_cookiejar(r.cookies) + self.assertTrue("session" in cookies_dict.keys()) + + def change_username(self, tab): + """Test that we can change our username""" + url = f"http://127.0.0.1:{tab.app.port}/update-session-username" + data = {"username": "oniontest"} + if tab.settings.get("general", "public"): + r = requests.post(url, json=data) + else: + r = requests.post( + url, + json=data, + auth=requests.auth.HTTPBasicAuth( + "onionshare", tab.get_mode().server_status.web.password + ), + ) + + QtTest.QTest.qWait(500, self.gui.qtapp) + jsonResponse = r.json() + self.assertTrue(jsonResponse["success"]) + self.assertEqual(jsonResponse["username"], "oniontest") + + def run_all_chat_mode_started_tests(self, tab): + """Tests in chat mode after starting a chat""" + self.server_working_on_start_button_pressed(tab) + self.server_status_indicator_says_starting(tab) + self.server_is_started(tab, startup_time=500) + self.web_server_is_running(tab) + self.have_a_password(tab) + self.url_description_shown(tab) + self.have_copy_url_button(tab) + self.have_show_qr_code_button(tab) + self.server_status_indicator_says_started(tab) + + def run_all_chat_mode_stopping_tests(self, tab): + """Tests stopping a chat""" + self.server_is_stopped(tab) + self.web_server_is_stopped(tab) + self.server_status_indicator_says_closed(tab) + + # Tests + + def test_chat(self): + """ + Test chat mode + """ + tab = self.new_chat_tab() + self.run_all_chat_mode_started_tests(tab) + self.view_chat(tab) + self.change_username(tab) + self.run_all_chat_mode_stopping_tests(tab) + self.close_all_tabs() + + def test_405_page_returned_for_invalid_methods(self): + """ + Our custom 405 page should return for invalid methods + """ + tab = self.new_chat_tab() + + tab.get_mode().mode_settings_widget.public_checkbox.click() + + self.run_all_chat_mode_started_tests(tab) + url = f"http://127.0.0.1:{tab.app.port}/" + self.hit_405( + url, + expected_resp="OnionShare: 405 Method Not Allowed", + data={"foo": "bar"}, + methods=["put", "post", "delete", "options"], + ) + self.run_all_chat_mode_stopping_tests(tab) + self.close_all_tabs() diff --git a/desktop/tests/test_gui_receive.py b/desktop/tests/test_gui_receive.py index 848b2f11..b523b0fa 100644 --- a/desktop/tests/test_gui_receive.py +++ b/desktop/tests/test_gui_receive.py @@ -48,15 +48,15 @@ class TestReceive(GuiBaseTest): QtTest.QTest.qWait(1000, self.gui.qtapp) - # Make sure the file is within the last 10 seconds worth of fileames + # Make sure the file is within the last 10 seconds worth of filenames exists = False now = datetime.now() for _ in range(10): date_dir = now.strftime("%Y-%m-%d") if identical_files_at_once: - time_dir = now.strftime("%H.%M.%S-1") + time_dir = now.strftime("%H%M%S-1") else: - time_dir = now.strftime("%H.%M.%S") + time_dir = now.strftime("%H%M%S") receive_mode_dir = os.path.join( tab.settings.get("receive", "data_dir"), date_dir, time_dir ) @@ -93,6 +93,47 @@ class TestReceive(GuiBaseTest): QtCore.QTimer.singleShot(1000, accept_dialog) self.assertTrue("Error uploading, please inform the OnionShare user" in r.text) + def submit_message(self, tab, message): + """Test that we can submit a message""" + + # Wait 2 seconds to make sure the filename, based on timestamp, isn't accidentally reused + QtTest.QTest.qWait(2000, self.gui.qtapp) + + url = f"http://127.0.0.1:{tab.app.port}/upload" + if tab.settings.get("general", "public"): + requests.post(url, data={"text": message}) + else: + requests.post( + url, + data={"text": message}, + auth=requests.auth.HTTPBasicAuth( + "onionshare", tab.get_mode().web.password + ), + ) + + QtTest.QTest.qWait(1000, self.gui.qtapp) + + # Make sure the file is within the last 10 seconds worth of filenames + exists = False + now = datetime.now() + for _ in range(10): + date_dir = now.strftime("%Y-%m-%d") + time_dir = now.strftime("%H%M%S") + expected_filename = os.path.join( + tab.settings.get("receive", "data_dir"), + date_dir, + f"{time_dir}-message.txt", + ) + if os.path.exists(expected_filename): + with open(expected_filename) as f: + assert f.read() == message + + exists = True + break + now = now - timedelta(seconds=1) + + self.assertTrue(exists) + def try_without_auth_in_non_public_mode(self, tab): r = requests.post(f"http://127.0.0.1:{tab.app.port}/upload") self.assertEqual(r.status_code, 401) @@ -115,10 +156,9 @@ class TestReceive(GuiBaseTest): self.have_copy_url_button(tab) self.have_show_qr_code_button(tab) self.server_status_indicator_says_started(tab) - self.web_page(tab, "Select the files you want to send, then click") def run_all_receive_mode_tests(self, tab): - """Upload files in receive mode and stop the share""" + """Submit files and messages in receive mode and stop the share""" self.run_all_receive_mode_setup_tests(tab) if not tab.settings.get("general", "public"): self.try_without_auth_in_non_public_mode(tab) @@ -131,9 +171,11 @@ class TestReceive(GuiBaseTest): self.counter_incremented(tab, 3) self.upload_file(tab, self.tmpfile_test2, "test2.txt") self.counter_incremented(tab, 4) + self.submit_message(tab, "onionshare is an interesting piece of software") + self.counter_incremented(tab, 5) # Test uploading the same file twice at the same time, and make sure no collisions self.upload_file(tab, self.tmpfile_test, "test.txt", True) - self.counter_incremented(tab, 6) + self.counter_incremented(tab, 7) self.history_indicator(tab, "2") self.server_is_stopped(tab) self.web_server_is_stopped(tab) @@ -244,3 +286,22 @@ class TestReceive(GuiBaseTest): self.run_all_upload_non_writable_dir_tests(tab) self.close_all_tabs() + + def test_405_page_returned_for_invalid_methods(self): + """ + Our custom 405 page should return for invalid methods + """ + tab = self.new_receive_tab() + + tab.get_mode().mode_settings_widget.public_checkbox.click() + + self.run_all_common_setup_tests() + self.run_all_receive_mode_setup_tests(tab) + self.upload_file(tab, self.tmpfile_test, "test.txt") + url = f"http://127.0.0.1:{tab.app.port}/" + self.hit_405(url, expected_resp="OnionShare: 405 Method Not Allowed", data = {'foo':'bar'}, methods = ["put", "post", "delete", "options"]) + + self.server_is_stopped(tab) + self.web_server_is_stopped(tab) + self.server_status_indicator_says_closed(tab) + self.close_all_tabs() diff --git a/desktop/tests/test_gui_share.py b/desktop/tests/test_gui_share.py index 0e521d52..531e456f 100644 --- a/desktop/tests/test_gui_share.py +++ b/desktop/tests/test_gui_share.py @@ -1,4 +1,3 @@ -import pytest import os import requests import tempfile @@ -609,3 +608,20 @@ class TestShare(GuiBaseTest): self.hit_401(tab) self.close_all_tabs() + + def test_405_page_returned_for_invalid_methods(self): + """ + Our custom 405 page should return for invalid methods + """ + tab = self.new_share_tab() + + tab.get_mode().autostop_sharing_checkbox.click() + tab.get_mode().mode_settings_widget.public_checkbox.click() + + self.run_all_common_setup_tests() + self.run_all_share_mode_setup_tests(tab) + self.run_all_share_mode_started_tests(tab) + url = f"http://127.0.0.1:{tab.app.port}/" + self.hit_405(url, expected_resp="OnionShare: 405 Method Not Allowed", data = {'foo':'bar'}, methods = ["put", "post", "delete", "options"]) + self.history_widgets_present(tab) + self.close_all_tabs() diff --git a/desktop/tests/test_gui_tabs.py b/desktop/tests/test_gui_tabs.py index 4ebbdffb..09f38bb4 100644 --- a/desktop/tests/test_gui_tabs.py +++ b/desktop/tests/test_gui_tabs.py @@ -1,4 +1,3 @@ -import pytest import os from PySide2 import QtCore, QtTest, QtWidgets @@ -154,11 +153,21 @@ class TestTabs(GuiBaseTest): self.gui.status_bar.server_status_label.text(), "Ready to share" ) + # New tab, chat mode + self.gui.tabs.new_tab_button.click() + self.gui.tabs.widget(4).chat_button.click() + self.assertFalse(self.gui.tabs.widget(4).new_tab.isVisible()) + self.assertTrue(self.gui.tabs.widget(4).chat_mode.isVisible()) + self.assertEqual( + self.gui.status_bar.server_status_label.text(), "Ready to chat" + ) + # Close tabs self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click() self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click() self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click() self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click() + self.gui.tabs.tabBar().tabButton(0, QtWidgets.QTabBar.RightSide).click() def test_07_close_share_tab_while_server_started_should_warn(self): """Closing a share mode tab when the server is running should throw a warning""" @@ -166,7 +175,7 @@ class TestTabs(GuiBaseTest): self.close_tab_with_active_server(tab) def test_08_close_receive_tab_while_server_started_should_warn(self): - """Closing a recieve mode tab when the server is running should throw a warning""" + """Closing a receive mode tab when the server is running should throw a warning""" tab = self.new_receive_tab() self.close_tab_with_active_server(tab) @@ -175,22 +184,32 @@ class TestTabs(GuiBaseTest): tab = self.new_website_tab_with_files() self.close_tab_with_active_server(tab) - def test_10_close_persistent_share_tab_shows_warning(self): + def test_10_close_chat_tab_while_server_started_should_warn(self): + """Closing a chat mode tab when the server is running should throw a warning""" + tab = self.new_chat_tab() + self.close_tab_with_active_server(tab) + + def test_11_close_persistent_share_tab_shows_warning(self): """Closing a share mode tab that's persistent should show a warning""" tab = self.new_share_tab_with_files() self.close_persistent_tab(tab) - def test_11_close_persistent_receive_tab_shows_warning(self): + def test_12_close_persistent_receive_tab_shows_warning(self): """Closing a receive mode tab that's persistent should show a warning""" tab = self.new_receive_tab() self.close_persistent_tab(tab) - def test_12_close_persistent_website_tab_shows_warning(self): + def test_13_close_persistent_website_tab_shows_warning(self): """Closing a website mode tab that's persistent should show a warning""" tab = self.new_website_tab_with_files() self.close_persistent_tab(tab) - def test_13_quit_with_server_started_should_warn(self): + def test_14_close_persistent_chat_tab_shows_warning(self): + """Closing a chat mode tab that's persistent should show a warning""" + tab = self.new_chat_tab() + self.close_persistent_tab(tab) + + def test_15_quit_with_server_started_should_warn(self): """Quitting OnionShare with any active servers should show a warning""" tab = self.new_share_tab() diff --git a/desktop/tests/test_gui_website.py b/desktop/tests/test_gui_website.py index 164aa07d..f526756a 100644 --- a/desktop/tests/test_gui_website.py +++ b/desktop/tests/test_gui_website.py @@ -1,10 +1,6 @@ -import pytest -import os import requests -import shutil -from datetime import datetime, timedelta -from PySide2 import QtCore, QtTest +from PySide2 import QtTest from .gui_base_test import GuiBaseTest @@ -103,3 +99,19 @@ class TestWebsite(GuiBaseTest): tab.get_mode().disable_csp_checkbox.click() self.run_all_website_mode_download_tests(tab) self.close_all_tabs() + + def test_405_page_returned_for_invalid_methods(self): + """ + Our custom 405 page should return for invalid methods + """ + tab = self.new_website_tab() + + tab.get_mode().mode_settings_widget.public_checkbox.click() + + self.run_all_common_setup_tests() + self.run_all_website_mode_setup_tests(tab) + self.run_all_website_mode_started_tests(tab) + url = f"http://127.0.0.1:{tab.app.port}/" + self.hit_405(url, expected_resp="OnionShare: 405 Method Not Allowed", data = {'foo':'bar'}, methods = ["put", "post", "delete", "options"]) + + self.close_all_tabs() |