summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicah Lee <micah@micahflee.com>2019-05-06 18:06:14 -0700
committerGitHub <noreply@github.com>2019-05-06 18:06:14 -0700
commitbbf6c02da645fcd4fc50db18dd341178ad4fa2e6 (patch)
treec1e2757c56f517e051c9f905f8a7a12e1b8d66ae
parenta8201593ec0bfe7596ef530e80aa30e5172ef71d (diff)
parent9e9c29b189cb91ea495a85ed749730395926e07b (diff)
downloadonionshare-bbf6c02da645fcd4fc50db18dd341178ad4fa2e6.tar.gz
onionshare-bbf6c02da645fcd4fc50db18dd341178ad4fa2e6.zip
Merge pull request #980 from micahflee/developv2.1
Version 2.1
-rw-r--r--.gitignore3
-rw-r--r--BUILD.md142
-rw-r--r--CHANGELOG.md24
-rw-r--r--README.md10
-rwxr-xr-xinstall/build_osx.sh21
-rwxr-xr-xinstall/build_rpm.sh2
-rwxr-xr-xinstall/build_source.sh81
-rwxr-xr-x[-rw-r--r--]install/check_lacked_trans.py5
-rw-r--r--install/get-tor-osx.py6
-rw-r--r--install/get-tor-windows.py6
-rw-r--r--install/onionshare.desktop2
-rw-r--r--install/onionshare.nsi4
-rw-r--r--install/requirements-tests.txt18
-rw-r--r--install/requirements.txt29
-rw-r--r--onionshare/__init__.py159
-rw-r--r--onionshare/common.py12
-rw-r--r--onionshare/onion.py67
-rw-r--r--onionshare/onionshare.py18
-rw-r--r--onionshare/settings.py49
-rw-r--r--onionshare/web/receive_mode.py19
-rw-r--r--onionshare/web/share_mode.py2
-rw-r--r--onionshare/web/web.py29
-rw-r--r--onionshare_gui/__init__.py31
-rw-r--r--onionshare_gui/mode/__init__.py126
-rw-r--r--onionshare_gui/mode/receive_mode/__init__.py14
-rw-r--r--onionshare_gui/mode/share_mode/__init__.py14
-rw-r--r--onionshare_gui/onionshare_gui.py32
-rw-r--r--onionshare_gui/server_status.py222
-rw-r--r--onionshare_gui/settings_dialog.py69
-rw-r--r--onionshare_gui/threads.py69
-rw-r--r--onionshare_gui/update_checker.py2
-rw-r--r--screenshots/onionshare-receive-client.pngbin67444 -> 589481 bytes
-rw-r--r--screenshots/onionshare-receive-server.pngbin78558 -> 569260 bytes
-rw-r--r--share/locale/am.json22
-rw-r--r--share/locale/ar.json155
-rw-r--r--share/locale/bg.json22
-rw-r--r--share/locale/bn.json130
-rw-r--r--share/locale/ca.json81
-rw-r--r--share/locale/cs.json6
-rw-r--r--share/locale/da.json57
-rw-r--r--share/locale/de.json103
-rw-r--r--share/locale/el.json41
-rw-r--r--share/locale/en.json55
-rw-r--r--share/locale/eo.json2
-rw-r--r--share/locale/es.json41
-rw-r--r--share/locale/fa.json26
-rw-r--r--share/locale/fi.json197
-rw-r--r--share/locale/fr.json47
-rw-r--r--share/locale/ga.json63
-rw-r--r--share/locale/gu.json22
-rw-r--r--share/locale/he.json65
-rw-r--r--share/locale/hi.json184
-rw-r--r--share/locale/hu.json22
-rw-r--r--share/locale/id.json139
-rw-r--r--share/locale/is.json334
-rw-r--r--share/locale/it.json47
-rw-r--r--share/locale/ja.json41
-rw-r--r--share/locale/ka.json30
-rw-r--r--share/locale/km.json175
-rw-r--r--share/locale/ko.json22
-rw-r--r--share/locale/lg.json22
-rw-r--r--share/locale/mk.json22
-rw-r--r--share/locale/ms.json184
-rw-r--r--share/locale/nb.json (renamed from share/locale/no.json)92
-rw-r--r--share/locale/nl.json22
-rw-r--r--share/locale/pa.json22
-rw-r--r--share/locale/pl.json147
-rw-r--r--share/locale/pt_BR.json84
-rw-r--r--share/locale/pt_PT.json330
-rw-r--r--share/locale/ro.json22
-rw-r--r--share/locale/ru.json39
-rw-r--r--share/locale/sl.json22
-rw-r--r--share/locale/sn.json22
-rw-r--r--share/locale/sv.json52
-rw-r--r--share/locale/te.json175
-rw-r--r--share/locale/tr.json198
-rw-r--r--share/locale/uk.json175
-rw-r--r--share/locale/wo.json22
-rw-r--r--share/locale/yo.json22
-rw-r--r--share/locale/zh_Hans.json269
-rw-r--r--share/locale/zh_Hant.json334
-rw-r--r--share/static/css/style.css14
-rw-r--r--share/static/img/warning.pngbin0 -> 804 bytes
-rw-r--r--share/static/js/jquery-3.3.1.min.js2
-rw-r--r--share/static/js/jquery-3.4.0.min.js2
-rw-r--r--share/templates/403.html29
-rw-r--r--share/templates/404.html29
-rw-r--r--share/templates/denied.html17
-rw-r--r--share/templates/receive.html44
-rw-r--r--share/templates/receive_noscript_xss.html4
-rw-r--r--share/templates/send.html105
-rw-r--r--share/templates/thankyou.html39
-rw-r--r--share/version.txt2
-rw-r--r--stdeb.cfg6
-rw-r--r--tests/GuiBaseTest.py45
-rw-r--r--tests/GuiReceiveTest.py27
-rw-r--r--tests/GuiShareTest.py21
-rw-r--r--tests/SettingsGuiBaseTest.py12
-rw-r--r--tests/TorGuiBaseTest.py13
-rw-r--r--tests/TorGuiShareTest.py2
-rw-r--r--tests/local_onionshare_404_public_mode_skips_ratelimit_test.py1
-rw-r--r--tests/local_onionshare_404_triggers_ratelimit_test.py1
-rw-r--r--tests/local_onionshare_quitting_during_share_prompts_warning_test.py1
-rw-r--r--tests/local_onionshare_receive_mode_sender_closed_test.py26
-rw-r--r--tests/local_onionshare_receive_mode_timer_test.py3
-rw-r--r--tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py1
-rw-r--r--tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py1
-rw-r--r--tests/local_onionshare_receive_mode_upload_public_mode_test.py1
-rw-r--r--tests/local_onionshare_receive_mode_upload_test.py1
-rw-r--r--tests/local_onionshare_settings_dialog_legacy_tor_test.py1
-rw-r--r--tests/local_onionshare_settings_dialog_no_tor_test.py1
-rw-r--r--tests/local_onionshare_settings_dialog_v3_tor_test.py1
-rw-r--r--tests/local_onionshare_share_mode_autostart_and_autostop_timer_mismatch_test.py28
-rw-r--r--tests/local_onionshare_share_mode_autostart_timer_test.py27
-rw-r--r--tests/local_onionshare_share_mode_autostart_timer_too_short_test.py34
-rw-r--r--tests/local_onionshare_share_mode_cancel_share_test.py27
-rw-r--r--tests/local_onionshare_share_mode_download_public_mode_test.py1
-rw-r--r--tests/local_onionshare_share_mode_download_stay_open_test.py1
-rw-r--r--tests/local_onionshare_share_mode_download_test.py1
-rw-r--r--tests/local_onionshare_share_mode_large_download_test.py1
-rw-r--r--tests/local_onionshare_share_mode_slug_persistent_test.py1
-rw-r--r--tests/local_onionshare_share_mode_timer_test.py3
-rw-r--r--tests/local_onionshare_share_mode_timer_too_short_test.py3
-rw-r--r--tests/local_onionshare_share_mode_unreadable_file_test.py1
-rw-r--r--tests/onionshare_790_cancel_on_second_share_test.py1
-rw-r--r--tests/onionshare_receive_mode_upload_public_mode_test.py1
-rw-r--r--tests/onionshare_receive_mode_upload_test.py1
-rw-r--r--tests/onionshare_share_mode_cancel_share_test.py2
-rw-r--r--tests/onionshare_share_mode_download_public_mode_test.py1
-rw-r--r--tests/onionshare_share_mode_download_stay_open_test.py1
-rw-r--r--tests/onionshare_share_mode_download_test.py1
-rw-r--r--tests/onionshare_share_mode_persistent_test.py1
-rw-r--r--tests/onionshare_share_mode_stealth_test.py1
-rw-r--r--tests/onionshare_share_mode_timer_test.py3
-rw-r--r--tests/onionshare_share_mode_tor_connection_killed_test.py1
-rw-r--r--tests/onionshare_share_mode_v2_onion_test.py1
-rw-r--r--tests/test_onionshare.py3
-rw-r--r--tests/test_onionshare_common.py2
-rw-r--r--tests/test_onionshare_settings.py3
-rw-r--r--tests/test_onionshare_web.py2
140 files changed, 4348 insertions, 1950 deletions
diff --git a/.gitignore b/.gitignore
index 12201adb..c7ad70de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,3 +48,6 @@ tags
# OSX
.DS_Store
+
+# virtualenv
+venv
diff --git a/BUILD.md b/BUILD.md
index 3d664ac8..c4a5c5e3 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -14,7 +14,7 @@ Install the needed dependencies:
For Debian-like distros:
```
-apt install -y python3-flask python3-stem python3-pyqt5 python3-crypto python3-socks python3-distutils python-nautilus tor obfs4proxy python3-pytest build-essential fakeroot python3-all python3-stdeb dh-python
+apt install -y python3-flask python3-stem python3-pyqt5 python3-crypto python3-socks python-nautilus tor obfs4proxy python3-pytest build-essential fakeroot python3-all python3-stdeb dh-python
```
For Fedora-like distros:
@@ -42,7 +42,7 @@ For ArchLinux: There is a PKBUILD available [here](https://aur.archlinux.org/pac
If you find that these instructions don't work for your Linux distribution or version, consult the [Linux Distribution Support wiki guide](https://github.com/micahflee/onionshare/wiki/Linux-Distribution-Support), which might contain extra instructions.
-## Mac OS X
+## macOS
Install Xcode from the Mac App Store. Once it's installed, run it for the first time to set it up. Also, run this to make sure command line tools are installed: `xcode-select --install`. And finally, open Xcode, go to Preferences > Locations, and make sure under Command Line Tools you select an installed version from the dropdown. (This is required for installing Qt5.)
@@ -50,9 +50,16 @@ Download and install Python 3.7.2 from https://www.python.org/downloads/release/
You may also need to run the command `/Applications/Python\ 3.7/Install\ Certificates.command` to update Python 3.6's internal certificate store. Otherwise, you may find that fetching the Tor Browser .dmg file fails later due to a certificate validation error.
-Install Qt 5.11.3 from https://www.qt.io/download-open-source/. I downloaded `qt-unified-mac-x64-3.0.6-online.dmg`. In the installer, you can skip making an account, and all you need is `Qt` > `Qt 5.11.3` > `macOS`.
+Install Qt 5.12.1 from https://download.qt.io/archive/qt/5.12/5.12.1/. I downloaded `qt-opensource-mac-x64-5.12.1.dmg`. In the installer, you can skip making an account, and all you need is `Qt` > `Qt 5.12.1` > `macOS`.
-Now install some python dependencies with pip (note, there's issues building a .app if you install this in a virtualenv):
+Now install pip dependencies. If you want to use a virtualenv, create it and activate it first:
+
+```sh
+python3 -m venv venv
+. venv/bin/activate
+```
+
+Then install the dependencies:
```sh
pip3 install -r install/requirements.txt
@@ -100,7 +107,7 @@ cd bootloader
python3 waf distclean all --target-arch=64bit
```
-Finally, install the PyInstaller module into your local site-packages:
+Finally, install the PyInstaller module into your local site-packages. If you're using a virtualenv, make sure to run this last command while your virtualenv is activated:
```sh
cd ..
@@ -135,7 +142,7 @@ Open a command prompt, cd to the onionshare folder, and install dependencies wit
pip install -r install\requirements.txt
```
-Install the Qt 5.11.3 from https://www.qt.io/download-open-source/. I downloaded `qt-unified-windows-x86-3.0.6-online.exe`. In the installer, you can skip making an account, and all you need `Qt` > `Qt 5.11.3` > `MSVC 2015 32-bit`.
+Install the Qt 5.12.1 from https://download.qt.io/archive/qt/5.12/5.12.1/. I downloaded `qt-opensource-windows-x86-5.12.1.exe`. In the installer, you can skip making an account, and all you need `Qt` > `Qt 5.12.1` > `MSVC 2017 32-bit`.
After that you can try both the CLI and the GUI version of OnionShare:
@@ -150,14 +157,14 @@ These instructions include adding folders to the path in Windows. To do this, go
Download and install the 32-bit [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-US/download/details.aspx?id=48145). I downloaded `vc_redist.x86.exe`.
-Download and install 7-Zip from http://www.7-zip.org/download.html. I downloaded `7z1805.exe`.
+Download and install 7-Zip from http://www.7-zip.org/download.html. I downloaded `7z1900.exe`.
Download and install the standalone [Windows 10 SDK](https://dev.windows.com/en-us/downloads/windows-10-sdk). Note that you may not need this if you already have Visual Studio.
Add the following directories to the path:
-* `C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86`
-* `C:\Program Files (x86)\Windows Kits\10\Redist\10.0.17763.0\ucrt\DLLs\x86`
+* `C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86`
+* `C:\Program Files (x86)\Windows Kits\10\Redist\10.0.18362.0\ucrt\DLLs\x86`
* `C:\Users\user\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\PyQt5\Qt\bin`
* `C:\Program Files (x86)\7-Zip`
@@ -169,7 +176,7 @@ OnionShare uses PyInstaller to turn the python source code into Windows executab
Here's how to compile the PyInstaller bootloader:
-Download and install [Microsoft Build Tools for Visual Studio 2017](https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2017). I downloaded `vs_buildtools.exe`. In the installer, check the box next to "Visual C++ build tools". Click "Individual components", and under "Compilers, build tools and runtimes", check "Windows Universal CRT SDK". Then click install. When installation is done, you may have to reboot your computer.
+Download and install [Microsoft Build Tools for Visual Studio 2019](https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019). I downloaded `vs_buildtools__265029578.1555959436.exe`. In the installer, check the box next to "Visual C++ build tools". Click "Individual components", and under "Compilers, build tools and runtimes", check "Windows Universal CRT SDK". Then click install. When installation is done, you may have to reboot your computer.
Then, enable the 32-bit Visual C++ Toolset on the Command Line like this:
@@ -181,7 +188,7 @@ vcvars32.bat
Make sure you have a new enough `setuptools`:
```
-pip install setuptools==40.6.3
+pip install --upgrade setuptools
```
Now make sure you don't have PyInstaller installed from pip:
@@ -254,7 +261,7 @@ Open a command prompt, cd to the onionshare directory, and type: `install\build_
This will prompt you to codesign three binaries and execute one unsigned binary. When you're done clicking through everything you will have `dist\onionshare-setup.exe`.
-## Tests
+# Running tests
OnionShare includes PyTest unit tests. To run the tests, first install some dependencies:
@@ -287,3 +294,114 @@ You can also choose to wrap the tests in `xvfb-run` so that a ton of OnionShare
```sh
xvfb-run pytest --rungui tests/
```
+
+# Making releases
+
+This section documents the release process. Unless you're a core OnionShare developer making a release, you'll probably never need to follow it.
+
+## Changelog, version, and signed git tag
+
+Before making a release, all of these should be complete:
+
+* `share/version.txt` should have the correct version
+* `install/onionshare.nsi` should have the correct version, for the Windows installer
+* `CHANGELOG.md` should be updated to include a list of all major changes since the last release
+* There must be a PGP-signed git tag for the version, e.g. for OnionShare 2.1, the tag must be `v2.1`
+
+The first step for the Linux, macOS, and Windows releases is the same:
+
+Verify the release git tag:
+
+```
+git fetch
+git tag -v v$VERSION
+```
+
+If the tag verifies successfully, check it out:
+
+```
+git checkout v$VERSION
+```
+
+## Linux release
+
+TODO: Write Flatpak instructions (see [this issue](https://github.com/micahflee/onionshare/issues/910)).
+
+To make a PPA release:
+
+- Go to Ubuntu build machine, which must have `~/.dput.cf` with the correct PPA info in it, and with the correct PGP signing key
+- Verify and checkout the git tag for this release
+- Run `./install/ppa_release.sh`, which builds a source package and uploads to the PPA build server
+- Login to Launchpad to monitor the build and make sure it is successful; if not, make minor patches and try the release again
+- After build is successful, from Launchpad, copy the binary from `cosmic` into other suites
+
+## macOS release
+
+To make a macOS release, go to macOS build machine:
+
+- Build machine should be running macOS 10.11.6, and must have the Apple-trusted `Developer ID Application: Micah Lee` and `Developer ID Installer: Micah Lee` code-signing certificates installed
+- Verify and checkout the git tag for this release
+- Run `./install/build_osx.sh --release`; this will make a codesigned installer package called `dist/OnionShare-$VERSION.pkg`
+- Copy `OnionShare-$VERSION.pkg` to developer machine
+
+Then move back to the developer machine:
+
+- PGP-sign the macOS installer, `gpg --detach-sign OnionShare-$VERSION.pkg`
+
+Note that once we support notarizing the macOS installer (see [this issue](https://github.com/micahflee/onionshare/issues/953)), these will be the steps instead:
+
+- Developer machine, running the latest macOS, must have an app-specific Apple ID password saved in the login keychain called `onionshare-notarize`
+- Notarize it: `xcrun altool --notarize-app --primary-bundle-id "com.micahflee.onionshare" -u "micah@micahflee.com" -p "@keychain:onionshare-notarize" --file OnionShare-$VERSION.pkg`
+- Wait for it to get approved, check status with: `xcrun altool --notarization-history 0 -u "micah@micahflee.com" -p "@keychain:onionshare-notarize"`
+- After it's approved, staple the ticket: `xcrun stapler staple OnionShare-$VERSION.pkg`
+- PGP-sign the final, notarized and stapled, `gpg -a --detach-sign OnionShare-$VERSION.pkg`
+
+This process ends up with two final files:
+
+```
+OnionShare-$VERSION.pkg
+OnionShare-$VERSION.pkg.asc
+```
+
+## Windows release
+
+To make a Windows release, go to Windows build machine:
+
+- Build machine should be running Windows 10, and have the Windows codesigning certificate installed
+- Verify and checkout the git tag for this release
+- Run `install\build_exe.bat`; this will make a codesigned installer package called `dist\onionshare-$VERSION-setup.exe`
+- Copy `onionshare-$VERSION-setup.exe` to developer machine
+
+Then move back to the developer machine:
+
+- PGP-sign the Windows installer, `gpg -a --detach-sign onionshare-$VERSION-setup.exe`
+
+This process ends up with two final files:
+
+```
+onionshare-$VERSION-setup.exe
+onionshare-$VERSION-setup.exe.asc
+```
+
+## Source package
+
+To make a source package, run `./install/build_source.sh $TAG`, where `$TAG` is the the name of the signed git tag, e.g. `v2.1`.
+
+This process ends up with two final files in `dist`:
+
+```
+onionshare-$VERSION.tar.gz
+onionshare-$VERSION.tar.gz.asc
+```
+
+## Publishing the release
+
+To publish the release:
+
+- Create a new release on GitHub, put the changelog in the description of the release, and upload all six files (the macOS installer, the Windows installer, the source package, and their signatures)
+- Upload the six release files to https://onionshare.org/dist/$VERSION/
+- Update the [onionshare-website](https://github.com/micahflee/onionshare-website) repo:
+ - Edit `latest-version.txt` to match the latest version
+ - Update the version number and download links
+ - Deploy to https://onionshare.org/
+- Email the [onionshare-dev](https://lists.riseup.net/www/subscribe/onionshare-dev) mailing list announcing the release
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 392df41f..7c309fb0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,29 @@
# OnionShare Changelog
+## 2.1
+
+* New feature: Auto-start timer, which allows scheduling when the server starts
+* Renamed CLI argument --debug to --verbose
+* Make Tor connection timeout configurable as a CLI argument
+* Updated various dependencies, including to fix third-party security issues in urllib3, jinja2, and jQuery
+* Update Tor to 0.3.5.8
+* New translations:
+ * Traditional Chinese (正體中文 (繁體)),
+ * Simplified Chinese (中文 (简体))
+ * Finnish (Suomi)
+ * German (Deutsch)
+ * Icelandic (Íslenska)
+ * Irish (Gaeilge)
+ * Norwegian Bokmål (Norsk Bokmål)
+ * Polish (Polski)
+ * Portuguese Portugal (Português (Portugal))
+ * Telugu (తెలుగు)
+ * Turkish (Türkçe)
+ * Ukrainian (Українська)
+* Removed translations because less than 90% of the strings were translated:
+ * Bengali (বাংলা)
+ * Persian (فارسی),
+
## 2.0
* New feature: Receiver mode allows you to receive files with OnionShare, instead of only sending files
diff --git a/README.md b/README.md
index 6b6ed836..fb134e93 100644
--- a/README.md
+++ b/README.md
@@ -8,11 +8,17 @@ Unlike services like email, Google Drive, DropBox, WeTransfer, or nearly any oth
To learn how OnionShare works, what its security properties are, and how to use it, check out the [wiki](https://github.com/micahflee/onionshare/wiki).
-## Downloading OnionShare
+## Installing OnionShare
You can download OnionShare for Windows and macOS from the [OnionShare website](https://onionshare.org).
-For Ubuntu-like Linux distributions, you could use this PPA to get the latest version:
+For macOS you can also use [Homebrew](https://brew.sh/):
+
+```
+brew cask install onionshare
+```
+
+For Ubuntu-like Linux distributions, you can use this PPA:
```
sudo add-apt-repository ppa:micahflee/ppa
diff --git a/install/build_osx.sh b/install/build_osx.sh
index 010e3edb..40e1fe90 100755
--- a/install/build_osx.sh
+++ b/install/build_osx.sh
@@ -27,11 +27,26 @@ if [ "$1" = "--release" ]; then
ENTITLEMENTS_PARENT_PATH="$ROOT/install/macos_sandbox/parent.plist"
echo "Codesigning the app bundle"
- codesign --deep -s "$IDENTITY_NAME_APPLICATION" -f --entitlements "$ENTITLEMENTS_CHILD_PATH" "$APP_PATH"
- codesign -s "$IDENTITY_NAME_APPLICATION" -f --entitlements "$ENTITLEMENTS_PARENT_PATH" "$APP_PATH"
+ codesign \
+ --deep \
+ -s "$IDENTITY_NAME_APPLICATION" \
+ --force \
+ --entitlements "$ENTITLEMENTS_CHILD_PATH" \
+ --timestamp \
+ "$APP_PATH"
+ codesign \
+ -s "$IDENTITY_NAME_APPLICATION" \
+ --force \
+ --entitlements "$ENTITLEMENTS_PARENT_PATH" \
+ --timestamp \
+ "$APP_PATH"
echo "Creating an installer"
- productbuild --sign "$IDENTITY_NAME_INSTALLER" --component "$APP_PATH" /Applications "$PKG_PATH"
+ productbuild \
+ --sign "$IDENTITY_NAME_INSTALLER" \
+ --component "$APP_PATH" /Applications \
+ --timestamp \
+ "$PKG_PATH"
echo "Cleaning up"
rm -rf "$APP_PATH"
diff --git a/install/build_rpm.sh b/install/build_rpm.sh
index 7a34b271..0872a447 100755
--- a/install/build_rpm.sh
+++ b/install/build_rpm.sh
@@ -9,7 +9,7 @@ VERSION=`cat share/version.txt`
rm -r build dist >/dev/null 2>&1
# build binary package
-python3 setup.py bdist_rpm --requires="python3-flask, python3-stem, python3-qt5, python3-cryptography, python3-crypto, python3-pysocks, nautilus-python, tor, obfs4"
+python3 setup.py bdist_rpm --requires="python3-flask, python3-stem, python3-qt5, python3-crypto, python3-pysocks, nautilus-python, tor, obfs4"
# install it
echo ""
diff --git a/install/build_source.sh b/install/build_source.sh
new file mode 100755
index 00000000..d7f48722
--- /dev/null
+++ b/install/build_source.sh
@@ -0,0 +1,81 @@
+#!/bin/bash
+
+# The script builds a source package
+# See https://github.com/micahflee/onionshare/blob/develop/BUILD.md#source-package
+
+# Usage
+display_usage() {
+ echo "Usage: $0 [tag]"
+}
+
+if [ $# -lt 1 ]
+then
+ display_usage
+ exit 1
+fi
+
+# Input validation
+TAG=$1
+
+if [ "${TAG:0:1}" != "v" ]
+then
+ echo "Tag must start with 'v' character"
+ exit 1
+fi
+
+VERSION=${TAG:1}
+
+# Make sure tag exists
+git tag | grep "^$TAG\$"
+if [ $? -ne 0 ]
+then
+ echo "Tag does not exist"
+ exit 1
+fi
+
+# Clone source
+mkdir -p build/source
+mkdir -p dist
+cd build/source
+git clone https://github.com/micahflee/onionshare.git
+cd onionshare
+
+# Verify tag
+git tag -v $TAG 2> ../verify.txt
+if [ $? -ne 0 ]
+then
+ echo "Tag does not verify"
+ exit 1
+fi
+cat ../verify.txt |grep "using RSA key 927F419D7EC82C2F149C1BD1403C2657CD994F73"
+if [ $? -ne 0 ]
+then
+ echo "Tag signed with wrong key"
+ exit 1
+fi
+cat ../verify.txt |grep "^gpg: Good signature from"
+if [ $? -ne 0 ]
+then
+ echo "Tag verification missing 'Good signature from'"
+ exit 1
+fi
+
+# Checkout code
+git checkout $TAG
+
+# Delete .git, compress, and PGP sign
+cd ..
+rm -rf onionshare/.git
+tar -cf onionshare-$VERSION.tar.gz onionshare/
+gpg -a --detach-sign onionshare-$VERSION.tar.gz
+
+# Move source package to dist
+cd ../..
+mv build/source/onionshare-$VERSION.tar.gz dist
+mv build/source/onionshare-$VERSION.tar.gz.asc dist
+
+# Clean up
+rm -rf build/source/onionshare
+rm build/source/verify.txt
+
+echo "Source package complete, files are in dist"
diff --git a/install/check_lacked_trans.py b/install/check_lacked_trans.py
index 1caa6b27..010cdb7a 100644..100755
--- a/install/check_lacked_trans.py
+++ b/install/check_lacked_trans.py
@@ -56,8 +56,9 @@ def main():
src = files_in(dir, 'onionshare') + \
files_in(dir, 'onionshare_gui') + \
- files_in(dir, 'onionshare_gui/share_mode') + \
- files_in(dir, 'onionshare_gui/receive_mode') + \
+ files_in(dir, 'onionshare_gui/mode') + \
+ files_in(dir, 'onionshare_gui/mode/share_mode') + \
+ files_in(dir, 'onionshare_gui/mode/receive_mode') + \
files_in(dir, 'install/scripts') + \
files_in(dir, 'tests')
pysrc = [p for p in src if p.endswith('.py')]
diff --git a/install/get-tor-osx.py b/install/get-tor-osx.py
index d966173c..861dc935 100644
--- a/install/get-tor-osx.py
+++ b/install/get-tor-osx.py
@@ -35,9 +35,9 @@ import subprocess
import requests
def main():
- dmg_url = 'https://archive.torproject.org/tor-package-archive/torbrowser/8.0.5/TorBrowser-8.0.5-osx64_en-US.dmg'
- dmg_filename = 'TorBrowser-8.0.5-osx64_en-US.dmg'
- expected_dmg_sha256 = '08f0f79181319b74f8ad3a3f8c72a46356ec47f1ca3e22eb42d92e51451d9411'
+ dmg_url = 'https://archive.torproject.org/tor-package-archive/torbrowser/8.0.8/TorBrowser-8.0.8-osx64_en-US.dmg'
+ dmg_filename = 'TorBrowser-8.0.8-osx64_en-US.dmg'
+ expected_dmg_sha256 = '1dc01b95146352593c3f18ece25f8735120565f921e22c2827df819effdddca3'
# Build paths
root_path = os.path.dirname(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))))
diff --git a/install/get-tor-windows.py b/install/get-tor-windows.py
index aad45e94..0f4ad8c3 100644
--- a/install/get-tor-windows.py
+++ b/install/get-tor-windows.py
@@ -33,9 +33,9 @@ import subprocess
import requests
def main():
- exe_url = 'https://archive.torproject.org/tor-package-archive/torbrowser/8.0.5/torbrowser-install-8.0.5_en-US.exe'
- exe_filename = 'torbrowser-install-8.0.5_en-US.exe'
- expected_exe_sha256 = '860fdd06e4ea8dd4c46f221676251f5cc528676d4e256559ee3831a5f97492f1'
+ exe_url = 'https://archive.torproject.org/tor-package-archive/torbrowser/8.0.8/torbrowser-install-8.0.8_en-US.exe'
+ exe_filename = 'torbrowser-install-8.0.8_en-US.exe'
+ expected_exe_sha256 = 'bfe32a737e9fa37bf0c8837dbf3385be41cd9e8f9a88850d8f2946bb736e784f'
# Build paths
root_path = os.path.dirname(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))))
working_path = os.path.join(os.path.join(root_path, 'build'), 'tor')
diff --git a/install/onionshare.desktop b/install/onionshare.desktop
index a0861cf8..697668db 100644
--- a/install/onionshare.desktop
+++ b/install/onionshare.desktop
@@ -7,7 +7,7 @@ Comment[de]=Teile Dateien sicher und anonym über das Tor-Netzwerk
Exec=/usr/bin/onionshare-gui
Terminal=false
Type=Application
-Icon=/usr/share/pixmaps/onionshare80.xpm
+Icon=onionshare80
Categories=Network;FileTransfer;
Keywords=tor;anonymity;privacy;onion service;file sharing;file hosting;
Keywords[da]=tor;anonymitet;privatliv;onion-tjeneste;fildeling;filhosting;
diff --git a/install/onionshare.nsi b/install/onionshare.nsi
index 3a4c6c2a..68213528 100644
--- a/install/onionshare.nsi
+++ b/install/onionshare.nsi
@@ -5,8 +5,8 @@
# change these with each release
!define INSTALLSIZE 115186
!define VERSIONMAJOR 2
-!define VERSIONMINOR 0
-!define VERSIONSTRING "2.0"
+!define VERSIONMINOR 1
+!define VERSIONSTRING "2.1"
RequestExecutionLevel admin
diff --git a/install/requirements-tests.txt b/install/requirements-tests.txt
index 89f37572..599b9808 100644
--- a/install/requirements-tests.txt
+++ b/install/requirements-tests.txt
@@ -1,10 +1,10 @@
-atomicwrites==1.2.1
-attrs==18.2.0
-more-itertools==4.3.0
-pluggy==0.8.0
-py==1.7.0
-pytest==4.0.1
+atomicwrites==1.3.0
+attrs==19.1.0
+more-itertools==5.0.0
+pluggy==0.9.0
+py==1.8.0
+pytest==4.4.1
pytest-faulthandler==1.5.0
-pytest-qt==3.2.1
-six==1.11.0
-urllib3==1.24.1
+pytest-qt==3.2.2
+six==1.12.0
+urllib3==1.24.2
diff --git a/install/requirements.txt b/install/requirements.txt
index 76dfb1ef..0abd773f 100644
--- a/install/requirements.txt
+++ b/install/requirements.txt
@@ -1,25 +1,20 @@
altgraph==0.16.1
-asn1crypto==0.24.0
-certifi==2018.10.15
-cffi==1.11.5
+certifi==2019.3.9
chardet==3.0.4
Click==7.0
-cryptography==2.4.2
Flask==1.0.2
future==0.17.1
-idna==2.7
+idna==2.8
itsdangerous==1.1.0
-Jinja2==2.10
+Jinja2==2.10.1
macholib==1.11
-MarkupSafe==1.1.0
-pefile==2018.8.8
-pycparser==2.19
-pycryptodome==3.7.2
-PyQt5==5.11.3
-PyQt5-sip==4.19.13
+MarkupSafe==1.1.1
+pefile==2019.4.18
+pycryptodome==3.8.1
+PyQt5==5.12.1
+PyQt5-sip==4.19.15
PySocks==1.6.8
-requests==2.20.1
-six==1.11.0
-stem==1.7.0
-urllib3==1.24.1
-Werkzeug==0.14.1
+requests==2.21.0
+stem==1.7.1
+urllib3==1.24.2
+Werkzeug==0.15.2
diff --git a/onionshare/__init__.py b/onionshare/__init__.py
index 2f44c846..620ada98 100644
--- a/onionshare/__init__.py
+++ b/onionshare/__init__.py
@@ -19,8 +19,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
import os, sys, time, argparse, threading
+from datetime import datetime
+from datetime import timedelta
-from . import strings
from .common import Common
from .web import Web
from .onion import *
@@ -33,16 +34,8 @@ def main(cwd=None):
"""
common = Common()
- # Load the default settings and strings early, for the sake of being able to parse options.
- # These won't be in the user's chosen locale necessarily, but we need to parse them
- # early in order to even display the option to pass alternate settings (which might
- # contain a preferred locale).
- # If an alternate --config is passed, we'll reload strings later.
- common.load_settings()
- strings.load_strings(common)
-
# Display OnionShare banner
- print(strings._('version_string').format(common.version))
+ print("OnionShare {0:s} | https://onionshare.org/".format(common.version))
# OnionShare CLI in OSX needs to change current working directory (#132)
if common.platform == 'Darwin':
@@ -51,14 +44,16 @@ def main(cwd=None):
# Parse arguments
parser = argparse.ArgumentParser(formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=28))
- parser.add_argument('--local-only', action='store_true', dest='local_only', help=strings._("help_local_only"))
- parser.add_argument('--stay-open', action='store_true', dest='stay_open', help=strings._("help_stay_open"))
- parser.add_argument('--shutdown-timeout', metavar='<int>', dest='shutdown_timeout', default=0, help=strings._("help_shutdown_timeout"))
- parser.add_argument('--stealth', action='store_true', dest='stealth', help=strings._("help_stealth"))
- parser.add_argument('--receive', action='store_true', dest='receive', help=strings._("help_receive"))
- parser.add_argument('--config', metavar='config', default=False, help=strings._('help_config'))
- parser.add_argument('--debug', action='store_true', dest='debug', help=strings._("help_debug"))
- parser.add_argument('filename', metavar='filename', nargs='*', help=strings._('help_filename'))
+ parser.add_argument('--local-only', action='store_true', dest='local_only', help="Don't use Tor (only for development)")
+ parser.add_argument('--stay-open', action='store_true', dest='stay_open', help="Continue sharing after files have been sent")
+ parser.add_argument('--auto-start-timer', metavar='<int>', dest='autostart_timer', default=0, help="Schedule this share to start N seconds from now")
+ parser.add_argument('--auto-stop-timer', metavar='<int>', dest='autostop_timer', default=0, help="Stop sharing after a given amount of seconds")
+ parser.add_argument('--connect-timeout', metavar='<int>', dest='connect_timeout', default=120, help="Give up connecting to Tor after a given amount of seconds (default: 120)")
+ parser.add_argument('--stealth', action='store_true', dest='stealth', help="Use client authorization (advanced)")
+ parser.add_argument('--receive', action='store_true', dest='receive', help="Receive shares instead of sending them")
+ parser.add_argument('--config', metavar='config', default=False, help="Custom JSON config file location (optional)")
+ parser.add_argument('-v', '--verbose', action='store_true', dest='verbose', help="Log OnionShare errors to stdout, and web errors to disk")
+ parser.add_argument('filename', metavar='filename', nargs='*', help="List of files or folders to share")
args = parser.parse_args()
filenames = args.filename
@@ -66,9 +61,11 @@ def main(cwd=None):
filenames[i] = os.path.abspath(filenames[i])
local_only = bool(args.local_only)
- debug = bool(args.debug)
+ verbose = bool(args.verbose)
stay_open = bool(args.stay_open)
- shutdown_timeout = int(args.shutdown_timeout)
+ autostart_timer = int(args.autostart_timer)
+ autostop_timer = int(args.autostop_timer)
+ connect_timeout = int(args.connect_timeout)
stealth = bool(args.stealth)
receive = bool(args.receive)
config = args.config
@@ -88,10 +85,10 @@ def main(cwd=None):
valid = True
for filename in filenames:
if not os.path.isfile(filename) and not os.path.isdir(filename):
- print(strings._("not_a_file").format(filename))
+ print("{0:s} is not a valid file.".format(filename))
valid = False
if not os.access(filename, os.R_OK):
- print(strings._("not_a_readable_file").format(filename))
+ print("{0:s} is not a readable file.".format(filename))
valid = False
if not valid:
sys.exit()
@@ -99,11 +96,9 @@ def main(cwd=None):
# Re-load settings, if a custom config was passed in
if config:
common.load_settings(config)
- # Re-load the strings, in case the provided config has changed locale
- strings.load_strings(common)
- # Debug mode?
- common.debug = debug
+ # Verbose mode?
+ common.verbose = verbose
# Create the Web object
web = Web(common, False, mode)
@@ -111,7 +106,7 @@ def main(cwd=None):
# Start the Onion object
onion = Onion(common)
try:
- onion.connect(custom_settings=False, config=config)
+ onion.connect(custom_settings=False, config=config, connect_timeout=connect_timeout)
except KeyboardInterrupt:
print("")
sys.exit()
@@ -120,10 +115,51 @@ def main(cwd=None):
# Start the onionshare app
try:
- app = OnionShare(common, onion, local_only, shutdown_timeout)
+ common.settings.load()
+ if not common.settings.get('public_mode'):
+ web.generate_slug(common.settings.get('slug'))
+ else:
+ web.slug = None
+ app = OnionShare(common, onion, local_only, autostop_timer)
app.set_stealth(stealth)
app.choose_port()
- app.start_onion_service()
+ # Delay the startup if a startup timer was set
+ if autostart_timer > 0:
+ # Can't set a schedule that is later than the auto-stop timer
+ if app.autostop_timer > 0 and app.autostop_timer < autostart_timer:
+ print("The auto-stop time can't be the same or earlier than the auto-start time. Please update it to start sharing.")
+ sys.exit()
+
+ app.start_onion_service(False, True)
+ if common.settings.get('public_mode'):
+ url = 'http://{0:s}'.format(app.onion_host)
+ else:
+ url = 'http://{0:s}/{1:s}'.format(app.onion_host, web.slug)
+ schedule = datetime.now() + timedelta(seconds=autostart_timer)
+ if mode == 'receive':
+ print("Files sent to you appear in this folder: {}".format(common.settings.get('data_dir')))
+ print('')
+ print("Warning: Receive mode lets people upload files to your computer. 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.")
+ print('')
+ if stealth:
+ print("Give this address and HidServAuth lineto your sender, and tell them it won't be accessible until: {}".format(schedule.strftime("%I:%M:%S%p, %b %d, %y")))
+ print(app.auth_string)
+ else:
+ print("Give this address to your sender, and tell them it won't be accessible until: {}".format(schedule.strftime("%I:%M:%S%p, %b %d, %y")))
+ else:
+ if stealth:
+ print("Give this address and HidServAuth line to your recipient, and tell them it won't be accessible until: {}".format(schedule.strftime("%I:%M:%S%p, %b %d, %y")))
+ print(app.auth_string)
+ else:
+ print("Give this address to your recipient, and tell them it won't be accessible until: {}".format(schedule.strftime("%I:%M:%S%p, %b %d, %y")))
+ print(url)
+ print('')
+ print("Waiting for the scheduled time before starting...")
+ app.onion.cleanup(False)
+ time.sleep(autostart_timer)
+ app.start_onion_service()
+ else:
+ app.start_onion_service()
except KeyboardInterrupt:
print("")
sys.exit()
@@ -134,7 +170,7 @@ def main(cwd=None):
if mode == 'share':
# Prepare files to share
- print(strings._("preparing_files"))
+ print("Compressing files.")
try:
web.share_mode.set_file_info(filenames)
app.cleanup_filenames += web.share_mode.cleanup_filenames
@@ -145,11 +181,11 @@ def main(cwd=None):
# Warn about sending large files over Tor
if web.share_mode.download_filesize >= 157286400: # 150mb
print('')
- print(strings._("large_filesize"))
+ print("Warning: Sending a large share could take hours")
print('')
# Start OnionShare http service in new thread
- t = threading.Thread(target=web.start, args=(app.port, stay_open, common.settings.get('public_mode'), common.settings.get('slug')))
+ t = threading.Thread(target=web.start, args=(app.port, stay_open, common.settings.get('public_mode'), web.slug))
t.daemon = True
t.start()
@@ -157,9 +193,9 @@ def main(cwd=None):
# Wait for web.generate_slug() to finish running
time.sleep(0.2)
- # start shutdown timer thread
- if app.shutdown_timeout > 0:
- app.shutdown_timer.start()
+ # start auto-stop timer thread
+ if app.autostop_timer > 0:
+ app.autostop_timer_thread.start()
# Save the web slug if we are using a persistent private key
if common.settings.get('save_private_key'):
@@ -174,44 +210,47 @@ def main(cwd=None):
url = 'http://{0:s}/{1:s}'.format(app.onion_host, web.slug)
print('')
- if mode == 'receive':
- print(strings._('receive_mode_data_dir').format(common.settings.get('data_dir')))
- print('')
- print(strings._('receive_mode_warning'))
- print('')
-
- if stealth:
- print(strings._("give_this_url_receive_stealth"))
- print(url)
- print(app.auth_string)
- else:
- print(strings._("give_this_url_receive"))
- print(url)
+ if autostart_timer > 0:
+ print("Server started")
else:
- if stealth:
- print(strings._("give_this_url_stealth"))
- print(url)
- print(app.auth_string)
+ if mode == 'receive':
+ print("Files sent to you appear in this folder: {}".format(common.settings.get('data_dir')))
+ print('')
+ print("Warning: Receive mode lets people upload files to your computer. 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.")
+ print('')
+
+ if stealth:
+ print("Give this address and HidServAuth to the sender:")
+ print(url)
+ print(app.auth_string)
+ else:
+ print("Give this address to the sender:")
+ print(url)
else:
- print(strings._("give_this_url"))
- print(url)
+ if stealth:
+ print("Give this address and HidServAuth line to the recipient:")
+ print(url)
+ print(app.auth_string)
+ else:
+ print("Give this address to the recipient:")
+ print(url)
print('')
- print(strings._("ctrlc_to_stop"))
+ print("Press Ctrl+C to stop the server")
# Wait for app to close
while t.is_alive():
- if app.shutdown_timeout > 0:
- # if the shutdown timer was set and has run out, stop the server
- if not app.shutdown_timer.is_alive():
+ if app.autostop_timer > 0:
+ # if the auto-stop timer was set and has run out, stop the server
+ if not app.autostop_timer_thread.is_alive():
if mode == 'share':
# If there were no attempts to download the share, or all downloads are done, we can stop
if web.share_mode.download_count == 0 or web.done:
- print(strings._("close_on_timeout"))
+ print("Stopped because auto-stop timer ran out")
web.stop(app.port)
break
if mode == 'receive':
if web.receive_mode.upload_count == 0 or not web.receive_mode.uploads_in_progress:
- print(strings._("close_on_timeout"))
+ print("Stopped because auto-stop timer ran out")
web.stop(app.port)
break
else:
diff --git a/onionshare/common.py b/onionshare/common.py
index fcb9ca6d..325f11d4 100644
--- a/onionshare/common.py
+++ b/onionshare/common.py
@@ -36,8 +36,8 @@ class Common(object):
"""
The Common object is shared amongst all parts of OnionShare.
"""
- def __init__(self, debug=False):
- self.debug = debug
+ def __init__(self, verbose=False):
+ self.verbose = verbose
# The platform OnionShare is running on
self.platform = platform.system()
@@ -57,9 +57,9 @@ class Common(object):
def log(self, module, func, msg=None):
"""
- If debug mode is on, log error messages to stdout
+ If verbose mode is on, log error messages to stdout
"""
- if self.debug:
+ if self.verbose:
timestamp = time.strftime("%b %d %Y %X")
final_msg = "[{}] {}.{}".format(timestamp, module, func)
@@ -485,7 +485,7 @@ class Common(object):
return total_size
-class ShutdownTimer(threading.Thread):
+class AutoStopTimer(threading.Thread):
"""
Background thread sleeps t hours and returns.
"""
@@ -498,6 +498,6 @@ class ShutdownTimer(threading.Thread):
self.time = time
def run(self):
- self.common.log('Shutdown Timer', 'Server will shut down after {} seconds'.format(self.time))
+ self.common.log('AutoStopTimer', 'Server will shut down after {} seconds'.format(self.time))
time.sleep(self.time)
return 1
diff --git a/onionshare/onion.py b/onionshare/onion.py
index ed4fde7b..2f4ddffd 100644
--- a/onionshare/onion.py
+++ b/onionshare/onion.py
@@ -133,6 +133,8 @@ class Onion(object):
self.stealth = False
self.service_id = None
+ self.scheduled_key = None
+ self.scheduled_auth_cookie = None
# Is bundled tor supported?
if (self.common.platform == 'Windows' or self.common.platform == 'Darwin') and getattr(sys, 'onionshare_dev_mode', False):
@@ -152,15 +154,20 @@ class Onion(object):
# Start out not connected to Tor
self.connected_to_tor = False
- def connect(self, custom_settings=False, config=False, tor_status_update_func=None):
+ def connect(self, custom_settings=False, config=False, tor_status_update_func=None, connect_timeout=120):
self.common.log('Onion', 'connect')
# Either use settings that are passed in, or use them from common
if custom_settings:
self.settings = custom_settings
+ elif config:
+ self.common.load_settings(config)
+ self.settings = self.common.settings
else:
+ self.common.load_settings()
self.settings = self.common.settings
+ strings.load_strings(self.common)
# The Tor controller
self.c = None
@@ -265,7 +272,7 @@ class Onion(object):
summary = res_parts[4].split('=')[1]
# "\033[K" clears the rest of the line
- print("{}: {}% - {}{}".format(strings._('connecting_to_tor'), progress, summary, "\033[K"), end="\r")
+ print("Connecting to the Tor network: {}% - {}{}".format(progress, summary, "\033[K"), end="\r")
if callable(tor_status_update_func):
if not tor_status_update_func(progress, summary):
@@ -283,14 +290,16 @@ class Onion(object):
if self.settings.get('tor_bridges_use_custom_bridges') or \
self.settings.get('tor_bridges_use_obfs4') or \
self.settings.get('tor_bridges_use_meek_lite_azure'):
- connect_timeout = 150
- else:
- # Timeout after 120 seconds
- connect_timeout = 120
+ # Only override timeout if a custom timeout has not been passed in
+ if connect_timeout == 120:
+ connect_timeout = 150
if time.time() - start_ts > connect_timeout:
print("")
- self.tor_proc.terminate()
- raise BundledTorTimeout(strings._('settings_error_bundled_tor_timeout'))
+ try:
+ self.tor_proc.terminate()
+ raise BundledTorTimeout(strings._('settings_error_bundled_tor_timeout'))
+ except FileNotFoundError:
+ pass
elif self.settings.get('connection_type') == 'automatic':
# Automatically try to guess the right way to connect to Tor Browser
@@ -423,27 +432,31 @@ class Onion(object):
return False
- def start_onion_service(self, port):
+ def start_onion_service(self, port, await_publication, save_scheduled_key=False):
"""
Start a onion service on port 80, pointing to the given port, and
return the onion hostname.
"""
self.common.log('Onion', 'start_onion_service')
-
self.auth_string = None
+
if not self.supports_ephemeral:
raise TorTooOld(strings._('error_ephemeral_not_supported'))
if self.stealth and not self.supports_stealth:
raise TorTooOld(strings._('error_stealth_not_supported'))
- print(strings._("config_onion_service").format(int(port)))
+ if not save_scheduled_key:
+ print("Setting up onion service on port {0:d}.".format(int(port)))
if self.stealth:
if self.settings.get('hidservauth_string'):
hidservauth_string = self.settings.get('hidservauth_string').split()[2]
basic_auth = {'onionshare':hidservauth_string}
else:
- basic_auth = {'onionshare':None}
+ if self.scheduled_auth_cookie:
+ basic_auth = {'onionshare':self.scheduled_auth_cookie}
+ else:
+ basic_auth = {'onionshare':None}
else:
basic_auth = None
@@ -455,6 +468,14 @@ class Onion(object):
# Assume it was a v3 key. Stem will throw an error if it's something illegible
key_type = "ED25519-V3"
+ elif self.scheduled_key:
+ key_content = self.scheduled_key
+ if self.is_v2_key(key_content):
+ key_type = "RSA1024"
+ else:
+ # Assume it was a v3 key. Stem will throw an error if it's something illegible
+ key_type = "ED25519-V3"
+
else:
key_type = "NEW"
# Work out if we can support v3 onion services, which are preferred
@@ -474,7 +495,6 @@ class Onion(object):
if key_type == "NEW":
debug_message += ', key_content={}'.format(key_content)
self.common.log('Onion', 'start_onion_service', '{}'.format(debug_message))
- await_publication = True
try:
if basic_auth != None:
res = self.c.create_ephemeral_hidden_service({ 80: port }, await_publication=await_publication, basic_auth=basic_auth, key_type=key_type, key_content=key_content)
@@ -493,6 +513,12 @@ class Onion(object):
if not self.settings.get('private_key'):
self.settings.set('private_key', res.private_key)
+ # If we were scheduling a future share, register the private key for later re-use
+ if save_scheduled_key:
+ self.scheduled_key = res.private_key
+ else:
+ self.scheduled_key = None
+
if self.stealth:
# Similar to the PrivateKey, the Control port only returns the ClientAuth
# in the response if it was responsible for creating the basic_auth password
@@ -507,8 +533,19 @@ class Onion(object):
self.auth_string = 'HidServAuth {} {}'.format(onion_host, auth_cookie)
self.settings.set('hidservauth_string', self.auth_string)
else:
- auth_cookie = list(res.client_auth.values())[0]
- self.auth_string = 'HidServAuth {} {}'.format(onion_host, auth_cookie)
+ if not self.scheduled_auth_cookie:
+ auth_cookie = list(res.client_auth.values())[0]
+ self.auth_string = 'HidServAuth {} {}'.format(onion_host, auth_cookie)
+ if save_scheduled_key:
+ # Register the HidServAuth for the scheduled share
+ self.scheduled_auth_cookie = auth_cookie
+ else:
+ self.scheduled_auth_cookie = None
+ else:
+ self.auth_string = 'HidServAuth {} {}'.format(onion_host, self.scheduled_auth_cookie)
+ if not save_scheduled_key:
+ # We've used the scheduled share's HidServAuth. Reset it to None for future shares
+ self.scheduled_auth_cookie = None
if onion_host is not None:
self.settings.save()
diff --git a/onionshare/onionshare.py b/onionshare/onionshare.py
index 551b8314..e746bae1 100644
--- a/onionshare/onionshare.py
+++ b/onionshare/onionshare.py
@@ -22,14 +22,14 @@ import os, shutil
from . import common, strings
from .onion import TorTooOld, TorErrorProtocolError
-from .common import ShutdownTimer
+from .common import AutoStopTimer
class OnionShare(object):
"""
OnionShare is the main application class. Pass in options and run
start_onion_service and it will do the magic.
"""
- def __init__(self, common, onion, local_only=False, shutdown_timeout=0):
+ def __init__(self, common, onion, local_only=False, autostop_timer=0):
self.common = common
self.common.log('OnionShare', '__init__')
@@ -49,9 +49,9 @@ class OnionShare(object):
self.local_only = local_only
# optionally shut down after N hours
- self.shutdown_timeout = shutdown_timeout
- # init timing thread
- self.shutdown_timer = None
+ self.autostop_timer = autostop_timer
+ # init auto-stop timer thread
+ self.autostop_timer_thread = None
def set_stealth(self, stealth):
self.common.log('OnionShare', 'set_stealth', 'stealth={}'.format(stealth))
@@ -68,7 +68,7 @@ class OnionShare(object):
except:
raise OSError(strings._('no_available_port'))
- def start_onion_service(self):
+ def start_onion_service(self, await_publication=True, save_scheduled_key=False):
"""
Start the onionshare onion service.
"""
@@ -77,14 +77,14 @@ class OnionShare(object):
if not self.port:
self.choose_port()
- if self.shutdown_timeout > 0:
- self.shutdown_timer = ShutdownTimer(self.common, self.shutdown_timeout)
+ if self.autostop_timer > 0:
+ self.autostop_timer_thread = AutoStopTimer(self.common, self.autostop_timer)
if self.local_only:
self.onion_host = '127.0.0.1:{0:d}'.format(self.port)
return
- self.onion_host = self.onion.start_onion_service(self.port)
+ self.onion_host = self.onion.start_onion_service(self.port, await_publication, save_scheduled_key)
if self.stealth:
self.auth_string = self.onion.auth_string
diff --git a/onionshare/settings.py b/onionshare/settings.py
index 68cbb857..16b64a05 100644
--- a/onionshare/settings.py
+++ b/onionshare/settings.py
@@ -44,32 +44,46 @@ class Settings(object):
self.common.log('Settings', '__init__')
- # Default config
- self.filename = self.build_filename()
-
# If a readable config file was provided, use that instead
if config:
if os.path.isfile(config):
self.filename = config
else:
self.common.log('Settings', '__init__', 'Supplied config does not exist or is unreadable. Falling back to default location')
+ self.filename = self.build_filename()
+
+ else:
+ # Default config
+ self.filename = self.build_filename()
# Dictionary of available languages in this version of OnionShare,
# mapped to the language name, in that language
self.available_locales = {
- 'bn': 'বাংলা', # Bengali
- 'ca': 'Català', # Catalan
- 'da': 'Dansk', # Danish
- 'en': 'English', # English
- 'fr': 'Français', # French
- 'el': 'Ελληνικά', # Greek
- 'it': 'Italiano', # Italian
- 'ja': '日本語', # Japanese
- 'fa': 'فارسی', # Persian
- 'pt_BR': 'Português (Brasil)', # Portuguese Brazil
- 'ru': 'Русский', # Russian
- 'es': 'Español', # Spanish
- 'sv': 'Svenska' # Swedish
+ #'bn': 'বাংলা', # Bengali (commented out because not at 90% translation)
+ 'ca': 'Català', # Catalan
+ 'zh_Hant': '正體中文 (繁體)', # Traditional Chinese
+ 'zh_Hans': '中文 (简体)', # Simplified Chinese
+ 'da': 'Dansk', # Danish
+ 'en': 'English', # English
+ 'fi': 'Suomi', # Finnish
+ 'fr': 'Français', # French
+ 'de': 'Deutsch', # German
+ 'el': 'Ελληνικά', # Greek
+ 'is': 'Íslenska', # Icelandic
+ 'ga': 'Gaeilge', # Irish
+ 'it': 'Italiano', # Italian
+ 'ja': '日本語', # Japanese
+ 'nb': 'Norsk Bokmål', # Norwegian Bokmål
+ #'fa': 'فارسی', # Persian (commented out because not at 90% translation)
+ 'pl': 'Polski', # Polish
+ 'pt_BR': 'Português (Brasil)', # Portuguese Brazil
+ 'pt_PT': 'Português (Portugal)', # Portuguese Portugal
+ 'ru': 'Русский', # Russian
+ 'es': 'Español', # Spanish
+ 'sv': 'Svenska', # Swedish
+ 'te': 'తెలుగు', # Telugu
+ 'tr': 'Türkçe', # Turkish
+ 'uk': 'Українська', # Ukrainian
}
# These are the default settings. They will get overwritten when loading from disk
@@ -84,7 +98,8 @@ class Settings(object):
'auth_type': 'no_auth',
'auth_password': '',
'close_after_first_download': True,
- 'shutdown_timeout': False,
+ 'autostop_timer': False,
+ 'autostart_timer': False,
'use_stealth': False,
'use_autoupdate': True,
'autoupdate_timestamp': None,
diff --git a/onionshare/web/receive_mode.py b/onionshare/web/receive_mode.py
index d6ef86ad..bc805445 100644
--- a/onionshare/web/receive_mode.py
+++ b/onionshare/web/receive_mode.py
@@ -79,7 +79,7 @@ class ReceiveModeWeb(object):
})
self.common.log('ReceiveModeWeb', 'define_routes', '/upload, uploaded {}, saving to {}'.format(f.filename, local_path))
- print('\n' + strings._('receive_mode_received_file').format(local_path))
+ print('\n' + "Received: {}".format(local_path))
if request.upload_error:
self.common.log('ReceiveModeWeb', 'define_routes', '/upload, there was an upload error')
@@ -87,7 +87,7 @@ class ReceiveModeWeb(object):
self.web.add_request(self.web.REQUEST_ERROR_DATA_DIR_CANNOT_CREATE, request.path, {
"receive_mode_dir": request.receive_mode_dir
})
- print(strings._('error_cannot_create_data_dir').format(request.receive_mode_dir))
+ print("Could not create OnionShare data folder: {}".format(request.receive_mode_dir))
msg = 'Error uploading, please inform the OnionShare user'
if ajax:
@@ -112,12 +112,14 @@ class ReceiveModeWeb(object):
else:
flash(msg, 'info')
else:
+ msg = 'Sent '
for filename in filenames:
- msg = 'Sent {}'.format(filename)
- if ajax:
- info_flashes.append(msg)
- else:
- flash(msg, 'info')
+ msg += '{}, '.format(filename)
+ msg = msg.rstrip(', ')
+ if ajax:
+ info_flashes.append(msg)
+ else:
+ flash(msg, 'info')
if self.can_upload:
if ajax:
@@ -297,6 +299,7 @@ class ReceiveModeRequest(Request):
new_receive_mode_dir = '{}-{}'.format(self.receive_mode_dir, i)
try:
os.makedirs(new_receive_mode_dir, 0o700, exist_ok=False)
+ self.receive_mode_dir = new_receive_mode_dir
break
except OSError:
pass
@@ -310,7 +313,7 @@ class ReceiveModeRequest(Request):
self.web.add_request(self.web.REQUEST_ERROR_DATA_DIR_CANNOT_CREATE, request.path, {
"receive_mode_dir": self.receive_mode_dir
})
- print(strings._('error_cannot_create_data_dir').format(self.receive_mode_dir))
+ print("Could not create OnionShare data folder: {}".format(self.receive_mode_dir))
self.web.common.log('ReceiveModeRequest', '__init__', 'Permission denied creating receive mode directory')
self.upload_error = True
diff --git a/onionshare/web/share_mode.py b/onionshare/web/share_mode.py
index eb487c42..560a8ba4 100644
--- a/onionshare/web/share_mode.py
+++ b/onionshare/web/share_mode.py
@@ -201,7 +201,7 @@ class ShareModeWeb(object):
# Close the server, if necessary
if not self.web.stay_open and not canceled:
- print(strings._("closing_automatically"))
+ print("Stopped because transfer is complete")
self.web.running = False
try:
if shutdown_func is None:
diff --git a/onionshare/web/web.py b/onionshare/web/web.py
index 66ba5b24..edaf75f1 100644
--- a/onionshare/web/web.py
+++ b/onionshare/web/web.py
@@ -22,7 +22,10 @@ from .receive_mode import ReceiveModeWeb, ReceiveModeWSGIMiddleware, ReceiveMode
def stubbed_show_server_banner(env, debug, app_import_path, eager_loading):
pass
-flask.cli.show_server_banner = stubbed_show_server_banner
+try:
+ flask.cli.show_server_banner = stubbed_show_server_banner
+except:
+ pass
class Web(object):
@@ -51,9 +54,9 @@ class Web(object):
template_folder=self.common.get_resource_path('templates'))
self.app.secret_key = self.common.random_string(8)
- # Debug mode?
- if self.common.debug:
- self.debug_mode()
+ # Verbose mode?
+ if self.common.verbose:
+ self.verbose_mode()
# Are we running in GUI mode?
self.is_gui = is_gui
@@ -150,7 +153,7 @@ class Web(object):
if self.error404_count == 20:
self.add_request(Web.REQUEST_RATE_LIMIT, request.path)
self.force_shutdown()
- print(strings._('error_rate_limit'))
+ print("Someone has made too many wrong attempts on your address, which means they could be trying to guess it, so OnionShare has stopped the server. Start sharing again and send the recipient a new address to share.")
r = make_response(render_template('404.html'), 404)
return self.add_security_headers(r)
@@ -193,12 +196,12 @@ class Web(object):
self.slug = self.common.build_slug()
self.common.log('Web', 'generate_slug', 'built random slug: "{}"'.format(self.slug))
- def debug_mode(self):
+ def verbose_mode(self):
"""
- Turn on debugging mode, which will log flask errors to a debug file.
+ Turn on verbose mode, which will log flask errors to a file.
"""
- flask_debug_filename = os.path.join(self.common.build_data_dir(), 'flask_debug.log')
- log_handler = logging.FileHandler(flask_debug_filename)
+ flask_log_filename = os.path.join(self.common.build_data_dir(), 'flask.log')
+ log_handler = logging.FileHandler(flask_log_filename)
log_handler.setLevel(logging.WARNING)
self.app.logger.addHandler(log_handler)
@@ -228,13 +231,11 @@ class Web(object):
pass
self.running = False
- def start(self, port, stay_open=False, public_mode=False, persistent_slug=None):
+ def start(self, port, stay_open=False, public_mode=False, slug=None):
"""
Start the flask web server.
"""
- self.common.log('Web', 'start', 'port={}, stay_open={}, public_mode={}, persistent_slug={}'.format(port, stay_open, public_mode, persistent_slug))
- if not public_mode:
- self.generate_slug(persistent_slug)
+ self.common.log('Web', 'start', 'port={}, stay_open={}, public_mode={}, slug={}'.format(port, stay_open, public_mode, slug))
self.stay_open = stay_open
@@ -264,7 +265,7 @@ class Web(object):
self.stop_q.put(True)
# Reset any slug that was in use
- self.slug = ''
+ self.slug = None
# To stop flask, load http://127.0.0.1:<port>/<shutdown_slug>/shutdown
if self.running:
diff --git a/onionshare_gui/__init__.py b/onionshare_gui/__init__.py
index 675bb52d..99c52937 100644
--- a/onionshare_gui/__init__.py
+++ b/onionshare_gui/__init__.py
@@ -26,7 +26,6 @@ import signal
from .widgets import Alert
from PyQt5 import QtCore, QtWidgets
-from onionshare import strings
from onionshare.common import Common
from onionshare.onion import Onion
from onionshare.onionshare import OnionShare
@@ -59,16 +58,8 @@ def main():
common = Common()
common.define_css()
- # Load the default settings and strings early, for the sake of being able to parse options.
- # These won't be in the user's chosen locale necessarily, but we need to parse them
- # early in order to even display the option to pass alternate settings (which might
- # contain a preferred locale).
- # If an alternate --config is passed, we'll reload strings later.
- common.load_settings()
- strings.load_strings(common)
-
# Display OnionShare banner
- print(strings._('version_string').format(common.version))
+ print("OnionShare {0:s} | https://onionshare.org/".format(common.version))
# Allow Ctrl-C to smoothly quit the program instead of throwing an exception
# https://stackoverflow.com/questions/42814093/how-to-handle-ctrlc-in-python-app-with-pyqt
@@ -80,10 +71,10 @@ def main():
# Parse arguments
parser = argparse.ArgumentParser(formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=48))
- parser.add_argument('--local-only', action='store_true', dest='local_only', help=strings._("help_local_only"))
- parser.add_argument('--debug', action='store_true', dest='debug', help=strings._("help_debug"))
- parser.add_argument('--filenames', metavar='filenames', nargs='+', help=strings._('help_filename'))
- parser.add_argument('--config', metavar='config', default=False, help=strings._('help_config'))
+ parser.add_argument('--local-only', action='store_true', dest='local_only', help="Don't use Tor (only for development)")
+ parser.add_argument('-v', '--verbose', action='store_true', dest='verbose', help="Log OnionShare errors to stdout, and web errors to disk")
+ parser.add_argument('--filenames', metavar='filenames', nargs='+', help="List of files or folders to share")
+ parser.add_argument('--config', metavar='config', default=False, help="Custom JSON config file location (optional)")
args = parser.parse_args()
filenames = args.filenames
@@ -93,25 +84,23 @@ def main():
config = args.config
if config:
- # Re-load the strings, in case the provided config has changed locale
common.load_settings(config)
- strings.load_strings(common)
local_only = bool(args.local_only)
- debug = bool(args.debug)
+ verbose = bool(args.verbose)
- # Debug mode?
- common.debug = debug
+ # Verbose mode?
+ common.verbose = verbose
# Validation
if filenames:
valid = True
for filename in filenames:
if not os.path.isfile(filename) and not os.path.isdir(filename):
- Alert(common, strings._("not_a_file").format(filename))
+ Alert(common, "{0:s} is not a valid file.".format(filename))
valid = False
if not os.access(filename, os.R_OK):
- Alert(common, strings._("not_a_readable_file").format(filename))
+ Alert(common, "{0:s} is not a readable file.".format(filename))
valid = False
if not valid:
sys.exit()
diff --git a/onionshare_gui/mode/__init__.py b/onionshare_gui/mode/__init__.py
index 4fe335e7..8f5ff32b 100644
--- a/onionshare_gui/mode/__init__.py
+++ b/onionshare_gui/mode/__init__.py
@@ -20,10 +20,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
from PyQt5 import QtCore, QtWidgets, QtGui
from onionshare import strings
-from onionshare.common import ShutdownTimer
+from onionshare.common import AutoStopTimer
from ..server_status import ServerStatus
from ..threads import OnionThread
+from ..threads import AutoStartTimer
from ..widgets import Alert
class Mode(QtWidgets.QWidget):
@@ -35,6 +36,7 @@ class Mode(QtWidgets.QWidget):
starting_server_step2 = QtCore.pyqtSignal()
starting_server_step3 = QtCore.pyqtSignal()
starting_server_error = QtCore.pyqtSignal(str)
+ starting_server_early = QtCore.pyqtSignal()
set_server_active = QtCore.pyqtSignal(bool)
def __init__(self, common, qtapp, app, status_bar, server_status_label, system_tray, filenames=None, local_only=False):
@@ -58,6 +60,7 @@ class Mode(QtWidgets.QWidget):
# Threads start out as None
self.onion_thread = None
self.web_thread = None
+ self.startup_thread = None
# Server status
self.server_status = ServerStatus(self.common, self.qtapp, self.app, None, self.local_only)
@@ -68,6 +71,7 @@ class Mode(QtWidgets.QWidget):
self.stop_server_finished.connect(self.server_status.stop_server_finished)
self.starting_server_step2.connect(self.start_server_step2)
self.starting_server_step3.connect(self.start_server_step3)
+ self.starting_server_early.connect(self.start_server_early)
self.starting_server_error.connect(self.start_server_error)
# Primary action
@@ -88,24 +92,55 @@ class Mode(QtWidgets.QWidget):
"""
pass
+ def human_friendly_time(self, secs):
+ """
+ Returns a human-friendly time delta from given seconds.
+ """
+ days = secs//86400
+ hours = (secs - days*86400)//3600
+ minutes = (secs - days*86400 - hours*3600)//60
+ seconds = secs - days*86400 - hours*3600 - minutes*60
+ if not seconds:
+ seconds = '0'
+ result = ("{0}{1}, ".format(days, strings._('days_first_letter')) if days else "") + \
+ ("{0}{1}, ".format(hours, strings._('hours_first_letter')) if hours else "") + \
+ ("{0}{1}, ".format(minutes, strings._('minutes_first_letter')) if minutes else "") + \
+ "{0}{1}".format(seconds, strings._('seconds_first_letter'))
+
+ return result
+
def timer_callback(self):
"""
This method is called regularly on a timer.
"""
- # If the auto-shutdown timer has stopped, stop the server
+ # If this is a scheduled share, display the countdown til the share starts
+ if self.server_status.status == ServerStatus.STATUS_WORKING:
+ if self.server_status.autostart_timer_datetime:
+ now = QtCore.QDateTime.currentDateTime()
+ if self.server_status.local_only:
+ seconds_remaining = now.secsTo(self.server_status.autostart_timer_widget.dateTime())
+ else:
+ seconds_remaining = now.secsTo(self.server_status.autostart_timer_datetime.replace(second=0, microsecond=0))
+ # Update the server button
+ if seconds_remaining > 0:
+ self.server_status.server_button.setText(strings._('gui_waiting_to_start').format(self.human_friendly_time(seconds_remaining)))
+ else:
+ self.server_status.server_button.setText(strings._('gui_please_wait'))
+
+ # If the auto-stop timer has stopped, stop the server
if self.server_status.status == ServerStatus.STATUS_STARTED:
- if self.app.shutdown_timer and self.common.settings.get('shutdown_timeout'):
- if self.timeout > 0:
+ if self.app.autostop_timer_thread and self.common.settings.get('autostop_timer'):
+ if self.autostop_timer_datetime_delta > 0:
now = QtCore.QDateTime.currentDateTime()
- seconds_remaining = now.secsTo(self.server_status.timeout)
+ seconds_remaining = now.secsTo(self.server_status.autostop_timer_datetime)
# Update the server button
- server_button_text = self.get_stop_server_shutdown_timeout_text()
- self.server_status.server_button.setText(server_button_text.format(seconds_remaining))
+ server_button_text = self.get_stop_server_autostop_timer_text()
+ self.server_status.server_button.setText(server_button_text.format(self.human_friendly_time(seconds_remaining)))
self.status_bar.clearMessage()
- if not self.app.shutdown_timer.is_alive():
- if self.timeout_finished_should_stop_server():
+ if not self.app.autostop_timer_thread.is_alive():
+ if self.autostop_timer_finished_should_stop_server():
self.server_status.stop_server()
def timer_callback_custom(self):
@@ -114,15 +149,15 @@ class Mode(QtWidgets.QWidget):
"""
pass
- def get_stop_server_shutdown_timeout_text(self):
+ def get_stop_server_autostop_timer_text(self):
"""
- Return the string to put on the stop server button, if there's a shutdown timeout
+ Return the string to put on the stop server button, if there's an auto-stop timer
"""
pass
- def timeout_finished_should_stop_server(self):
+ def autostop_timer_finished_should_stop_server(self):
"""
- The shutdown timer expired, should we stop the server? Returns a bool
+ The auto-stop timer expired, should we stop the server? Returns a bool
"""
pass
@@ -142,7 +177,41 @@ class Mode(QtWidgets.QWidget):
self.status_bar.clearMessage()
self.server_status_label.setText('')
+ # Ensure we always get a new random port each time we might launch an OnionThread
+ self.app.port = None
+
+ # Start the onion thread. If this share was scheduled for a future date,
+ # the OnionThread will start and exit 'early' to obtain the port, slug
+ # and onion address, but it will not start the WebThread yet.
+ if self.server_status.autostart_timer_datetime:
+ self.start_onion_thread(obtain_onion_early=True)
+ else:
+ self.start_onion_thread()
+
+ # If scheduling a share, delay starting the real share
+ if self.server_status.autostart_timer_datetime:
+ self.common.log('Mode', 'start_server', 'Starting auto-start timer')
+ self.startup_thread = AutoStartTimer(self)
+ # Once the timer has finished, start the real share, with a WebThread
+ self.startup_thread.success.connect(self.start_scheduled_service)
+ self.startup_thread.error.connect(self.start_server_error)
+ self.startup_thread.canceled = False
+ self.startup_thread.start()
+
+ def start_onion_thread(self, obtain_onion_early=False):
self.common.log('Mode', 'start_server', 'Starting an onion thread')
+ self.obtain_onion_early = obtain_onion_early
+ self.onion_thread = OnionThread(self)
+ self.onion_thread.success.connect(self.starting_server_step2.emit)
+ self.onion_thread.success_early.connect(self.starting_server_early.emit)
+ self.onion_thread.error.connect(self.starting_server_error.emit)
+ self.onion_thread.start()
+
+ def start_scheduled_service(self, obtain_onion_early=False):
+ # We start a new OnionThread with the saved scheduled key from settings
+ self.common.settings.load()
+ self.obtain_onion_early = obtain_onion_early
+ self.common.log('Mode', 'start_server', 'Starting a scheduled onion thread')
self.onion_thread = OnionThread(self)
self.onion_thread.success.connect(self.starting_server_step2.emit)
self.onion_thread.error.connect(self.starting_server_error.emit)
@@ -154,6 +223,14 @@ class Mode(QtWidgets.QWidget):
"""
pass
+ def start_server_early(self):
+ """
+ An 'early' start of an onion service in order to obtain the onion
+ address for a scheduled start. Shows the onion address in the UI
+ in advance of actually starting the share.
+ """
+ self.server_status.show_url()
+
def start_server_step2(self):
"""
Step 2 in starting the onionshare server.
@@ -182,18 +259,18 @@ class Mode(QtWidgets.QWidget):
self.start_server_step3_custom()
- if self.common.settings.get('shutdown_timeout'):
+ if self.common.settings.get('autostop_timer'):
# Convert the date value to seconds between now and then
now = QtCore.QDateTime.currentDateTime()
- self.timeout = now.secsTo(self.server_status.timeout)
- # Set the shutdown timeout value
- if self.timeout > 0:
- self.app.shutdown_timer = ShutdownTimer(self.common, self.timeout)
- self.app.shutdown_timer.start()
- # The timeout has actually already passed since the user clicked Start. Probably the Onion service took too long to start.
+ self.autostop_timer_datetime_delta = now.secsTo(self.server_status.autostop_timer_datetime)
+ # Start the auto-stop timer
+ if self.autostop_timer_datetime_delta > 0:
+ self.app.autostop_timer_thread = AutoStopTimer(self.common, self.autostop_timer_datetime_delta)
+ self.app.autostop_timer_thread.start()
+ # The auto-stop timer has actually already passed since the user clicked Start. Probably the Onion service took too long to start.
else:
self.stop_server()
- self.start_server_error(strings._('gui_server_started_after_timeout'))
+ self.start_server_error(strings._('gui_server_started_after_autostop_timer'))
def start_server_step3_custom(self):
"""
@@ -225,7 +302,12 @@ class Mode(QtWidgets.QWidget):
Cancel the server while it is preparing to start
"""
self.cancel_server_custom()
-
+ if self.startup_thread:
+ self.common.log('Mode', 'cancel_server: quitting startup thread')
+ self.startup_thread.canceled = True
+ 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.quit()
diff --git a/onionshare_gui/mode/receive_mode/__init__.py b/onionshare_gui/mode/receive_mode/__init__.py
index 5fb33ab3..4c0b49ba 100644
--- a/onionshare_gui/mode/receive_mode/__init__.py
+++ b/onionshare_gui/mode/receive_mode/__init__.py
@@ -86,24 +86,24 @@ class ReceiveMode(Mode):
self.wrapper_layout.addWidget(self.history, stretch=1)
self.setLayout(self.wrapper_layout)
- def get_stop_server_shutdown_timeout_text(self):
+ def get_stop_server_autostop_timer_text(self):
"""
- Return the string to put on the stop server button, if there's a shutdown timeout
+ Return the string to put on the stop server button, if there's an auto-stop timer
"""
- return strings._('gui_receive_stop_server_shutdown_timeout')
+ return strings._('gui_receive_stop_server_autostop_timer')
- def timeout_finished_should_stop_server(self):
+ def autostop_timer_finished_should_stop_server(self):
"""
- The shutdown timer expired, should we stop the server? Returns a bool
+ The auto-stop timer expired, should we stop the server? Returns a bool
"""
# If there were no attempts to upload files, or all uploads are done, we can stop
if self.web.receive_mode.upload_count == 0 or not self.web.receive_mode.uploads_in_progress:
self.server_status.stop_server()
- self.server_status_label.setText(strings._('close_on_timeout'))
+ self.server_status_label.setText(strings._('close_on_autostop_timer'))
return True
# An upload is probably still running - hold off on stopping the share, but block new shares.
else:
- self.server_status_label.setText(strings._('gui_receive_mode_timeout_waiting'))
+ self.server_status_label.setText(strings._('gui_receive_mode_autostop_timer_waiting'))
self.web.receive_mode.can_upload = False
return False
diff --git a/onionshare_gui/mode/share_mode/__init__.py b/onionshare_gui/mode/share_mode/__init__.py
index 1f5ad00b..6cb50b2b 100644
--- a/onionshare_gui/mode/share_mode/__init__.py
+++ b/onionshare_gui/mode/share_mode/__init__.py
@@ -121,24 +121,24 @@ class ShareMode(Mode):
# Always start with focus on file selection
self.file_selection.setFocus()
- def get_stop_server_shutdown_timeout_text(self):
+ def get_stop_server_autostop_timer_text(self):
"""
- Return the string to put on the stop server button, if there's a shutdown timeout
+ Return the string to put on the stop server button, if there's an auto-stop timer
"""
- return strings._('gui_share_stop_server_shutdown_timeout')
+ return strings._('gui_share_stop_server_autostop_timer')
- def timeout_finished_should_stop_server(self):
+ def autostop_timer_finished_should_stop_server(self):
"""
- The shutdown timer expired, should we stop the server? Returns a bool
+ The auto-stop timer expired, should we stop the server? Returns a bool
"""
# If there were no attempts to download the share, or all downloads are done, we can stop
if self.web.share_mode.download_count == 0 or self.web.done:
self.server_status.stop_server()
- self.server_status_label.setText(strings._('close_on_timeout'))
+ self.server_status_label.setText(strings._('close_on_autostop_timer'))
return True
# A download is probably still running - hold off on stopping the share
else:
- self.server_status_label.setText(strings._('gui_share_mode_timeout_waiting'))
+ self.server_status_label.setText(strings._('gui_share_mode_autostop_timer_waiting'))
return False
def start_server_custom(self):
diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py
index 27abf5e5..17839669 100644
--- a/onionshare_gui/onionshare_gui.py
+++ b/onionshare_gui/onionshare_gui.py
@@ -62,13 +62,17 @@ class OnionShareGui(QtWidgets.QMainWindow):
self.config = config
if self.config:
self.common.load_settings(self.config)
+ else:
+ self.common.load_settings()
+
+ strings.load_strings(self.common)
# System tray
menu = QtWidgets.QMenu()
self.settings_action = menu.addAction(strings._('gui_settings_window_title'))
self.settings_action.triggered.connect(self.open_settings)
- help_action = menu.addAction(strings._('gui_settings_button_help'))
- help_action.triggered.connect(SettingsDialog.help_clicked)
+ self.help_action = menu.addAction(strings._('gui_settings_button_help'))
+ self.help_action.triggered.connect(lambda: SettingsDialog.help_clicked(self))
exit_action = menu.addAction(strings._('systray_menu_exit'))
exit_action.triggered.connect(self.close)
@@ -228,7 +232,10 @@ class OnionShareGui(QtWidgets.QMainWindow):
self.server_status_label.setText(strings._('gui_status_indicator_share_stopped'))
elif self.share_mode.server_status.status == ServerStatus.STATUS_WORKING:
self.server_status_image_label.setPixmap(QtGui.QPixmap.fromImage(self.server_status_image_working))
- self.server_status_label.setText(strings._('gui_status_indicator_share_working'))
+ if self.share_mode.server_status.autostart_timer_datetime:
+ self.server_status_label.setText(strings._('gui_status_indicator_share_scheduled'))
+ else:
+ self.server_status_label.setText(strings._('gui_status_indicator_share_working'))
elif self.share_mode.server_status.status == ServerStatus.STATUS_STARTED:
self.server_status_image_label.setPixmap(QtGui.QPixmap.fromImage(self.server_status_image_started))
self.server_status_label.setText(strings._('gui_status_indicator_share_started'))
@@ -239,7 +246,10 @@ class OnionShareGui(QtWidgets.QMainWindow):
self.server_status_label.setText(strings._('gui_status_indicator_receive_stopped'))
elif self.receive_mode.server_status.status == ServerStatus.STATUS_WORKING:
self.server_status_image_label.setPixmap(QtGui.QPixmap.fromImage(self.server_status_image_working))
- self.server_status_label.setText(strings._('gui_status_indicator_receive_working'))
+ if self.receive_mode.server_status.autostart_timer_datetime:
+ self.server_status_label.setText(strings._('gui_status_indicator_receive_scheduled'))
+ else:
+ self.server_status_label.setText(strings._('gui_status_indicator_receive_working'))
elif self.receive_mode.server_status.status == ServerStatus.STATUS_STARTED:
self.server_status_image_label.setPixmap(QtGui.QPixmap.fromImage(self.server_status_image_started))
self.server_status_label.setText(strings._('gui_status_indicator_receive_started'))
@@ -309,10 +319,16 @@ class OnionShareGui(QtWidgets.QMainWindow):
self.receive_mode.on_reload_settings()
self.status_bar.clearMessage()
- # If we switched off the shutdown timeout setting, ensure the widget is hidden.
- if not self.common.settings.get('shutdown_timeout'):
- self.share_mode.server_status.shutdown_timeout_container.hide()
- self.receive_mode.server_status.shutdown_timeout_container.hide()
+ # If we switched off the auto-stop timer setting, ensure the widget is hidden.
+ if not self.common.settings.get('autostop_timer'):
+ self.share_mode.server_status.autostop_timer_container.hide()
+ self.receive_mode.server_status.autostop_timer_container.hide()
+ # If we switched off the auto-start timer setting, ensure the widget is hidden.
+ if not self.common.settings.get('autostart_timer'):
+ self.share_mode.server_status.autostart_timer_datetime = None
+ self.receive_mode.server_status.autostart_timer_datetime = None
+ self.share_mode.server_status.autostart_timer_container.hide()
+ self.receive_mode.server_status.autostart_timer_container.hide()
d = SettingsDialog(self.common, self.onion, self.qtapp, self.config, self.local_only)
d.settings_saved.connect(reload_settings)
diff --git a/onionshare_gui/server_status.py b/onionshare_gui/server_status.py
index e34a3d16..0c51119e 100644
--- a/onionshare_gui/server_status.py
+++ b/onionshare_gui/server_status.py
@@ -56,34 +56,60 @@ class ServerStatus(QtWidgets.QWidget):
self.app = app
self.web = None
+ self.autostart_timer_datetime = None
self.local_only = local_only
self.resizeEvent(None)
- # Shutdown timeout layout
- self.shutdown_timeout_label = QtWidgets.QLabel(strings._('gui_settings_shutdown_timeout'))
- self.shutdown_timeout = QtWidgets.QDateTimeEdit()
- self.shutdown_timeout.setDisplayFormat("hh:mm A MMM d, yy")
+ # Auto-start timer layout
+ self.autostart_timer_label = QtWidgets.QLabel(strings._('gui_settings_autostart_timer'))
+ self.autostart_timer_widget = QtWidgets.QDateTimeEdit()
+ self.autostart_timer_widget.setDisplayFormat("hh:mm A MMM d, yy")
if self.local_only:
# For testing
- self.shutdown_timeout.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(15))
- self.shutdown_timeout.setMinimumDateTime(QtCore.QDateTime.currentDateTime())
+ self.autostart_timer_widget.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(15))
+ self.autostart_timer_widget.setMinimumDateTime(QtCore.QDateTime.currentDateTime())
else:
- # Set proposed timeout to be 5 minutes into the future
- self.shutdown_timeout.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(300))
+ # Set proposed timer to be 5 minutes into the future
+ self.autostart_timer_widget.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(300))
# Onion services can take a little while to start, so reduce the risk of it expiring too soon by setting the minimum to 60s from now
- self.shutdown_timeout.setMinimumDateTime(QtCore.QDateTime.currentDateTime().addSecs(60))
- self.shutdown_timeout.setCurrentSection(QtWidgets.QDateTimeEdit.MinuteSection)
- shutdown_timeout_layout = QtWidgets.QHBoxLayout()
- shutdown_timeout_layout.addWidget(self.shutdown_timeout_label)
- shutdown_timeout_layout.addWidget(self.shutdown_timeout)
-
- # Shutdown timeout container, so it can all be hidden and shown as a group
- shutdown_timeout_container_layout = QtWidgets.QVBoxLayout()
- shutdown_timeout_container_layout.addLayout(shutdown_timeout_layout)
- self.shutdown_timeout_container = QtWidgets.QWidget()
- self.shutdown_timeout_container.setLayout(shutdown_timeout_container_layout)
- self.shutdown_timeout_container.hide()
+ self.autostart_timer_widget.setMinimumDateTime(QtCore.QDateTime.currentDateTime().addSecs(60))
+ self.autostart_timer_widget.setCurrentSection(QtWidgets.QDateTimeEdit.MinuteSection)
+ autostart_timer_layout = QtWidgets.QHBoxLayout()
+ autostart_timer_layout.addWidget(self.autostart_timer_label)
+ autostart_timer_layout.addWidget(self.autostart_timer_widget)
+
+ # Auto-start timer container, so it can all be hidden and shown as a group
+ autostart_timer_container_layout = QtWidgets.QVBoxLayout()
+ autostart_timer_container_layout.addLayout(autostart_timer_layout)
+ self.autostart_timer_container = QtWidgets.QWidget()
+ self.autostart_timer_container.setLayout(autostart_timer_container_layout)
+ self.autostart_timer_container.hide()
+
+ # Auto-stop timer layout
+ self.autostop_timer_label = QtWidgets.QLabel(strings._('gui_settings_autostop_timer'))
+ self.autostop_timer_widget = QtWidgets.QDateTimeEdit()
+ self.autostop_timer_widget.setDisplayFormat("hh:mm A MMM d, yy")
+ if self.local_only:
+ # For testing
+ self.autostop_timer_widget.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(15))
+ self.autostop_timer_widget.setMinimumDateTime(QtCore.QDateTime.currentDateTime())
+ else:
+ # Set proposed timer to be 5 minutes into the future
+ self.autostop_timer_widget.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(300))
+ # Onion services can take a little while to start, so reduce the risk of it expiring too soon by setting the minimum to 60s from now
+ self.autostop_timer_widget.setMinimumDateTime(QtCore.QDateTime.currentDateTime().addSecs(60))
+ self.autostop_timer_widget.setCurrentSection(QtWidgets.QDateTimeEdit.MinuteSection)
+ autostop_timer_layout = QtWidgets.QHBoxLayout()
+ autostop_timer_layout.addWidget(self.autostop_timer_label)
+ autostop_timer_layout.addWidget(self.autostop_timer_widget)
+
+ # Auto-stop timer container, so it can all be hidden and shown as a group
+ autostop_timer_container_layout = QtWidgets.QVBoxLayout()
+ autostop_timer_container_layout.addLayout(autostop_timer_layout)
+ self.autostop_timer_container = QtWidgets.QWidget()
+ self.autostop_timer_container.setLayout(autostop_timer_container_layout)
+ self.autostop_timer_container.hide()
# Server layout
self.server_button = QtWidgets.QPushButton()
@@ -123,7 +149,8 @@ class ServerStatus(QtWidgets.QWidget):
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.server_button)
layout.addLayout(url_layout)
- layout.addWidget(self.shutdown_timeout_container)
+ layout.addWidget(self.autostart_timer_container)
+ layout.addWidget(self.autostop_timer_container)
self.setLayout(layout)
def set_mode(self, share_mode, file_selection=None):
@@ -154,59 +181,74 @@ class ServerStatus(QtWidgets.QWidget):
except:
pass
+ def autostart_timer_reset(self):
+ """
+ Reset the auto-start timer in the UI after stopping a share
+ """
+ self.autostart_timer_widget.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(300))
+ if not self.local_only:
+ self.autostart_timer_widget.setMinimumDateTime(QtCore.QDateTime.currentDateTime().addSecs(60))
- def shutdown_timeout_reset(self):
+ def autostop_timer_reset(self):
"""
- Reset the timeout in the UI after stopping a share
+ Reset the auto-stop timer in the UI after stopping a share
"""
- self.shutdown_timeout.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(300))
+ self.autostop_timer_widget.setDateTime(QtCore.QDateTime.currentDateTime().addSecs(300))
if not self.local_only:
- self.shutdown_timeout.setMinimumDateTime(QtCore.QDateTime.currentDateTime().addSecs(60))
+ self.autostop_timer_widget.setMinimumDateTime(QtCore.QDateTime.currentDateTime().addSecs(60))
- def update(self):
+ def show_url(self):
"""
- Update the GUI elements based on the current state.
+ Show the URL in the UI.
"""
- # Set the URL fields
- if self.status == self.STATUS_STARTED:
- self.url_description.show()
+ self.url_description.show()
- info_image = self.common.get_resource_path('images/info.png')
+ info_image = self.common.get_resource_path('images/info.png')
- if self.mode == ServerStatus.MODE_SHARE:
- self.url_description.setText(strings._('gui_share_url_description').format(info_image))
- else:
- self.url_description.setText(strings._('gui_receive_url_description').format(info_image))
+ if self.mode == ServerStatus.MODE_SHARE:
+ self.url_description.setText(strings._('gui_share_url_description').format(info_image))
+ else:
+ self.url_description.setText(strings._('gui_receive_url_description').format(info_image))
- # Show a Tool Tip explaining the lifecycle of this URL
- if self.common.settings.get('save_private_key'):
- if self.mode == ServerStatus.MODE_SHARE and self.common.settings.get('close_after_first_download'):
- self.url_description.setToolTip(strings._('gui_url_label_onetime_and_persistent'))
- else:
- self.url_description.setToolTip(strings._('gui_url_label_persistent'))
+ # Show a Tool Tip explaining the lifecycle of this URL
+ if self.common.settings.get('save_private_key'):
+ if self.mode == ServerStatus.MODE_SHARE and self.common.settings.get('close_after_first_download'):
+ self.url_description.setToolTip(strings._('gui_url_label_onetime_and_persistent'))
else:
- if self.mode == ServerStatus.MODE_SHARE and self.common.settings.get('close_after_first_download'):
- self.url_description.setToolTip(strings._('gui_url_label_onetime'))
- else:
- self.url_description.setToolTip(strings._('gui_url_label_stay_open'))
+ self.url_description.setToolTip(strings._('gui_url_label_persistent'))
+ else:
+ if self.mode == ServerStatus.MODE_SHARE and self.common.settings.get('close_after_first_download'):
+ self.url_description.setToolTip(strings._('gui_url_label_onetime'))
+ else:
+ self.url_description.setToolTip(strings._('gui_url_label_stay_open'))
- self.url.setText(self.get_url())
- self.url.show()
+ self.url.setText(self.get_url())
+ self.url.show()
+ self.copy_url_button.show()
- self.copy_url_button.show()
+ if self.app.stealth:
+ self.copy_hidservauth_button.show()
+ else:
+ self.copy_hidservauth_button.hide()
+
+ def update(self):
+ """
+ Update the GUI elements based on the current state.
+ """
+ # Set the URL fields
+ if self.status == self.STATUS_STARTED:
+ self.show_url()
if self.common.settings.get('save_private_key'):
if not self.common.settings.get('slug'):
self.common.settings.set('slug', self.web.slug)
self.common.settings.save()
- if self.common.settings.get('shutdown_timeout'):
- self.shutdown_timeout_container.hide()
+ if self.common.settings.get('autostart_timer'):
+ self.autostart_timer_container.hide()
- if self.app.stealth:
- self.copy_hidservauth_button.show()
- else:
- self.copy_hidservauth_button.hide()
+ if self.common.settings.get('autostop_timer'):
+ self.autostop_timer_container.hide()
else:
self.url_description.hide()
self.url.hide()
@@ -227,8 +269,10 @@ class ServerStatus(QtWidgets.QWidget):
else:
self.server_button.setText(strings._('gui_receive_start_server'))
self.server_button.setToolTip('')
- if self.common.settings.get('shutdown_timeout'):
- self.shutdown_timeout_container.show()
+ if self.common.settings.get('autostart_timer'):
+ self.autostart_timer_container.show()
+ if self.common.settings.get('autostop_timer'):
+ self.autostop_timer_container.show()
elif self.status == self.STATUS_STARTED:
self.server_button.setStyleSheet(self.common.css['server_status_button_started'])
self.server_button.setEnabled(True)
@@ -236,43 +280,61 @@ class ServerStatus(QtWidgets.QWidget):
self.server_button.setText(strings._('gui_share_stop_server'))
else:
self.server_button.setText(strings._('gui_receive_stop_server'))
- if self.common.settings.get('shutdown_timeout'):
- self.shutdown_timeout_container.hide()
- if self.mode == ServerStatus.MODE_SHARE:
- self.server_button.setToolTip(strings._('gui_share_stop_server_shutdown_timeout_tooltip').format(self.timeout))
- else:
- self.server_button.setToolTip(strings._('gui_receive_stop_server_shutdown_timeout_tooltip').format(self.timeout))
-
+ if self.common.settings.get('autostart_timer'):
+ self.autostart_timer_container.hide()
+ if self.common.settings.get('autostop_timer'):
+ self.autostop_timer_container.hide()
+ self.server_button.setToolTip(strings._('gui_stop_server_autostop_timer_tooltip').format(self.autostop_timer_widget.dateTime().toString("h:mm AP, MMMM dd, yyyy")))
elif self.status == self.STATUS_WORKING:
self.server_button.setStyleSheet(self.common.css['server_status_button_working'])
self.server_button.setEnabled(True)
- self.server_button.setText(strings._('gui_please_wait'))
- if self.common.settings.get('shutdown_timeout'):
- self.shutdown_timeout_container.hide()
+ if self.autostart_timer_datetime:
+ self.autostart_timer_container.hide()
+ self.server_button.setToolTip(strings._('gui_start_server_autostart_timer_tooltip').format(self.autostart_timer_widget.dateTime().toString("h:mm AP, MMMM dd, yyyy")))
+ else:
+ self.server_button.setText(strings._('gui_please_wait'))
+ if self.common.settings.get('autostop_timer'):
+ self.autostop_timer_container.hide()
else:
self.server_button.setStyleSheet(self.common.css['server_status_button_working'])
self.server_button.setEnabled(False)
self.server_button.setText(strings._('gui_please_wait'))
- if self.common.settings.get('shutdown_timeout'):
- self.shutdown_timeout_container.hide()
+ if self.common.settings.get('autostart_timer'):
+ self.autostart_timer_container.hide()
+ self.server_button.setToolTip(strings._('gui_start_server_autostart_timer_tooltip').format(self.autostart_timer_widget.dateTime().toString("h:mm AP, MMMM dd, yyyy")))
+ if self.common.settings.get('autostop_timer'):
+ self.autostop_timer_container.hide()
def server_button_clicked(self):
"""
Toggle starting or stopping the server.
"""
if self.status == self.STATUS_STOPPED:
- if self.common.settings.get('shutdown_timeout'):
+ can_start = True
+ if self.common.settings.get('autostart_timer'):
if self.local_only:
- self.timeout = self.shutdown_timeout.dateTime().toPyDateTime()
+ self.autostart_timer_datetime = self.autostart_timer_widget.dateTime().toPyDateTime()
else:
- # Get the timeout chosen, stripped of its seconds. This prevents confusion if the share stops at (say) 37 seconds past the minute chosen
- self.timeout = self.shutdown_timeout.dateTime().toPyDateTime().replace(second=0, microsecond=0)
- # If the timeout has actually passed already before the user hit Start, refuse to start the server.
- if QtCore.QDateTime.currentDateTime().toPyDateTime() > self.timeout:
- Alert(self.common, strings._('gui_server_timeout_expired'), QtWidgets.QMessageBox.Warning)
+ self.autostart_timer_datetime = self.autostart_timer_widget.dateTime().toPyDateTime().replace(second=0, microsecond=0)
+ # If the timer has actually passed already before the user hit Start, refuse to start the server.
+ if QtCore.QDateTime.currentDateTime().toPyDateTime() > self.autostart_timer_datetime:
+ can_start = False
+ Alert(self.common, strings._('gui_server_autostart_timer_expired'), QtWidgets.QMessageBox.Warning)
+ if self.common.settings.get('autostop_timer'):
+ if self.local_only:
+ self.autostop_timer_datetime = self.autostop_timer_widget.dateTime().toPyDateTime()
else:
- self.start_server()
- else:
+ # Get the timer chosen, stripped of its seconds. This prevents confusion if the share stops at (say) 37 seconds past the minute chosen
+ self.autostop_timer_datetime = self.autostop_timer_widget.dateTime().toPyDateTime().replace(second=0, microsecond=0)
+ # If the timer has actually passed already before the user hit Start, refuse to start the server.
+ if QtCore.QDateTime.currentDateTime().toPyDateTime() > self.autostop_timer_datetime:
+ can_start = False
+ Alert(self.common, strings._('gui_server_autostop_timer_expired'), QtWidgets.QMessageBox.Warning)
+ if self.common.settings.get('autostart_timer'):
+ if self.autostop_timer_datetime <= self.autostart_timer_datetime:
+ Alert(self.common, strings._('gui_autostop_timer_cant_be_earlier_than_autostart_timer'), QtWidgets.QMessageBox.Warning)
+ can_start = False
+ if can_start:
self.start_server()
elif self.status == self.STATUS_STARTED:
self.stop_server()
@@ -302,7 +364,8 @@ class ServerStatus(QtWidgets.QWidget):
Stop the server.
"""
self.status = self.STATUS_WORKING
- self.shutdown_timeout_reset()
+ self.autostart_timer_reset()
+ self.autostop_timer_reset()
self.update()
self.server_stopped.emit()
@@ -312,7 +375,8 @@ class ServerStatus(QtWidgets.QWidget):
"""
self.common.log('ServerStatus', 'cancel_server', 'Canceling the server mid-startup')
self.status = self.STATUS_WORKING
- self.shutdown_timeout_reset()
+ self.autostart_timer_reset()
+ self.autostop_timer_reset()
self.update()
self.server_canceled.emit()
diff --git a/onionshare_gui/settings_dialog.py b/onionshare_gui/settings_dialog.py
index 2933784c..3c0b83f4 100644
--- a/onionshare_gui/settings_dialog.py
+++ b/onionshare_gui/settings_dialog.py
@@ -71,27 +71,45 @@ class SettingsDialog(QtWidgets.QDialog):
self.public_mode_widget = QtWidgets.QWidget()
self.public_mode_widget.setLayout(public_mode_layout)
- # Whether or not to use a shutdown ('auto-stop') timer
- self.shutdown_timeout_checkbox = QtWidgets.QCheckBox()
- self.shutdown_timeout_checkbox.setCheckState(QtCore.Qt.Checked)
- self.shutdown_timeout_checkbox.setText(strings._("gui_settings_shutdown_timeout_checkbox"))
- shutdown_timeout_label = QtWidgets.QLabel(strings._("gui_settings_whats_this").format("https://github.com/micahflee/onionshare/wiki/Using-the-Auto-Stop-Timer"))
- shutdown_timeout_label.setStyleSheet(self.common.css['settings_whats_this'])
- shutdown_timeout_label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
- shutdown_timeout_label.setOpenExternalLinks(True)
- shutdown_timeout_label.setMinimumSize(public_mode_label.sizeHint())
- shutdown_timeout_layout = QtWidgets.QHBoxLayout()
- shutdown_timeout_layout.addWidget(self.shutdown_timeout_checkbox)
- shutdown_timeout_layout.addWidget(shutdown_timeout_label)
- shutdown_timeout_layout.addStretch()
- shutdown_timeout_layout.setContentsMargins(0,0,0,0)
- self.shutdown_timeout_widget = QtWidgets.QWidget()
- self.shutdown_timeout_widget.setLayout(shutdown_timeout_layout)
+ # Whether or not to use an auto-start timer
+ self.autostart_timer_checkbox = QtWidgets.QCheckBox()
+ self.autostart_timer_checkbox.setCheckState(QtCore.Qt.Checked)
+ self.autostart_timer_checkbox.setText(strings._("gui_settings_autostart_timer_checkbox"))
+ autostart_timer_label = QtWidgets.QLabel(strings._("gui_settings_whats_this").format("https://github.com/micahflee/onionshare/wiki/Using-the-Auto-Start-Timer"))
+ autostart_timer_label.setStyleSheet(self.common.css['settings_whats_this'])
+ autostart_timer_label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
+ autostart_timer_label.setOpenExternalLinks(True)
+ autostart_timer_label.setMinimumSize(public_mode_label.sizeHint())
+ autostart_timer_layout = QtWidgets.QHBoxLayout()
+ autostart_timer_layout.addWidget(self.autostart_timer_checkbox)
+ autostart_timer_layout.addWidget(autostart_timer_label)
+ autostart_timer_layout.addStretch()
+ autostart_timer_layout.setContentsMargins(0,0,0,0)
+ self.autostart_timer_widget = QtWidgets.QWidget()
+ self.autostart_timer_widget.setLayout(autostart_timer_layout)
+
+ # Whether or not to use an auto-stop timer
+ self.autostop_timer_checkbox = QtWidgets.QCheckBox()
+ self.autostop_timer_checkbox.setCheckState(QtCore.Qt.Checked)
+ self.autostop_timer_checkbox.setText(strings._("gui_settings_autostop_timer_checkbox"))
+ autostop_timer_label = QtWidgets.QLabel(strings._("gui_settings_whats_this").format("https://github.com/micahflee/onionshare/wiki/Using-the-Auto-Stop-Timer"))
+ autostop_timer_label.setStyleSheet(self.common.css['settings_whats_this'])
+ autostop_timer_label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction)
+ autostop_timer_label.setOpenExternalLinks(True)
+ autostop_timer_label.setMinimumSize(public_mode_label.sizeHint())
+ autostop_timer_layout = QtWidgets.QHBoxLayout()
+ autostop_timer_layout.addWidget(self.autostop_timer_checkbox)
+ autostop_timer_layout.addWidget(autostop_timer_label)
+ autostop_timer_layout.addStretch()
+ autostop_timer_layout.setContentsMargins(0,0,0,0)
+ self.autostop_timer_widget = QtWidgets.QWidget()
+ self.autostop_timer_widget.setLayout(autostop_timer_layout)
# General settings layout
general_group_layout = QtWidgets.QVBoxLayout()
general_group_layout.addWidget(self.public_mode_widget)
- general_group_layout.addWidget(self.shutdown_timeout_widget)
+ general_group_layout.addWidget(self.autostart_timer_widget)
+ general_group_layout.addWidget(self.autostop_timer_widget)
general_group = QtWidgets.QGroupBox(strings._("gui_settings_general_label"))
general_group.setLayout(general_group_layout)
@@ -488,11 +506,17 @@ class SettingsDialog(QtWidgets.QDialog):
else:
self.close_after_first_download_checkbox.setCheckState(QtCore.Qt.Unchecked)
- shutdown_timeout = self.old_settings.get('shutdown_timeout')
- if shutdown_timeout:
- self.shutdown_timeout_checkbox.setCheckState(QtCore.Qt.Checked)
+ autostart_timer = self.old_settings.get('autostart_timer')
+ if autostart_timer:
+ self.autostart_timer_checkbox.setCheckState(QtCore.Qt.Checked)
else:
- self.shutdown_timeout_checkbox.setCheckState(QtCore.Qt.Unchecked)
+ self.autostart_timer_checkbox.setCheckState(QtCore.Qt.Unchecked)
+
+ autostop_timer = self.old_settings.get('autostop_timer')
+ if autostop_timer:
+ self.autostop_timer_checkbox.setCheckState(QtCore.Qt.Checked)
+ else:
+ self.autostop_timer_checkbox.setCheckState(QtCore.Qt.Unchecked)
save_private_key = self.old_settings.get('save_private_key')
if save_private_key:
@@ -932,7 +956,8 @@ class SettingsDialog(QtWidgets.QDialog):
settings.load() # To get the last update timestamp
settings.set('close_after_first_download', self.close_after_first_download_checkbox.isChecked())
- settings.set('shutdown_timeout', self.shutdown_timeout_checkbox.isChecked())
+ settings.set('autostart_timer', self.autostart_timer_checkbox.isChecked())
+ settings.set('autostop_timer', self.autostop_timer_checkbox.isChecked())
# Complicated logic here to force v2 onion mode on or off depending on other settings
if self.use_legacy_v2_onions_checkbox.isChecked():
diff --git a/onionshare_gui/threads.py b/onionshare_gui/threads.py
index 3b05bebf..26a9ee6b 100644
--- a/onionshare_gui/threads.py
+++ b/onionshare_gui/threads.py
@@ -28,6 +28,7 @@ class OnionThread(QtCore.QThread):
Starts the onion service, and waits for it to finish
"""
success = QtCore.pyqtSignal()
+ success_early = QtCore.pyqtSignal()
error = QtCore.pyqtSignal(str)
def __init__(self, mode):
@@ -41,18 +42,30 @@ class OnionThread(QtCore.QThread):
def run(self):
self.mode.common.log('OnionThread', 'run')
+ # Choose port and slug early, because we need them to exist in advance for scheduled shares
self.mode.app.stay_open = not self.mode.common.settings.get('close_after_first_download')
-
- # start onionshare http service in new thread
- self.mode.web_thread = WebThread(self.mode)
- self.mode.web_thread.start()
-
- # wait for modules in thread to load, preventing a thread-related cx_Freeze crash
- time.sleep(0.2)
+ if not self.mode.app.port:
+ self.mode.app.choose_port()
+ if not self.mode.common.settings.get('public_mode'):
+ if not self.mode.web.slug:
+ self.mode.web.generate_slug(self.mode.common.settings.get('slug'))
try:
- self.mode.app.start_onion_service()
- self.success.emit()
+ if self.mode.obtain_onion_early:
+ self.mode.app.start_onion_service(await_publication=False, save_scheduled_key=True)
+ # wait for modules in thread to load, preventing a thread-related cx_Freeze crash
+ time.sleep(0.2)
+ self.success_early.emit()
+ # Unregister the onion so we can use it in the next OnionThread
+ self.mode.app.onion.cleanup(False)
+ else:
+ self.mode.app.start_onion_service(await_publication=True)
+ # wait for modules in thread to load, preventing a thread-related cx_Freeze crash
+ time.sleep(0.2)
+ # start onionshare http service in new thread
+ self.mode.web_thread = WebThread(self.mode)
+ self.mode.web_thread.start()
+ self.success.emit()
except (TorTooOld, TorErrorInvalidSetting, TorErrorAutomatic, TorErrorSocketPort, TorErrorSocketFile, TorErrorMissingPassword, TorErrorUnreadableCookieFile, TorErrorAuthError, TorErrorProtocolError, BundledTorTimeout, OSError) as e:
self.error.emit(e.args[0])
@@ -73,5 +86,39 @@ class WebThread(QtCore.QThread):
def run(self):
self.mode.common.log('WebThread', 'run')
- self.mode.app.choose_port()
- self.mode.web.start(self.mode.app.port, self.mode.app.stay_open, self.mode.common.settings.get('public_mode'), self.mode.common.settings.get('slug'))
+ self.mode.web.start(self.mode.app.port, self.mode.app.stay_open, self.mode.common.settings.get('public_mode'), self.mode.web.slug)
+ self.success.emit()
+
+
+class AutoStartTimer(QtCore.QThread):
+ """
+ Waits for a prescribed time before allowing a share to start
+ """
+ success = QtCore.pyqtSignal()
+ error = QtCore.pyqtSignal(str)
+ def __init__(self, mode, canceled=False):
+ super(AutoStartTimer, self).__init__()
+ self.mode = mode
+ self.canceled = canceled
+ self.mode.common.log('AutoStartTimer', '__init__')
+
+ # allow this thread to be terminated
+ self.setTerminationEnabled()
+
+ def run(self):
+ now = QtCore.QDateTime.currentDateTime()
+ autostart_timer_datetime_delta = now.secsTo(self.mode.server_status.autostart_timer_datetime)
+ try:
+ # Sleep until scheduled time
+ while autostart_timer_datetime_delta > 0 and self.canceled == 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:
+ self.mode.server_status.server_button.setText(strings._('gui_please_wait'))
+ self.mode.server_status_label.setText(strings._('gui_status_indicator_share_working'))
+ self.success.emit()
+ except ValueError as e:
+ self.error.emit(e.args[0])
+ return
diff --git a/onionshare_gui/update_checker.py b/onionshare_gui/update_checker.py
index a7e0b99c..1e37b73a 100644
--- a/onionshare_gui/update_checker.py
+++ b/onionshare_gui/update_checker.py
@@ -25,7 +25,7 @@ from distutils.version import LooseVersion as Version
from onionshare.settings import Settings
from onionshare.onion import Onion
-from . import strings
+from onionshare import strings
class UpdateCheckerCheckError(Exception):
"""
diff --git a/screenshots/onionshare-receive-client.png b/screenshots/onionshare-receive-client.png
index be3f3585..648d67ae 100644
--- a/screenshots/onionshare-receive-client.png
+++ b/screenshots/onionshare-receive-client.png
Binary files differ
diff --git a/screenshots/onionshare-receive-server.png b/screenshots/onionshare-receive-server.png
index 283f4c41..0e801d3d 100644
--- a/screenshots/onionshare-receive-server.png
+++ b/screenshots/onionshare-receive-server.png
Binary files differ
diff --git a/share/locale/am.json b/share/locale/am.json
index d226d86e..b787a617 100644
--- a/share/locale/am.json
+++ b/share/locale/am.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"timeout_upload_still_running": "",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -38,12 +38,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -105,8 +105,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "ተወው",
"gui_settings_button_help": "መመሪያ",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -132,8 +132,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/ar.json b/share/locale/ar.json
index b70127fa..d125e5fd 100644
--- a/share/locale/ar.json
+++ b/share/locale/ar.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "{0:s} ملف غير قابل للقراءة.",
"no_available_port": "لا يوجد منفذ متاح لتشغيل (onion service)",
"other_page_loaded": "تم تحميل العنوان",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "توقف بسبب انتهاء التحميل",
"timeout_download_still_running": "انتظار اكتمال التحميل",
"large_filesize": "تحذير: ارسال مشاركة كبيرة قد يستغرق ساعات",
@@ -23,133 +23,133 @@
"systray_download_canceled_message": "الغى المستخدم التحميل",
"systray_upload_started_title": "بدأ الرفع",
"systray_upload_started_message": "بدأ مستخدم رفع ملفات الى حاسوبك",
- "help_local_only": "",
+ "help_local_only": "لا تستخدم تور (فقط لغرض التطوير)",
"help_stay_open": "استمر في المشاركة بعد اول تحميل",
- "help_shutdown_timeout": "أوقف المشاركة بعد ثواني محددة",
+ "help_autostop_timer": "أوقف المشاركة بعد ثواني محددة",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
- "help_filename": "",
+ "help_verbose": "",
+ "help_filename": "قائمة الملفات أو المجلدات للمشاركة",
"help_config": "",
"gui_drag_and_drop": "",
"gui_add": "إضافة",
"gui_delete": "حذف",
"gui_choose_items": "إختر",
- "gui_share_start_server": "",
- "gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_start_server": "ابدأ المشاركة",
+ "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_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
- "gui_copy_url": "",
- "gui_copy_hidservauth": "",
+ "gui_receive_stop_server": "أوقف وضع الإستلام",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
+ "gui_copy_url": "نسخ العنوان",
+ "gui_copy_hidservauth": "انسخ HidServAuth",
"gui_downloads": "",
"gui_no_downloads": "",
"gui_canceled": "ألغى",
"gui_copied_url_title": "",
- "gui_copied_url": "",
+ "gui_copied_url": "تم نسخ عنوان OnionShare إلى الحافظة",
"gui_copied_hidservauth_title": "",
"gui_copied_hidservauth": "",
"gui_please_wait": "",
"gui_download_upload_progress_complete": "",
"gui_download_upload_progress_starting": "",
"gui_download_upload_progress_eta": "",
- "version_string": "",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
"gui_quit_title": "",
- "gui_share_quit_warning": "",
- "gui_receive_quit_warning": "",
+ "gui_share_quit_warning": "إنك بصدد إرسال ملفات.هل أنت متأكد أنك تريد الخروج مِن OnionShare؟",
+ "gui_receive_quit_warning": "إنك بصدد تلقي ملفات.هل أنت متأكد أنك تريد الخروج مِن OnionShare؟",
"gui_quit_warning_quit": "خروج",
"gui_quit_warning_dont_quit": "إلغاء",
"error_rate_limit": "",
- "zip_progress_bar_format": "",
+ "zip_progress_bar_format": "جاري الضغط: %p%",
"error_stealth_not_supported": "",
"error_ephemeral_not_supported": "",
"gui_settings_window_title": "الإعدادات",
- "gui_settings_whats_this": "",
- "gui_settings_stealth_option": "",
+ "gui_settings_whats_this": "<a href='{0:s}'>ما هذا؟</a>",
+ "gui_settings_stealth_option": "استخدام ترخيص العميل",
"gui_settings_stealth_hidservauth_string": "",
"gui_settings_autoupdate_label": "التحقق من الإصدار الجديد",
- "gui_settings_autoupdate_option": "",
- "gui_settings_autoupdate_timestamp": "",
+ "gui_settings_autoupdate_option": "قم بإشعاري عند توفر إصدار جديد",
+ "gui_settings_autoupdate_timestamp": "آخر فحص: {}",
"gui_settings_autoupdate_timestamp_never": "أبدا",
- "gui_settings_autoupdate_check_button": "",
+ "gui_settings_autoupdate_check_button": "تحقق من وجود نسخة جديدة",
"gui_settings_general_label": "الإعدادات العامة",
- "gui_settings_sharing_label": "",
- "gui_settings_close_after_first_download_option": "",
- "gui_settings_connection_type_label": "",
- "gui_settings_connection_type_bundled_option": "",
+ "gui_settings_sharing_label": "إعدادات المشاركة",
+ "gui_settings_close_after_first_download_option": "إيقاف المشاركة بعد اكتمال إرسال الملفات",
+ "gui_settings_connection_type_label": "كيف ينبغي أن يتصل OnionShare بشبكة تور؟",
+ "gui_settings_connection_type_bundled_option": "استخدام إصدار تور المدمج في صلب OnionShare",
"gui_settings_connection_type_automatic_option": "",
- "gui_settings_connection_type_control_port_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_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": "دعم جسر تور",
+ "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_custom_radio_option": "استخدام جسور مخصصة",
+ "gui_settings_tor_bridges_custom_label": "يمكنكم الحصول على جسور مِن <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
"gui_settings_tor_bridges_invalid": "",
"gui_settings_button_save": "حفظ",
"gui_settings_button_cancel": "إلغاء",
"gui_settings_button_help": "مساعدة",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "إيقاف المشاركة في:",
"settings_error_unknown": "",
"settings_error_automatic": "",
- "settings_error_socket_port": "",
+ "settings_error_socket_port": "لا يمكن الاتصال بوحدة تحكم تور في {}:{}.",
"settings_error_socket_file": "",
"settings_error_auth": "",
- "settings_error_missing_password": "",
+ "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": "",
- "error_tor_protocol_error_unknown": "",
- "error_invalid_private_key": "",
- "connecting_to_tor": "",
+ "error_tor_protocol_error": "هناك خطأ مع تور: {}",
+ "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": "",
+ "update_not_available": "إنك تقوم بتشغيل آخر نسخة مِن OnionShare.",
"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_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_tor_connection_lost": "غير متصل بشبكة تور.",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
- "gui_use_legacy_v2_onions_checkbox": "",
- "gui_save_private_key_checkbox": "",
+ "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_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": "",
+ "gui_file_info": "{} ملفات، {}",
+ "gui_file_info_single": "{} ملف، {}",
"history_in_progress_tooltip": "",
"history_completed_tooltip": "",
"info_in_progress_uploads_tooltip": "",
@@ -159,17 +159,17 @@
"receive_mode_warning": "",
"gui_receive_mode_warning": "",
"receive_mode_upload_starting": "",
- "receive_mode_received_file": "",
- "gui_mode_share_button": "",
- "gui_mode_receive_button": "",
- "gui_settings_receiving_label": "",
+ "receive_mode_received_file": "تم تلقي: {}",
+ "gui_mode_share_button": "مشاركة الملفات",
+ "gui_mode_receive_button": "تلقّي ملفات",
+ "gui_settings_receiving_label": "إعدادات الاستلام",
"gui_settings_downloads_label": "",
"gui_settings_downloads_button": "استعراض",
"gui_settings_receive_allow_receiver_shutdown_checkbox": "",
- "gui_settings_public_mode_checkbox": "",
+ "gui_settings_public_mode_checkbox": "الوضع العام",
"systray_close_server_title": "",
"systray_close_server_message": "",
- "systray_page_loaded_title": "",
+ "systray_page_loaded_title": "تم تحميل الصفحة",
"systray_download_page_loaded_message": "",
"systray_upload_page_loaded_message": "",
"gui_uploads": "",
@@ -180,7 +180,28 @@
"gui_upload_finished": "",
"gui_download_in_progress": "",
"gui_open_folder_error_nautilus": "",
- "gui_settings_language_label": "",
+ "gui_settings_language_label": "اللغة المفضلة",
"gui_settings_language_changed_notice": "",
- "timeout_upload_still_running": "انتظار اكتمال الرفع"
+ "timeout_upload_still_running": "انتظار اكتمال الرفع",
+ "gui_add_files": "إضافة ملفات",
+ "gui_add_folder": "إضافة مجلد",
+ "gui_settings_onion_label": "إعدادات البصل",
+ "gui_connect_to_tor_for_onion_settings": "اربط الاتصال بشبكة تور لترى إعدادات خدمة البصل",
+ "gui_settings_data_dir_label": "حفظ الملفات على",
+ "gui_settings_data_dir_browse_button": "تصفح",
+ "systray_page_loaded_message": "تم تحميل عنوان OnionShare",
+ "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_share_mode_no_files": "لم ترسل أية ملفات بعد",
+ "gui_share_mode_autostop_timer_waiting": "في انتظار الانتهاء من الإرسال",
+ "gui_receive_mode_no_files": "لم تتلق أية ملفات بعد",
+ "gui_receive_mode_autostop_timer_waiting": "في انتظار الانتهاء من الاستلام"
}
diff --git a/share/locale/bg.json b/share/locale/bg.json
index 256f27e0..9a579ce6 100644
--- a/share/locale/bg.json
+++ b/share/locale/bg.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "{0:s) не е четаем файл.",
"no_available_port": "Свободен порт не бе намерен, за да може onion услугата да бъде стартирана",
"other_page_loaded": "Адресът е зареден",
- "close_on_timeout": "Спряно, защото автоматично спиращият таймер приключи",
+ "close_on_autostop_timer": "Спряно, защото автоматично спиращият таймер приключи",
"closing_automatically": "Спряно, защото свалянето приключи",
"timeout_download_still_running": "Изчакване на свалянето да приключи",
"timeout_upload_still_running": "Изчакване ъплоудът да приключи",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "Ползвател започна да ъплоудва файлове на компютъра Ви",
"help_local_only": "Не използвайте Тор (само за разработване)",
"help_stay_open": "Продължи споделянето след първото изтегляне",
- "help_shutdown_timeout": "Спри споделянето след дадено количество секунди",
+ "help_autostop_timer": "Спри споделянето след дадено количество секунди",
"help_stealth": "Използвай клиент авторизация (напреднал)",
"help_receive": "Получаване на дялове вместо изпращане",
- "help_debug": "Протоколирай OnionShare грешки на stdout и уеб грешки на диск",
+ "help_verbose": "Протоколирай OnionShare грешки на stdout и уеб грешки на диск",
"help_filename": "Списък на документи или папки за споделяне",
"help_config": "Персонализирано местоположение на JSON конфигурационен файл (незадължително)",
"gui_drag_and_drop": "Плъзнете и пуснете файлове и папки, \nза да започнете споделяне",
@@ -38,12 +38,12 @@
"gui_choose_items": "Изберете",
"gui_share_start_server": "Започнете споделянето",
"gui_share_stop_server": "Спрете споделянето",
- "gui_share_stop_server_shutdown_timeout": "Спрете споделянето ({} остават)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Автоматично спиращият таймерът терминира в {}",
+ "gui_share_stop_server_autostop_timer": "Спрете споделянето ({} остават)",
+ "gui_share_stop_server_autostop_timer_tooltip": "Автоматично спиращият таймерът терминира в {}",
"gui_receive_start_server": "Стартирайте получаващ режим",
"gui_receive_stop_server": "Спрете получаващия режим",
- "gui_receive_stop_server_shutdown_timeout": "Спрете получаващия режим ({} остават)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Автоматично спиращият таймер спира в {}",
+ "gui_receive_stop_server_autostop_timer": "Спрете получаващия режим ({} остават)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Автоматично спиращият таймер спира в {}",
"gui_copy_url": "Копирайте адрес",
"gui_copy_hidservauth": "Копирайте HidServAuth",
"gui_downloads": "Свалете история",
@@ -105,8 +105,8 @@
"gui_settings_button_save": "Запазване",
"gui_settings_button_cancel": "Отказ",
"gui_settings_button_help": "Помощ",
- "gui_settings_shutdown_timeout_checkbox": "Използвайте автоматично спиращия таймер",
- "gui_settings_shutdown_timeout": "Спри дела на:",
+ "gui_settings_autostop_timer_checkbox": "Използвайте автоматично спиращия таймер",
+ "gui_settings_autostop_timer": "Спри дела на:",
"settings_error_unknown": "Не мога да се свържа с Тор контролера, защото Вашите настройки не правят смисъл.",
"settings_error_automatic": "Не мога да се свържа с Тор контролера. Стартиран ли е Тор браузерът във фонов режим (достъпен от torproject. org)?",
"settings_error_socket_port": "Не мога да се свържа с Тор контролера в {}:{}.",
@@ -132,8 +132,8 @@
"gui_tor_connection_error_settings": "Опитайте се да промените в настройките как OnionShare се свързва с Тор.",
"gui_tor_connection_canceled": "Не може да се установи връзка с Тор.\n\nУверете се, че имате връзка с интернтет, след което отново отворете OnionShare и пренастройте връзката с Тор.",
"gui_tor_connection_lost": "Връзката с Тор е прекъсната.",
- "gui_server_started_after_timeout": "Автоматично спиращият таймер спря преди сървърът да стартира.\nМоля направете нов дял.",
- "gui_server_timeout_expired": "Автоматично спиращият таймер спря.\nМоля актуализирайте за да започнете споделяне.",
+ "gui_server_started_after_autostop_timer": "Автоматично спиращият таймер спря преди сървърът да стартира.\nМоля направете нов дял.",
+ "gui_server_autostop_timer_expired": "Автоматично спиращият таймер спря.\nМоля актуализирайте за да започнете споделяне.",
"share_via_onionshare": "Споделете го чрез OnionShare",
"gui_use_legacy_v2_onions_checkbox": "Използвайте стари адреси",
"gui_save_private_key_checkbox": "Използвайте постоянни адреси (стари)",
diff --git a/share/locale/bn.json b/share/locale/bn.json
index 691c5047..f4560c9c 100644
--- a/share/locale/bn.json
+++ b/share/locale/bn.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "{0:s} ফাইলটি পড়া যাচ্ছে না।",
"no_available_port": "Onion সার্ভিস চালু করার জন্য কোন পোর্ট পাওয়া যাচ্ছে না",
"other_page_loaded": "এড্রেস লোড হয়েছে",
- "close_on_timeout": "বন্ধ করা হয়েছে কারণ অটো-স্টপ টাইমার এর সময় শেষ",
+ "close_on_autostop_timer": "বন্ধ করা হয়েছে কারণ অটো-স্টপ টাইমার এর সময় শেষ",
"closing_automatically": "ট্রান্সফার শেষ তাই থেমে যাওয়া হলো",
"timeout_download_still_running": "",
"timeout_upload_still_running": "",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "",
"help_local_only": "Tor ব্যবহার করবে না (শুধুমাত্র ডেভেলপারদের জন্য)",
"help_stay_open": "ফাইলগুলো পাঠানো হয়ে গেলেও শেয়ার করা থামিও না",
- "help_shutdown_timeout": "নির্দিষ্ট সেকেন্ডের পর শেয়ার করা বন্ধ করে দিও",
+ "help_autostop_timer": "নির্দিষ্ট সেকেন্ডের পর শেয়ার করা বন্ধ করে দিও",
"help_stealth": "ক্লায়েন্ট অনুমোদন ব্যবহার করুন (উন্নততর)",
"help_receive": "কোনকিছু শেয়ার না করে শুধু গ্রহণ করবে",
- "help_debug": "OnionShare-এর এররগুলো stdout-এ দেখাও, আর ওয়েব এররগুলো ডিস্কে লগ করো",
+ "help_verbose": "OnionShare-এর এররগুলো stdout-এ দেখাও, আর ওয়েব এররগুলো ডিস্কে লগ করো",
"help_filename": "শেয়ার করার জন্য ফাইল বা ফোল্ডারের লিস্ট",
"help_config": "কাস্টম JSON কনফিগারেশন ফাইলের লোকেশন (যদি থাকে)",
"gui_drag_and_drop": "শেয়ার করা শুরু করতে\nফাইল এবং ফোল্ডারগুলো ড্র্যাগ করে ড্রপ করুন",
@@ -38,12 +38,12 @@
"gui_choose_items": "পছন্দ করুন",
"gui_share_start_server": "শেয়ার করা শুরু করো",
"gui_share_stop_server": "শেয়ার করা বন্ধ করো",
- "gui_share_stop_server_shutdown_timeout": "শেয়ার করা বন্ধ করো ({} সেকেন্ড বাকি)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "টাইমার অনুযায়ী অটোমেটিক বন্ধ হবে {}-তে",
- "gui_receive_start_server": "প্রাপ্ত মোড আরম্ভ করুন ",
- "gui_receive_stop_server": "প্রাপ্ত মোড বন্ধ করুন ",
- "gui_receive_stop_server_shutdown_timeout": "প্রাপ্ত মোড বন্ধ করুন ({}সে বাকি) ",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "টাইমার অনুযায়ী অটোমেটিক বন্ধ হবে {}-তে",
+ "gui_share_stop_server_autostop_timer": "শেয়ার করা বন্ধ করো ({} সেকেন্ড বাকি)",
+ "gui_share_stop_server_autostop_timer_tooltip": "টাইমার অনুযায়ী অটোমেটিক বন্ধ হবে {}-তে",
+ "gui_receive_start_server": "প্রাপ্ত মোড আরম্ভ করুন",
+ "gui_receive_stop_server": "প্রাপ্ত মোড বন্ধ করুন",
+ "gui_receive_stop_server_autostop_timer": "প্রাপ্ত মোড বন্ধ করুন ({}সে বাকি)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "টাইমার অনুযায়ী অটোমেটিক বন্ধ হবে {}-তে",
"gui_copy_url": "এড্রেস কপি করো",
"gui_copy_hidservauth": "HidServAuth কপি করো",
"gui_downloads": "",
@@ -105,71 +105,71 @@
"gui_settings_button_save": "সেভ",
"gui_settings_button_cancel": "বাতিল",
"gui_settings_button_help": "সাহায্য",
- "gui_settings_shutdown_timeout_checkbox": "কানেকশন বন্ধ করার জন্য অটোমেটিক টাইমার ব্যবহার করো",
- "gui_settings_shutdown_timeout": "শেয়ার বন্ধ করুন:",
- "settings_error_unknown": "টর নিয়ন্ত্রকের সাথে সংযোগ করতে পারে না কারণ আপনার বিন্যাসনসমূহ বোধগম্য নয় । ",
+ "gui_settings_autostop_timer_checkbox": "কানেকশন বন্ধ করার জন্য অটোমেটিক টাইমার ব্যবহার করো",
+ "gui_settings_autostop_timer": "শেয়ার বন্ধ করুন:",
+ "settings_error_unknown": "টর নিয়ন্ত্রকের সাথে সংযোগ করতে পারে না কারণ আপনার বিন্যাসনসমূহ বোধগম্য নয় ।",
"settings_error_automatic": "টর নিয়ন্ত্রকের সাথে সংযোগ স্থাপন করা যায়নি । টর ব্রাউজার (torproject.org থেকে পাওয়া যায়) ব্রাকগ্রাউন চলমান?",
- "settings_error_socket_port": "{}: {} এ টর নিয়ন্ত্রকের সাথে সংযোগ করতে পারছি না । ",
- "settings_error_socket_file": "সকেট ফাইল {} ব্যবহার করে টর নিয়ন্ত্রকের সাথে সংযোগ করতে পারে না । ",
- "settings_error_auth": "{}: {}-এর সাথে সংযুক্ত, কিন্তু পরীক্ষা করা যাচ্ছে না । হয়তো এটা কোন টর নিয়ন্ত্রক নয়? ",
+ "settings_error_socket_port": "{}: {} এ টর নিয়ন্ত্রকের সাথে সংযোগ করতে পারছি না ।",
+ "settings_error_socket_file": "সকেট ফাইল {} ব্যবহার করে টর নিয়ন্ত্রকের সাথে সংযোগ করতে পারে না ।",
+ "settings_error_auth": "{}: {}-এর সাথে সংযুক্ত, কিন্তু পরীক্ষা করা যাচ্ছে না । হয়তো এটা কোন টর নিয়ন্ত্রক নয়?",
"settings_error_missing_password": "টর কন্ট্রোলার সাথে সংযুক্ত, কিন্তু তা প্রমাণীকরণ একটি পাসওয়ার্ড প্রয়োজন.",
- "settings_error_unreadable_cookie_file": "টর নিয়ন্ত্রকের সাথে সংযুক্ত, কিন্তু পাসওয়ার্ড ভুল হতে পারে, অথবা আপনার ব্যবহারকারীকে কুকি ফাইলে পড়ার অনুমতি দেওয়া হয়নি। ",
+ "settings_error_unreadable_cookie_file": "টর নিয়ন্ত্রকের সাথে সংযুক্ত, কিন্তু পাসওয়ার্ড ভুল হতে পারে, অথবা আপনার ব্যবহারকারীকে কুকি ফাইলে পড়ার অনুমতি দেওয়া হয়নি।",
"settings_error_bundled_tor_not_supported": "OnionShare এর সাথে আসা টর সংস্করণটি ব্যবহার করে উইন্ডোজ বা ম্যাকোসে ডেভেলপার মোডে কাজ করে না।",
"settings_error_bundled_tor_timeout": "টর সাথে সংযোগ করার জন্য খুব বেশি সময় লাগছে। হয়তো আপনি ইন্টারনেটের সাথে সংযুক্ত নন, অথবা একটি ভুল সিস্টেম ঘড়ি আছে?",
"settings_error_bundled_tor_broken": "ব্যাকগ্রাউন্ডে OnionShare টর এর সাথে সংযুক্ত নয়:\n\n\n{}",
- "settings_test_success": "টর কন্ট্রোলার এর সঙ্গে যুক্ত হয়েছে ।\n\nটর সংস্করণ: {}\n\nOnion Services সেবা সমর্থন করে: {}.\n\nক্লায়েন্ট প্রমাণীকরণ সমর্থন করে: {}.\n\nnext-gen .onion ঠিকানাগুলো সমর্থন করে: {} । ",
- "error_tor_protocol_error": "টর-এ একটি ত্রুটি ছিল: {} ",
+ "settings_test_success": "টর কন্ট্রোলার এর সঙ্গে যুক্ত হয়েছে ।\n\nটর সংস্করণ: {}\nOnion Services সেবা সমর্থন করে: {}.\nক্লায়েন্ট প্রমাণীকরণ সমর্থন করে: {}.\nnext-gen .onion ঠিকানাগুলো সমর্থন করে: {} ।",
+ "error_tor_protocol_error": "টর-এ একটি ত্রুটি ছিল: {}",
"error_tor_protocol_error_unknown": "টর-এ একটি অজানা ত্রুটি আছে",
- "error_invalid_private_key": "এই ব্যক্তিগত কী ধরন টি অসমর্থিত ",
- "connecting_to_tor": "টর নেটওয়ার্কে সংযুক্ত হচ্ছে ",
- "update_available": "",
- "update_error_check_error": "নতুন সংস্করণের জন্য পরীক্ষা করা যায়নি: onionshare ওয়েবসাইট বলছে সাম্প্রতিক সংস্করণটি হচ্ছে অস্বীকৃত ' {} '...",
+ "error_invalid_private_key": "এই ব্যক্তিগত কী ধরন টি অসমর্থিত",
+ "connecting_to_tor": "টর নেটওয়ার্কে সংযুক্ত হচ্ছে",
+ "update_available": "নতুন OnionShare বের হয়েছে । এটি পেতে এখানে <a href='{}'>ক্লিক করুন</a> । <br><br>আপনি {} এবং সাম্প্রতিকতম {} ব্যবহার করছেন ।",
+ "update_error_check_error": "নতুন সংস্করণের জন্য পরীক্ষা করা যায়নি: onionshare ওয়েবসাইট বলছে সাম্প্রতিক সংস্করণটি হচ্ছে অস্বীকৃত ' {} '…",
"update_error_invalid_latest_version": "নতুন সংস্করণের জন্য পরীক্ষা করা যায়নি: হয়তো আপনি টর-এর সাথে সংযুক্ত নন, অথবা OnionShare ওয়েবসাইট বন্ধ আছে?",
"update_not_available": "আপনি সর্বশেষ OnionShare চালাচ্ছেন ।",
"gui_tor_connection_ask": "টর থেকে সংযোগ সাজাতে সেটিংস খুলুন?",
"gui_tor_connection_ask_open_settings": "হ্যাঁ",
"gui_tor_connection_ask_quit": "প্রস্থান করুন",
- "gui_tor_connection_error_settings": " কিভাবে onionshare সেটিংসে টর নেটওয়ার্ক সংযোগ করে পরিবর্তন করতে চেষ্টা করুন ।",
- "gui_tor_connection_canceled": "টর-এ সংযোগ করা যায়নি ।\n\nআপনি ইন্টারনেটের সাথে সংযুক্ত আছেন কিনা তা নিশ্চিত করুন, তারপর onionshare পুনরায় খুলুন এবং টর এর সংযোগটি সেট আপ করুন । ",
- "gui_tor_connection_lost": "টর থেকে বিচ্ছিন্ন । ",
- "gui_server_started_after_timeout": "সার্ভার শুরু হওয়ার আগেই অটো স্টপ টাইমার শেষ হয়ে যায় ।\n\nঅনুগ্রহ করে একটি নতুন শেয়ার তৈরি করুন. ",
- "gui_server_timeout_expired": "অটো-স্টপ টাইমার ইতিমধ্যেই শেষ হয়ে গিয়েছে ।\n\nঅনুগ্রহ করে শেয়ারিং শুরু করতে এটি আপডেট করুন. ",
- "share_via_onionshare": "এটি 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_tor_connection_error_settings": "কিভাবে onionshare সেটিংসে টর নেটওয়ার্ক সংযোগ করে পরিবর্তন করতে চেষ্টা করুন ।",
+ "gui_tor_connection_canceled": "টর-এ সংযোগ করা যায়নি ।\n\nআপনি ইন্টারনেটের সাথে সংযুক্ত আছেন কিনা তা নিশ্চিত করুন, তারপর onionshare পুনরায় খুলুন এবং টর এর সংযোগটি সেট আপ করুন ।",
+ "gui_tor_connection_lost": "টর থেকে বিচ্ছিন্ন ।",
+ "gui_server_started_after_autostop_timer": "সার্ভার শুরু হওয়ার আগেই অটো স্টপ টাইমার শেষ হয়ে যায় ।\n\nঅনুগ্রহ করে একটি নতুন শেয়ার তৈরি করুন.",
+ "gui_server_autostop_timer_expired": "অটো-স্টপ টাইমার ইতিমধ্যেই শেষ হয়ে গিয়েছে ।\n\nঅনুগ্রহ করে শেয়ারিং শুরু করতে এটি আপডেট করুন.",
+ "share_via_onionshare": "এটি OnionShare",
+ "gui_use_legacy_v2_onions_checkbox": "লিগ্যাসি ঠিকানাগুলি ব্যবহার করুন",
+ "gui_save_private_key_checkbox": "একটি অবিরাম ঠিকানা ব্যবহার করুন",
+ "gui_share_url_description": "এই OnionShare ঠিকানার সাথে <b>যে কেউ</b> <b>টর ব্রাউজার</b> ব্যবহার করে আপনার ফাইলগুলি <b>ডাউনলোড</b> করতে পারে:<img src='{}' />",
+ "gui_receive_url_description": "এই OnionShare ঠিকানার সাথে <b>যে কেউ</b> <b>টর ব্রাউজার</b> ব্যবহার করে আপনার কম্পিউটারে ফাইলগুলি <b>আপলোড</b> করতে পারে:<img src='{}' />",
+ "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_status_indicator_receive_stopped": "পাওয়ার জন্য প্রস্তুত ",
- "gui_status_indicator_receive_working": "শুরু... ",
+ "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": "{} সম্পূর্ণ\n",
+ "history_in_progress_tooltip": "{} অগ্রসর হচ্ছে",
+ "history_completed_tooltip": "{} সম্পূর্ণ",
"info_in_progress_uploads_tooltip": "",
"info_completed_uploads_tooltip": "",
"error_cannot_create_downloads_dir": "",
"receive_mode_downloads_dir": "",
- "receive_mode_warning": "সতর্কীকরণ: প্রাপ্ত মোড লোকজনকে আপনার কম্পিউটারে ফাইল আপলোড করতে দেয় । আপনি যদি তাদের খোলেন তবে কিছু ফাইল সম্ভবত আপনার কম্পিউটারের নিয়ন্ত্রণ নিতে পারে । শুধুমাত্র আপনি যে ব্যক্তিদের বিশ্বাস করেন, অথবা আপনি যদি জানেন আপনি কি করছেন তা শুধুমাত্র খোলা জিনিস । ",
+ "receive_mode_warning": "সতর্কীকরণ: প্রাপ্ত মোড লোকজনকে আপনার কম্পিউটারে ফাইল আপলোড করতে দেয় । আপনি যদি তাদের খোলেন তবে কিছু ফাইল সম্ভবত আপনার কম্পিউটারের নিয়ন্ত্রণ নিতে পারে । শুধুমাত্র আপনি যে ব্যক্তিদের বিশ্বাস করেন, অথবা আপনি যদি জানেন আপনি কি করছেন তা শুধুমাত্র খোলা জিনিস ।",
"gui_receive_mode_warning": "গ্রহণ মোডে লোকজন আপনার কম্পিউটারে ফাইলগুলো আপলোড করতে দেয় । <br><br><b>আপনি যদি তাদের খোলেন তবে কিছু ফাইল সম্ভবত আপনার কম্পিউটারের নিয়ন্ত্রণ নিতে পারে । শুধুমাত্র আপনি যে ব্যক্তিদের বিশ্বাস করেন, অথবা আপনি যদি জানেন আপনি কি করছেন তা শুধুমাত্র খোলা জিনিস ।</b>",
- "receive_mode_upload_starting": "মোট আকারের {} টি আপলোড শুরু হচ্ছে ",
- "receive_mode_received_file": "প্রাপ্ত: {} ",
- "gui_mode_share_button": "ফাইলগুলো শেয়ার করুন ",
- "gui_mode_receive_button": "ফাইল গ্রহণ করা হচ্ছে ",
- "gui_settings_receiving_label": "সেটিংস গ্রহণ করা হচ্ছে ",
+ "receive_mode_upload_starting": "মোট আকারের {} টি আপলোড শুরু হচ্ছে",
+ "receive_mode_received_file": "প্রাপ্ত: {}",
+ "gui_mode_share_button": "ফাইলগুলো শেয়ার করুন",
+ "gui_mode_receive_button": "ফাইল গ্রহণ করা হচ্ছে",
+ "gui_settings_receiving_label": "সেটিংস গ্রহণ করা হচ্ছে",
"gui_settings_downloads_label": "",
"gui_settings_downloads_button": "দেখা",
- "gui_settings_public_mode_checkbox": "সর্বজনীন মোড ",
+ "gui_settings_public_mode_checkbox": "সর্বজনীন মোড",
"systray_close_server_title": "",
"systray_close_server_message": "",
- "systray_page_loaded_title": "পৃষ্ঠা লোড করা হয়েছে ",
+ "systray_page_loaded_title": "পৃষ্ঠা লোড করা হয়েছে",
"systray_download_page_loaded_message": "",
"systray_upload_page_loaded_message": "",
"gui_uploads": "",
@@ -179,18 +179,18 @@
"gui_upload_finished_range": "",
"gui_upload_finished": "",
"gui_download_in_progress": "",
- "gui_open_folder_error_nautilus": "ফোল্ডার খোলা যাচ্ছে না কারণ nautilus বিদ্যমান নয় । ফাইলটি এখানে: {} ",
- "gui_settings_language_label": "পছন্দনীয় ভাষা ",
- "gui_settings_language_changed_notice": "আপনার ভাষার পরিবর্তন প্রভাব বিস্তার করার জন্য OnionShare পুনর্সূচনা করুন. ",
+ "gui_open_folder_error_nautilus": "ফোল্ডার খোলা যাচ্ছে না কারণ nautilus বিদ্যমান নয় । ফাইলটি এখানে: {}",
+ "gui_settings_language_label": "পছন্দনীয় ভাষা",
+ "gui_settings_language_changed_notice": "আপনার ভাষার পরিবর্তন প্রভাব বিস্তার করার জন্য OnionShare পুনর্সূচনা করুন.",
"gui_add_files": "ফাইল যোগ করো",
"gui_add_folder": "ফোল্ডার যোগ করো",
"gui_settings_onion_label": "Onion সেটিংস",
- "gui_connect_to_tor_for_onion_settings": "onion সেবা সেটিংস দেখতে টর এর সাথে সংযোগ করুন ",
- "error_cannot_create_data_dir": "onionshare ডাটা ফোল্ডার তৈরি করা যায়নি: {} ",
- "receive_mode_data_dir": "আপনার কাছে পাঠানো ফাইলসমূহ এই ফোল্ডারে প্রদর্শিত হয়েছে: {} ",
- "gui_settings_data_dir_label": "ফাইল সংরক্ষণ করুন ",
+ "gui_connect_to_tor_for_onion_settings": "onion সেবা সেটিংস দেখতে টর এর সাথে সংযোগ করুন",
+ "error_cannot_create_data_dir": "onionshare ডাটা ফোল্ডার তৈরি করা যায়নি: {}",
+ "receive_mode_data_dir": "আপনার কাছে পাঠানো ফাইলসমূহ এই ফোল্ডারে প্রদর্শিত হয়েছে: {}",
+ "gui_settings_data_dir_label": "ফাইল সংরক্ষণ করুন",
"gui_settings_data_dir_browse_button": "ব্রাউজ",
- "systray_page_loaded_message": "onionshare ঠিকানা লোড করা হয়েছে ",
+ "systray_page_loaded_message": "onionshare ঠিকানা লোড করা হয়েছে",
"systray_share_started_title": "শেয়ারিং শুরু করা হয়েছে",
"systray_share_completed_title": "শেয়ারিং সম্পূর্ণ হয়েছে",
"systray_share_completed_message": "ফাইল পাঠানো শেষ হয়েছে",
@@ -200,5 +200,17 @@
"systray_receive_started_message": "কেউ আপনার কাছে ফাইল পাঠাচ্ছে",
"gui_all_modes_history": "ইতিহাস",
"gui_all_modes_clear_history": "সব পরিষ্কার করুন",
- "gui_all_modes_transfer_started": "{} শুরু হয়েছে"
+ "gui_all_modes_transfer_started": "{} শুরু হয়েছে",
+ "systray_share_started_message": "কাউকে ফাইল পাঠাতে শুরু",
+ "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": "%p%, {0: সে} অতিক্রান্ত হয়েছে ।",
+ "gui_all_modes_progress_starting": "{0:সে}, %p% (গণনা করা হচ্ছে)",
+ "gui_all_modes_progress_eta": "{0:সে}, ইটিএ: {1: সে}, %p%",
+ "gui_share_mode_no_files": "এখনও কোন ফাইল পাঠানো হয়নি",
+ "gui_share_mode_autostop_timer_waiting": "প্রেরণ শেষ করার জন্য অপেক্ষা করছে",
+ "gui_receive_mode_no_files": "কোন ফাইল এখনও প্রাপ্ত হয়নি",
+ "gui_receive_mode_autostop_timer_waiting": "প্রাপ্তির শেষ পর্যন্ত অপেক্ষা করছে"
}
diff --git a/share/locale/ca.json b/share/locale/ca.json
index a59dae2a..b88dcead 100644
--- a/share/locale/ca.json
+++ b/share/locale/ca.json
@@ -1,16 +1,16 @@
{
"config_onion_service": "S'està establint el servei onion al port {0:d}.",
- "preparing_files": "S'estan comprimint els arxius.",
+ "preparing_files": "S'estan comprimint els fitxers.",
"give_this_url": "Dóna aquesta adreça a la persona destinatària:",
"give_this_url_stealth": "Fes arribar aquestes dues línies a la/es persona/es destinatària/es:",
"give_this_url_receive": "Dóna aquesta adreça a la persona remitent:",
"give_this_url_receive_stealth": "Dóna aquesta adreça i la línia HidServAuth a la persona remitent:",
"ctrlc_to_stop": "Prem Control+C per aturar el servidor",
"not_a_file": "{0:s} no és un arxiu vàlid.",
- "not_a_readable_file": "{0:s} no és un arxiu llegible.",
+ "not_a_readable_file": "{0:s} no és un fitxer llegible.",
"no_available_port": "No s'ha pogut trobar un port disponible per començar el servei onion",
"other_page_loaded": "Adreça carregada",
- "close_on_timeout": "S'ha aturat perquè s'ha acabat el temps d'espera",
+ "close_on_autostop_timer": "S'ha aturat perquè s'ha acabat el temporitzador d'aturada automàtica",
"closing_automatically": "S'ha aturat perquè ha acabat la transferència",
"timeout_download_still_running": "S'està esperant que acabi la descàrrega",
"large_filesize": "Compte: La transferència d'arxius molt grans podria trigar hores",
@@ -25,24 +25,24 @@
"systray_upload_started_message": "Algú ha començat a pujar arxius al teu ordinador",
"help_local_only": "No facis servir Tor (només per a desenvolupament)",
"help_stay_open": "Mantingues obert el servei després d'enviar els arxius",
- "help_shutdown_timeout": "Deixa de compartir al cap de tants segons",
+ "help_autostop_timer": "Deixa de compartir al cap de tants segons",
"help_stealth": "Fes servir autorització de client (avançat)",
"help_receive": "Rep recursos en comptes d'enviar-los",
- "help_debug": "Envia els errors d'OnionShare a stdout i els errors web al disc",
+ "help_verbose": "Envia els errors d'OnionShare a stdout i els errors web al disc",
"help_filename": "Llista d'arxius o carpetes a compartir",
"help_config": "Ubicació de la configuració JSON personalitzada",
- "gui_drag_and_drop": "Arrossega arxius i carpetes\nper començar a compartir",
+ "gui_drag_and_drop": "Arrossega fitxers i carpetes\nper començar a compartir",
"gui_add": "Afegeix",
"gui_delete": "Esborra",
"gui_choose_items": "Escull",
"gui_share_start_server": "Comparteix",
"gui_share_stop_server": "Deixa de compartir",
- "gui_share_stop_server_shutdown_timeout": "Deixa de compartir (queden {}s)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "El temporitzador acaba a {}",
+ "gui_share_stop_server_autostop_timer": "Deixa de compartir (queden {}s)",
+ "gui_share_stop_server_autostop_timer_tooltip": "El temporitzador acaba a {}",
"gui_receive_start_server": "Inicia en mode de recepció",
"gui_receive_stop_server": "Atura el mode de recepció",
- "gui_receive_stop_server_shutdown_timeout": "Atura el mode de recepció (queden {}s)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "El temporitzador acaba a {}",
+ "gui_receive_stop_server_autostop_timer": "Atura el mode de recepció (queden {})",
+ "gui_receive_stop_server_autostop_timer_tooltip": "El temporitzador acaba a {}",
"gui_copy_url": "Copia l'adreça",
"gui_copy_hidservauth": "Copia el HidServAuth",
"gui_downloads": "Historial de descàrregues",
@@ -59,7 +59,7 @@
"version_string": "OnionShare {0:s} | https://onionshare.org/",
"gui_quit_title": "Espera un moment",
"gui_share_quit_warning": "Encara s'estan enviant fitxers. Segur que vols sortir de l'OnionShare?",
- "gui_receive_quit_warning": "Encara s'estan rebent arxius. Segur que vols sortir de l'OnionShare?",
+ "gui_receive_quit_warning": "Encara s'estan rebent fitxers. Segur que vols sortir de l'OnionShare?",
"gui_quit_warning_quit": "Surt",
"gui_quit_warning_dont_quit": "Canceŀla",
"error_rate_limit": "Algú ha fet massa intents a la teva adreça, cosa que podria significar que l'estan intentant endevinar. Per això OnionShare s'ha aturat sola. Pots tornar a començar i enviar a la destinatària la nova adreça.",
@@ -77,15 +77,15 @@
"gui_settings_autoupdate_check_button": "Comprova si hi ha una versió més nova",
"gui_settings_general_label": "Configuració general",
"gui_settings_sharing_label": "Configuració de compartir",
- "gui_settings_close_after_first_download_option": "Deixa de compartir després d'enviar arxius",
+ "gui_settings_close_after_first_download_option": "Deixa de compartir després d'enviar fitxers",
"gui_settings_connection_type_label": "Com hauria de connectar-se OnionShare a Tor?",
"gui_settings_connection_type_bundled_option": "Fes servir la versió de Tor inclosa dins d'OnionShare",
"gui_settings_connection_type_automatic_option": "Intenta la configuració automàtica amb el Navegador Tor",
"gui_settings_connection_type_control_port_option": "Connecta fent servir el port de control",
- "gui_settings_connection_type_socket_file_option": "Connecta fent servir un arxiu de socket",
+ "gui_settings_connection_type_socket_file_option": "Connecta fent servir un fitxer de socket",
"gui_settings_connection_type_test_button": "Comprova la connexió a Tor",
"gui_settings_control_port_label": "Port de control",
- "gui_settings_socket_file_label": "Arxiu de socket",
+ "gui_settings_socket_file_label": "Fitxer de socket",
"gui_settings_socks_label": "Port SOCKS",
"gui_settings_authenticate_label": "Configuració d'autenticació a Tor",
"gui_settings_authenticate_no_auth_option": "Sense autenticació o autenticació per cookies",
@@ -104,15 +104,15 @@
"gui_settings_button_save": "Desa",
"gui_settings_button_cancel": "Canceŀla",
"gui_settings_button_help": "Ajuda",
- "gui_settings_shutdown_timeout_checkbox": "Posa un temporitzador d'aturada",
- "gui_settings_shutdown_timeout": "Atura a:",
+ "gui_settings_autostop_timer_checkbox": "Utilitza un temporitzador d'aturada",
+ "gui_settings_autostop_timer": "Atura a:",
"settings_error_unknown": "No s'ha pogut connectar a Tor perquè la configuració és inconsistent.",
"settings_error_automatic": "No s'ha pogut connectar al controlador de Tor. Tens el navegador de Tor arrencat? (el pots descarregar a torproject.org)",
"settings_error_socket_port": "No s'ha pogut establir la connexió al controlador de Tor a {}:{}.",
"settings_error_socket_file": "No s'ha pogut connectar al controlador de Tor fent servir el fitxer de socket {}.",
"settings_error_auth": "S'ha establert la connexió a {}:{} però ha fallat l'autenticació. Pot ser que no sigui un controlador de Tor?",
"settings_error_missing_password": "S'ha establer la connexió al controlador de Tor, però necessita una contrasenya d'autenticació.",
- "settings_error_unreadable_cookie_file": "S'ha establert la connexió al controlador de Tor, però hi ha hagut un error de permisos. Pot ser que la contrasenya sigui errònia o que faltin permisos de lectura a l'arxiu de cookie.",
+ "settings_error_unreadable_cookie_file": "S'ha establert la connexió al controlador de Tor, però hi ha hagut un error de permisos. Pot ser que la contrasenya sigui errònia o que faltin permisos de lectura en el fitxer de galetes.",
"settings_error_bundled_tor_not_supported": "La versió de Tor inclosa a OnionShare no funciona en mode de desenvolupador a Windows ni MacOS.",
"settings_error_bundled_tor_timeout": "Està trigant molt la connexió. Assegura't que estàs connectat a internet i que tens en hora el rellotge del sistema.",
"settings_error_bundled_tor_broken": "OnionShare no s'ha pogut connectar a Tor en segon pla:\n{}",
@@ -131,13 +131,13 @@
"gui_tor_connection_error_settings": "Prova de canviar la configuració de com OnionShare es connecta a la xarxa Tor.",
"gui_tor_connection_canceled": "No s'ha pogut establir la connexió amb la xarxa Tor.\n\nAssegura't que tens connexió a internet, torna a obrir OnionShare i prepara la connexió a Tor.",
"gui_tor_connection_lost": "S'ha perdut la connexió amb Tor.",
- "gui_server_started_after_timeout": "El temporitzador ha acabat abans que s'iniciés el servidor.\nTorna a compartir-ho.",
- "gui_server_timeout_expired": "El temporitzador ja s'ha acabat.\nReinicia'l per a poder compartir.",
+ "gui_server_started_after_autostop_timer": "El temporitzador de finalització automàtica ha acabat abans que s'iniciés el servidor.\nTorna a compartir-ho.",
+ "gui_server_autostop_timer_expired": "El temporitzador de finalització automàtica ja s'ha acabat.\nReinicieu-lo per a poder compartir.",
"share_via_onionshare": "Comparteix-ho amb OnionShare",
"gui_use_legacy_v2_onions_checkbox": "Fes servir adreces amb un format antic",
"gui_save_private_key_checkbox": "Fes servir una adreça persistent",
- "gui_share_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>descarregar</b> arxius teus fent servir el <b>Navegador de Tor</b>: <img src='{}' />",
- "gui_receive_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>pujar</b> arxius al teu ordinador fent servir el <b>Navegador de Tor</b>: <img src='{}' />",
+ "gui_share_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>descarregar</b> fitxers teus fent servir el <b>Navegador de Tor</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Qualsevol persona</b> amb aquesta adreça d'OnionShare pot <b>pujar</b> fitxers al teu ordinador fent servir el <b>Navegador de Tor</b>: <img src='{}' />",
"gui_url_label_persistent": "Aquesta sessió no es tancarà.<br><br>Cada recurs compartit reutilitzarà aquesta mateixa adreça. Si vols crear una adreça diferent per a cada recurs, desactiva l'opció «Fes servir una adreça persistent».",
"gui_url_label_stay_open": "Aquesta recurs no es deixarà de compartir sol.",
"gui_url_label_onetime": "Aquest recurs deixarà de compartir-se després de la primera descàrrega.",
@@ -148,8 +148,8 @@
"gui_status_indicator_receive_stopped": "A punt per rebre",
"gui_status_indicator_receive_working": "S'està iniciant…",
"gui_status_indicator_receive_started": "S'està rebent",
- "gui_file_info": "{} arxius, {}",
- "gui_file_info_single": "{} arxiu, {}",
+ "gui_file_info": "{} fitxers, {}",
+ "gui_file_info_single": "{} fitxer, {}",
"history_in_progress_tooltip": "{} en procés",
"history_completed_tooltip": "{} completat/s",
"info_in_progress_uploads_tooltip": "",
@@ -157,11 +157,11 @@
"error_cannot_create_downloads_dir": "",
"receive_mode_downloads_dir": "",
"receive_mode_warning": "Alerta: El mode de rebuda permet a qualsevol de pujar arxius al teu ordinador. Algú amb males intencions podria pendre el control de la teva màquina si obrissis arxius maliciosos que haguessin pujat. Obre només arxius de persones que confiïs si no saps com evitar aquests riscos.",
- "gui_receive_mode_warning": "El mode de rebuda permet a qualsevol de pujar arxius al teu ordinador.<br><br><b>Algú amb males intencions podria pendre el control de la teva màquina si et pugessin i obrissis arxius maliciosos. Obre només arxius de persones que confiïs si no saps com evitar aquests riscos.</b>",
+ "gui_receive_mode_warning": "El mode de rebuda permet a qualsevol de pujar fitxers al teu ordinador.<br><br><b>Algú amb males intencions podria pendre el control de la teva màquina si et pugessin i obrissis arxius maliciosos. Obre només arxius de persones que confiïs si no saps com evitar aquests riscos.</b>",
"receive_mode_upload_starting": "S'està començant a rebre {}",
"receive_mode_received_file": "S'han rebut: {}",
"gui_mode_share_button": "Comparteix arxius",
- "gui_mode_receive_button": "Rep arxius",
+ "gui_mode_receive_button": "Rep fitxers",
"gui_settings_receiving_label": "Configuració de rebuda",
"gui_settings_downloads_label": "",
"gui_settings_downloads_button": "",
@@ -179,27 +179,27 @@
"gui_upload_finished_range": "",
"gui_upload_finished": "",
"gui_download_in_progress": "",
- "gui_open_folder_error_nautilus": "No s'ha pogut obrir la carpeta perquè el Nautilus no està disponible. L'arxiu està a: {}",
+ "gui_open_folder_error_nautilus": "No s'ha pogut obrir la carpeta perquè el Nautilus no és disponible. El fitxer és a: {}",
"gui_settings_language_label": "Llengua preferida",
"gui_settings_language_changed_notice": "Reobre OnionShare perquè el canvi de llengua tingui efecte.",
"timeout_upload_still_running": "S'està esperant que acabi la pujada",
- "gui_add_files": "Afegeix arxius",
+ "gui_add_files": "Afegeix fitxers",
"gui_add_folder": "Afegeix una carpeta",
"gui_settings_onion_label": "Servei ceba",
"gui_connect_to_tor_for_onion_settings": "Connecta't a Tor per configurar els serveis ocults",
"error_cannot_create_data_dir": "No s'ha pogut crear la carpeta de dades d'OnionShare: {}",
"receive_mode_data_dir": "Els arxius que rebis apareixeran aquí: {}",
- "gui_settings_data_dir_label": "Desa els arxius a",
+ "gui_settings_data_dir_label": "Desa els fitxers a",
"gui_settings_data_dir_browse_button": "Explora",
"systray_page_loaded_message": "L'adreça d'OnionShare s'ha carregat",
"systray_share_started_title": "S'ha començat a compartir",
- "systray_share_started_message": "S'està començant a enviar els arxius a algú",
+ "systray_share_started_message": "S'està començant a enviar els fitxers a algú",
"systray_share_completed_title": "S'ha acabat de compartir",
- "systray_share_completed_message": "Els arxius s'han acabat d'enviar",
+ "systray_share_completed_message": "Els fitxers s'han acabat d'enviar",
"systray_share_canceled_title": "S'ha deixat de compartir",
"systray_share_canceled_message": "Algú ha aturat la descàrrega que estava fent dels teus fitxers",
"systray_receive_started_title": "S'ha començat a rebre",
- "systray_receive_started_message": "Algú t'està enviant arxius",
+ "systray_receive_started_message": "Algú t'està enviant fitxers",
"gui_all_modes_history": "Historial",
"gui_all_modes_clear_history": "Esborra-ho tot",
"gui_all_modes_transfer_started": "Ha començat a {}",
@@ -211,7 +211,20 @@
"gui_all_modes_progress_starting": "{0:s}, %p% (s'està calculant)",
"gui_all_modes_progress_eta": "{0:s}, Temps aproximat: {1:s}, %p%",
"gui_share_mode_no_files": "Encara no s'han enviat fitxers",
- "gui_share_mode_timeout_waiting": "S'està acabant d'enviar",
- "gui_receive_mode_no_files": "Encara no s'ha rebut res",
- "gui_receive_mode_timeout_waiting": "S'està acabant de rebre"
+ "gui_share_mode_autostop_timer_waiting": "S'està esperant que finalitzi l'enviament",
+ "gui_receive_mode_no_files": "Encara no s'ha rebut cap fitxer",
+ "gui_receive_mode_autostop_timer_waiting": "S'està esperant que finalitzi la recepció",
+ "gui_stop_server_autostop_timer_tooltip": "El temporitzador d'aturada automàtica finalitza a les {}",
+ "gui_start_server_autostart_timer_tooltip": "El temporitzador d'inici automàtic finalitza a les {}",
+ "gui_waiting_to_start": "S'ha programat per iniciar en {}. Feu clic per cancel·lar.",
+ "gui_settings_autostart_timer_checkbox": "Usa un temporitzador d'inici automàtic",
+ "gui_settings_autostart_timer": "Inicia la compartició:",
+ "gui_server_autostart_timer_expired": "L'hora programada ja ha passat. Actualitzeu-la per a començar la compartició.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "L'hora d'aturada automàtica no pot ser igual ni anterior que l'hora d'inici automàtic. Modifique-ho per a començar la compartició.",
+ "gui_status_indicator_share_scheduled": "Programat…",
+ "gui_status_indicator_receive_scheduled": "Programat…",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "min",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/cs.json b/share/locale/cs.json
index 3eb03198..0bd1fdb0 100644
--- a/share/locale/cs.json
+++ b/share/locale/cs.json
@@ -11,7 +11,7 @@
"help_local_only": "Nepoužívat Tor: jen pro vývoj",
"help_stay_open": "Nechat běžet onion service po skončení stahování",
"help_stealth": "Create stealth onion service (advanced)",
- "help_debug": "Zaznamenat chyby na disk",
+ "help_verbose": "Zaznamenat chyby na disk",
"help_filename": "Seznam souborů a složek ke sdílení",
"gui_drag_and_drop": "Táhni a pusť\nsoubory sem",
"gui_add": "Přidat",
@@ -74,9 +74,9 @@
"systray_download_canceled_message": "Uživatel přerušil stahování souboru",
"systray_upload_started_title": "Začalo nahrávání pomocí OnionShare",
"systray_upload_started_message": "Někdo právě začal nahrávat soubory na váš počítač",
- "gui_share_stop_server_shutdown_timeout": "Zastavit sdílení ({}s zbývá)",
+ "gui_share_stop_server_autostop_timer": "Zastavit sdílení ({}s zbývá)",
"gui_receive_start_server": "Spustit mód přijímání",
"gui_receive_stop_server": "Zastavit přijímání",
- "gui_receive_stop_server_shutdown_timeout": "Zastavit mód přijímání ({}s zbývá)",
+ "gui_receive_stop_server_autostop_timer": "Zastavit mód přijímání ({} zbývá)",
"gui_copied_hidservauth_title": "Zkopírovaný HidServAuth token"
}
diff --git a/share/locale/da.json b/share/locale/da.json
index 39edcf22..b3a2234a 100644
--- a/share/locale/da.json
+++ b/share/locale/da.json
@@ -8,7 +8,7 @@
"not_a_readable_file": "{0:s} er ikke en læsbar fil.",
"no_available_port": "Kunne ikke finde en tilgængelig port til at starte onion-tjenesten",
"other_page_loaded": "Adresse indlæst",
- "close_on_timeout": "Stoppede fordi timer med autostop løb ud",
+ "close_on_autostop_timer": "Stoppede fordi timer med autostop løb ud",
"closing_automatically": "Stoppede fordi overførslen er færdig",
"timeout_download_still_running": "Venter på at download skal blive færdig",
"large_filesize": "Advarsel: Det kan tage timer at sende en stor deling",
@@ -21,12 +21,12 @@
"systray_download_canceled_message": "Brugeren annullerede downloaden",
"help_local_only": "Brug ikke Tor (kun til udvikling)",
"help_stay_open": "Fortsæt deling efter filerne er blevet sendt",
- "help_shutdown_timeout": "Stop deling efter et vist antal sekunder",
+ "help_autostop_timer": "Stop deling efter et vist antal sekunder",
"help_stealth": "Brug klientautentifikation (avanceret)",
- "help_debug": "Log OnionShare-fejl til stdout, og webfejl til disk",
+ "help_verbose": "Log OnionShare-fejl til stdout, og webfejl til disk",
"help_filename": "Liste over filer eller mapper som skal deles",
"help_config": "Tilpasset placering af JSON-konfigurationsfil (valgfri)",
- "gui_drag_and_drop": "Træk og slip filer og mapper her\nfor at starte deling",
+ "gui_drag_and_drop": "Træk og slip filer og mapper her\nfor at begynde at dele",
"gui_add": "Tilføj",
"gui_delete": "Slet",
"gui_choose_items": "Vælg",
@@ -38,7 +38,7 @@
"gui_canceled": "Annulleret",
"gui_copied_url": "OnionShare-adressen blev kopieret til udklipsholderen",
"gui_copied_hidservauth": "HidServAuth-linjen blev kopieret til udklipsholderen",
- "gui_please_wait": "Starter... klik for at annullere.",
+ "gui_please_wait": "Starter ... klik for at annullere.",
"gui_download_upload_progress_complete": ".",
"gui_download_upload_progress_starting": "{0:s}, %p% (udregner anslået ankomsttid)",
"gui_download_upload_progress_eta": "{0:s}, ETA: {1:s}, %p%",
@@ -46,7 +46,7 @@
"gui_share_quit_warning": "Du er ved at afsende filer. Er du sikker på, at du vil afslutte OnionShare?",
"gui_quit_warning_quit": "Afslut",
"gui_quit_warning_dont_quit": "Annuller",
- "error_rate_limit": "Nogen har foretaget for mange forkerte forsøg på din adresse, hvilket kan betyde at de prøver at gætte det, så OnionShare har stoppet serveren. Start deling igen og send en ny adresse til modtageren for at dele.",
+ "error_rate_limit": "Nogen har foretaget for mange forkerte forsøg på din adresse, hvilket kan betyde at de prøver at gætte det, så OnionShare har stoppet serveren. Begynd at dele igen og send en ny adresse til modtageren for at dele.",
"zip_progress_bar_format": "Komprimerer: %p%",
"error_stealth_not_supported": "For at bruge klientautentifikation skal du have mindst Tor 0.2.9.1-alpha (eller Tor Browser 6.5) og python3-stem 1.5.0.",
"error_ephemeral_not_supported": "OnionShare kræver mindst både Tor 0.2.7.1 og python3-stem 1.4.0.",
@@ -83,7 +83,7 @@
"gui_settings_button_save": "Gem",
"gui_settings_button_cancel": "Annuller",
"gui_settings_button_help": "Hjælp",
- "gui_settings_shutdown_timeout": "Stop delingen ved:",
+ "gui_settings_autostop_timer": "Stop delingen ved:",
"settings_saved": "Indstillinger gemt til {}",
"settings_error_unknown": "Kan ikke oprette forbindelse til Tor-kontroller da dine indstillingerne ikke giver mening.",
"settings_error_automatic": "Kunne ikke oprette forbindelse til Tor-kontrolleren. Kører Tor Browser (tilgængelige fra torproject.org) i baggrunden?",
@@ -99,7 +99,7 @@
"error_tor_protocol_error": "Der opstod en fejl med Tor: {}",
"connecting_to_tor": "Opretter forbindelse til Tor-netværket",
"update_available": "Der findes en ny OnionShare. <a href='{}'>Klik her</a> for at hente den.<br><br>Du bruger {} og den seneste er {}.",
- "update_error_check_error": "Kunne ikke søge efter nye versioner: OnionShare-webstedet siger at den seneste version er den ugenkendte '{}'…",
+ "update_error_check_error": "Kunne ikke søge efter nye versioner: OnionShare-webstedet siger at den seneste version er den ugenkendte '{}' …",
"update_error_invalid_latest_version": "Kunne ikke søge efter ny version: Måske har du ikke forbindelse til Tor, eller er OnionShare-webstedet nede?",
"update_not_available": "Du kører den seneste OnionShare.",
"gui_tor_connection_ask": "Åbn indstillingerne for at rette forbindelsen til Tor?",
@@ -108,8 +108,8 @@
"gui_tor_connection_error_settings": "Prøv at ændre måden hvorpå OnionShare opretter forbindelse til Tor-netværket, i indstillingerne.",
"gui_tor_connection_canceled": "Kunne ikke oprette forbindelse til Tor.\n\nSørg for at du har forbindelse til internettet, og åbn herefter OnionShare igen for at opsætte dens forbindelse til Tor.",
"gui_tor_connection_lost": "Der er ikke oprettet forbindelse til Tor.",
- "gui_server_started_after_timeout": "Timeren med autostop løb ud inden serveren startede.\nOpret venligst en ny deling.",
- "gui_server_timeout_expired": "Timeren med autostop er allerede løbet ud.\nOpdater den venligst for at starte deling.",
+ "gui_server_started_after_autostop_timer": "Timeren med autostop løb ud inden serveren startede. Opret venligst en ny deling.",
+ "gui_server_autostop_timer_expired": "Timeren med autostop er allerede løbet ud. Opdater den venligst for at begynde at dele.",
"share_via_onionshare": "Del via OnionShare",
"gui_save_private_key_checkbox": "Brug en vedvarende adresse",
"gui_copied_url_title": "Kopierede OnionShare-adresse",
@@ -117,7 +117,7 @@
"gui_quit_title": "Klap lige hesten",
"gui_settings_tor_bridges_meek_lite_azure_radio_option": "Brug indbyggede meek_lite (Azure) udskiftelige transporter",
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Brug indbyggede meek_lite (Azure) udskiftelige transporter (kræver obfs4proxy)",
- "gui_settings_shutdown_timeout_checkbox": "Brug timer med autostop",
+ "gui_settings_autostop_timer_checkbox": "Brug timer med autostop",
"gui_url_label_persistent": "Delingen stopper ikke automatisk.<br><br>Hver efterfølgende deling bruger den samme adresse igen (hvis du vil bruge engangsadresser, så deaktivér \"Brug vedvarende adresse\", i indstillingerne).",
"gui_url_label_stay_open": "Delingen stopper ikke automatisk.",
"gui_url_label_onetime": "Delingen stopper efter den første download.",
@@ -131,26 +131,26 @@
"systray_upload_started_title": "OnionShare-upload begyndte",
"systray_upload_started_message": "En bruger begyndte at uploade filer til din computer",
"help_receive": "Modtager aktier i stedet for at sende dem",
- "gui_share_stop_server_shutdown_timeout": "Stop deling ({}s tilbage)",
+ "gui_share_stop_server_autostop_timer": "Stop deling ({})",
"gui_receive_quit_warning": "Du er i færd med at modtage filer. Er du sikker på du ønsker at stoppe med at OnionShare?",
- "gui_settings_whats_this": "<a href='{0:s}'>Hvad er dette?</a>",
+ "gui_settings_whats_this": "<a href='{0:s}'>Hvad er det?</a>",
"gui_settings_general_label": "Generel opsætning",
"gui_upload_in_progress": "Upload begyndte {}",
"gui_download_in_progress": "Download begyndte {}",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Timer med autostop slutter ved {}",
+ "gui_share_stop_server_autostop_timer_tooltip": "Timer med autostop slutter ved {}",
"gui_receive_start_server": "Start modtagetilstand",
"gui_receive_stop_server": "Stop modtagetilstand",
- "gui_receive_stop_server_shutdown_timeout": "Stop modtagetilstand ({}s tilbage)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Timer med autostop slutter ved {}",
+ "gui_receive_stop_server_autostop_timer": "Stop modtagetilstand ({} tilbage)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Timer med autostop slutter ved {}",
"gui_no_downloads": "Ingen downloads endnu",
"error_tor_protocol_error_unknown": "Der opstod en ukendt fejl med Tor",
"error_invalid_private_key": "Den private nøgletype understøttes ikke",
"gui_use_legacy_v2_onions_checkbox": "Brug forældede adresser",
"gui_status_indicator_share_stopped": "Klar til at dele",
- "gui_status_indicator_share_working": "Starter…",
+ "gui_status_indicator_share_working": "Starter …",
"gui_status_indicator_share_started": "Deler",
"gui_status_indicator_receive_stopped": "Klar til at modtage",
- "gui_status_indicator_receive_working": "Starter…",
+ "gui_status_indicator_receive_working": "Starter …",
"gui_status_indicator_receive_started": "Modtager",
"receive_mode_received_file": "Modtaget: {}",
"gui_mode_share_button": "Del filer",
@@ -195,7 +195,7 @@
"gui_settings_data_dir_browse_button": "Gennemse",
"systray_page_loaded_message": "OnionShare-adresse indlæst",
"systray_share_started_title": "Deling startet",
- "systray_share_started_message": "Start på at sende filer til nogen",
+ "systray_share_started_message": "Starter på at sende filer til nogen",
"systray_share_completed_title": "Deling er færdig",
"systray_share_completed_message": "Færdig med at sende filer",
"systray_share_canceled_title": "Deling annulleret",
@@ -211,10 +211,23 @@
"gui_all_modes_progress_starting": "{0:s}, %p% (udregner)",
"gui_all_modes_progress_eta": "{0:s}, anslået ankomsttidspunkt: {1:s}, %p%",
"gui_share_mode_no_files": "Der er endnu ikke sendt nogen filer",
- "gui_share_mode_timeout_waiting": "Venter på at blive færdig med at sende",
+ "gui_share_mode_autostop_timer_waiting": "Venter på at blive færdig med at sende",
"gui_receive_mode_no_files": "Der er endnu ikke modtaget nogen filer",
- "gui_receive_mode_timeout_waiting": "Venter på at blive færdig med at modtage",
+ "gui_receive_mode_autostop_timer_waiting": "Venter på at blive færdig med at modtage",
"gui_all_modes_transfer_canceled_range": "Annullerede {} - {}",
"gui_all_modes_transfer_canceled": "Annullerede {}",
- "gui_settings_onion_label": "Onion-indstillinger"
+ "gui_settings_onion_label": "Onion-indstillinger",
+ "gui_stop_server_autostop_timer_tooltip": "Timer med autostop slutter {}",
+ "gui_start_server_autostart_timer_tooltip": "Timer med autostart slutter {}",
+ "gui_waiting_to_start": "Planlagt til at starte om {}. Klik for at annullere.",
+ "gui_settings_autostart_timer_checkbox": "Brug timer med autostart",
+ "gui_settings_autostart_timer": "Start deling ved:",
+ "gui_server_autostart_timer_expired": "Det planlagte tidspunkt er allerede passeret. Opdater det venligst for at begynde at dele.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Timeren med autostop må ikke være det samme eller tidligere end timeren med autostart. Opdater den venligst for at begynde at dele.",
+ "gui_status_indicator_share_scheduled": "Planlagt …",
+ "gui_status_indicator_receive_scheduled": "Planlagt …",
+ "days_first_letter": "d",
+ "hours_first_letter": "t",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/de.json b/share/locale/de.json
index 20ad9fe4..44839231 100644
--- a/share/locale/de.json
+++ b/share/locale/de.json
@@ -4,22 +4,22 @@
"ctrlc_to_stop": "Drücke Strg+C um den Server anzuhalten",
"not_a_file": "{0:s} ist keine gültige Datei.",
"other_page_loaded": "URL geladen",
- "closing_automatically": "Gestoppt, da der Download erfolgreich beendet wurde",
- "large_filesize": "Warnung: Das Hochladen von großen Dateien kann Stunden dauern",
+ "closing_automatically": "Gestoppt, da die Übertragung erfolgreich beendet wurde",
+ "large_filesize": "Warnung: Das Hochladen von großen Dateien kann sehr lange dauern",
"help_local_only": "Tor nicht verwenden (nur für Entwicklung)",
- "help_stay_open": "Den OnionService nicht anhalten nachdem ein Download beendet wurde",
- "help_debug": "Schreibe Fehler von OnionShare nach stdout und Webfehler auf die Festplatte",
+ "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",
"help_filename": "Liste der zu teilenden Dateien oder Ordner",
- "gui_drag_and_drop": "Dateien und Ordner hierher ziehen\num sie zu teilen",
+ "gui_drag_and_drop": "Dateien und Ordner hierher ziehen,\num sie zu teilen",
"gui_add": "Hinzufügen",
"gui_delete": "Löschen",
"gui_choose_items": "Auswählen",
- "gui_share_start_server": "Server starten",
- "gui_share_stop_server": "Server anhalten",
- "gui_copy_url": "URL kopieren",
+ "gui_share_start_server": "Teilen beginnen",
+ "gui_share_stop_server": "Teilen beenden",
+ "gui_copy_url": "Adresse kopieren",
"gui_downloads": "Bisherige Downloads",
- "gui_copied_url": "URL wurde in die Zwischenablage kopiert",
- "gui_please_wait": "Starte... Klicken zum Abbrechen.",
+ "gui_copied_url": "OnionShare-Adresse wurde in die Zwischenablage kopiert",
+ "gui_please_wait": "Startet … Klicken zum Abbrechen.",
"timeout_download_still_running": "Warte auf Beendigung des Downloads",
"systray_menu_exit": "Beenden",
"gui_settings_authenticate_password_option": "Passwort",
@@ -27,7 +27,7 @@
"gui_settings_button_save": "Speichern",
"gui_settings_button_cancel": "Abbrechen",
"gui_settings_button_help": "Hilfe",
- "gui_settings_shutdown_timeout": "Stoppe den Server bei:",
+ "gui_settings_autostop_timer": "Teilen stoppen bei:",
"systray_download_started_title": "OnionShare Download begonnen",
"systray_download_started_message": "Ein Nutzer hat begonnen, deine Dateien herunterzuladen",
"systray_download_completed_title": "OnionShare Download beendet",
@@ -39,48 +39,48 @@
"gui_copied_hidservauth_title": "HidServAuth kopiert",
"gui_quit_warning_quit": "Beenden",
"gui_quit_warning_dont_quit": "Abbrechen",
- "gui_settings_window_title": "Eintellungen",
+ "gui_settings_window_title": "Einstellungen",
"gui_settings_autoupdate_timestamp": "Letzte Überprüfung: {}",
"gui_settings_autoupdate_timestamp_never": "Niemals",
- "gui_settings_close_after_first_download_option": "Server nach dem ersten Download stoppen",
+ "gui_settings_close_after_first_download_option": "Server nach Download der Dateien stoppen",
"gui_settings_connection_type_label": "Wie soll sich OnionShare mit Tor verbinden?",
"config_onion_service": "Richte den Onionservice auf Port {0:d} ein.",
"give_this_url_stealth": "Gib dem Empfänger diese URL und die HidServAuth-Zeile:",
"give_this_url_receive": "Gib diese URL dem Sender:",
"give_this_url_receive_stealth": "Gib diese URL und die HidServAuth-Zeile an den Sender:",
- "not_a_readable_file": "{0:s} kann nicht gelesen werden.",
- "no_available_port": "Es konnte kein freier Port gefunden werden, um den Onionservice zu starten",
- "close_on_timeout": "Angehalten da der auto-stop Timer abgelaufen ist",
+ "not_a_readable_file": "{0:s} ist eine schreibgeschützte Datei.",
+ "no_available_port": "Es konnte kein freier Port gefunden werden, um den Verteilservice zu starten",
+ "close_on_autostop_timer": "Angehalten da der Stoptimer abgelaufen ist",
"systray_upload_started_title": "OnionShare Upload wurde gestartet",
"systray_upload_started_message": "Ein Benutzer hat begonnen, Dateien auf deinen Computer hochzuladen",
- "help_shutdown_timeout": "Den Server nach einer bestimmten Zeit anhalten (in Sekunden)",
+ "help_autostop_timer": "Den Server nach einer bestimmten Zeit anhalten (in Sekunden)",
"help_receive": "Empfange Dateien anstatt sie zu senden",
- "gui_share_stop_server_shutdown_timeout": "Server stoppen (läuft noch {} Sekunden)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Zeit läuft in {} Sekunden ab",
+ "gui_share_stop_server_autostop_timer": "Teilen beenden ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Zeit läuft in {} Sekunden ab",
"gui_settings_connection_type_control_port_option": "Verbinde über den control port",
"gui_settings_connection_type_socket_file_option": "Verbinde über ein socket file",
"gui_settings_control_port_label": "Control port",
"gui_settings_socket_file_label": "Socket file",
"gui_settings_socks_label": "SOCKS Port",
"gui_settings_authenticate_no_auth_option": "Keine Authentifizierung, oder Authentifizierung per cookie",
- "gui_settings_tor_bridges_no_bridges_radio_option": "Benutze keine bridges",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Keine Bridges benutzen",
"gui_settings_tor_bridges_obfs4_radio_option": "Benutze eingebaute obfs4 pluggable transports",
"gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Benutze eingebaute obfs4 pluggable transports (benötigt obfs4proxy)",
"gui_settings_tor_bridges_meek_lite_azure_radio_option": "Benutze eingebaute meek_lite (Amazon) pluggable transports",
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Benutze eingebaute meek_lite (Azure) pluggable transports (benötigt obfs4proxy)",
"gui_settings_tor_bridges_custom_radio_option": "Benutze benutzerdefinierte bridges",
"gui_settings_tor_bridges_custom_label": "Bridges findest du unter <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
- "gui_settings_shutdown_timeout_checkbox": "Stoppe nach einer bestimmten Zeit",
+ "gui_settings_autostop_timer_checkbox": "Automatische Stoppuhr verwenden",
"settings_error_auth": "Mit {}:{} verbinden aber nicht authentifiziert. Eventuell handelt es sich nicht um einen Tor controller?",
"settings_error_missing_password": "Mit dem Tor controller verbunden, aber er benötigt ein Passwort zur Authentifizierung.",
"connecting_to_tor": "Verbinde mit dem Tornetzwerk",
"gui_tor_connection_ask_quit": "Beenden",
"gui_tor_connection_lost": "Verbindung zu Tor getrennt.",
"help_stealth": "Nutze Klientauthorisierung (fortgeschritten)",
- "gui_receive_start_server": "Starte den Empfangsmodus",
- "gui_receive_stop_server": "Stoppe den Empfangsmodus",
- "gui_receive_stop_server_shutdown_timeout": "Stoppe den Empfängermodus (stoppt automatisch in {} Sekunden)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Zeit läuft in {} ab",
+ "gui_receive_start_server": "Empfangsmodus starten",
+ "gui_receive_stop_server": "Empfangsmodus stoppen",
+ "gui_receive_stop_server_autostop_timer": "Empfängermodus stoppen (stoppt automatisch in {} Sekunden)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Zeit läuft in {} ab",
"gui_no_downloads": "Bisher keine Downloads",
"gui_copied_url_title": "OnionShare-Adresse kopiert",
"gui_copied_hidservauth": "HidServAuth-Zeile in die Zwischenablage kopiert",
@@ -93,18 +93,18 @@
"gui_receive_quit_warning": "Du empfängst gerade Dateien. Bist du sicher, dass du OnionShare beenden willst?",
"error_rate_limit": "Jemand hat deine Adresse zu oft falsch eingegeben, das heißt, jemand könnte versuchen, sie zu erraten. Deswegen hat OnionShare den Server gestoppt. Starte den Server erneut und schicke dem Empfänger die neue Adresse, um die Dateien zu versenden.",
"zip_progress_bar_format": "Komprimierung: %p%",
- "error_stealth_not_supported": "Um die Klientauthorisierung zu nutzen, benötigst du mindestens Tor 0.2.9.1-alpha (oder Tor Browser 6.5) und python3-stem 1.5.0.",
+ "error_stealth_not_supported": "Um die Clientauthorisierung zu nutzen, benötigst du mindestens Tor 0.2.9.1-alpha (oder Tor Browser 6.5) und python3-stem 1.5.0.",
"error_ephemeral_not_supported": "OnionShare benötigt mindestens Tor 0.2.7.1 als auch python3-stem 1.4.0.",
"gui_settings_whats_this": "<a href='{0:s}'>Was ist das?</a>",
- "gui_settings_stealth_option": "Nutze Klientauthorisierung",
- "gui_settings_autoupdate_label": "Suche nach einer neueren Version",
- "gui_settings_autoupdate_option": "Benachrichtige mich, wenn eine neuere Version verfügbar ist",
- "gui_settings_autoupdate_check_button": "Suche nach neuerer Version",
+ "gui_settings_stealth_option": "Clientauthorisierung benutzen",
+ "gui_settings_autoupdate_label": "Suche nach neuer Version",
+ "gui_settings_autoupdate_option": "Benachrichtige mich, wenn eine neue Version verfügbar ist",
+ "gui_settings_autoupdate_check_button": "Suche nach neuer Version",
"gui_settings_general_label": "Allgemeine Einstellungen",
"gui_settings_sharing_label": "Freigabe-Einstellungen",
"gui_settings_connection_type_automatic_option": "Versuche Autokonfiguration mittels Tor Browser",
- "gui_settings_connection_type_test_button": "Teste Verbindung zum Tornetzwerk",
- "gui_settings_authenticate_label": "Autentifizierungseinstellungen für Tor",
+ "gui_settings_connection_type_test_button": "Verbindung zu Tor testen",
+ "gui_settings_authenticate_label": "Authentifizierungseinstellungen für Tor",
"gui_settings_tor_bridges": "Unterstützung für Tor Bridges",
"gui_settings_meek_lite_expensive_warning": "Achtung: Die meek_lite bridges sind für das Tor Projekt sehr kostspielig.<br><br> Nutze sie nur, wenn du dich nicht direkt, per obfs4 Transport oder über andere, normale bridges zum Tornetzwerk verbinden kannst.",
"gui_settings_tor_bridges_invalid": "Keine der bridges, die du angegeben hast, funktionieren.\nÜberprüfe sie oder gebe Andere an.",
@@ -112,7 +112,7 @@
"settings_error_automatic": "Kann nicht zum Tor controller verbinden. Läuft der Tor Browser (zum Download unter torproject.org) im Hintergrund?",
"settings_error_socket_port": "Kann unter {}:{} nicht zum Tor controller verbinden.",
"settings_error_unreadable_cookie_file": "Verbindung zum Tor controller hergestellt, aber dein Passwort ist falsch oder dein Nutzer darf die Cookiedatei nicht lesen.",
- "settings_error_bundled_tor_not_supported": "Im Entwicklermodus auf Windows oder macOS kannst du die Torversion, die mit OnionShare geliefert wird, nicht nutzen.",
+ "settings_error_bundled_tor_not_supported": "Im Entwicklermodus auf Windows oder macOS kannst du nicht die Tor-Version nutzen, die mit OnionShare geliefert wird.",
"settings_error_bundled_tor_timeout": "Die Verbindung zum Tornetzwerk braucht zu lang. Bist du vielleicht nicht mit dem Internet verbunden oder geht die Uhr auf deinem System falsch?",
"settings_error_bundled_tor_broken": "OnionShare konnte im Hintergrund nicht mit Tor verbinden:\n{}",
"settings_test_success": "Verbunden mit dem Tor controller.\n\nTor-Version: {}\nUnterstützt vorübergehende onion services: {}.\nUnterstützt Client-Authorisierung: {}.\nUnterstützt .onion-Adressen der nächsten Generation: {}.",
@@ -172,10 +172,10 @@
"help_config": "Ort deiner eigenen JSON Konfigurationsdatei (optional)",
"timeout_upload_still_running": "Warte bis Upload vollständig ist",
"gui_settings_stealth_hidservauth_string": "Da dein privater Schlüssel jetzt gespeichert wurde um ihn später erneut zu nutzen, kannst du jetzt\nklicken um deinen HidServAuth zu kopieren.",
- "gui_settings_connection_type_bundled_option": "Die integrierte Tor version von OnionShare nutzen",
+ "gui_settings_connection_type_bundled_option": "Die integrierte Tor-Version von OnionShare nutzen",
"settings_error_socket_file": "Kann nicht mittels des Tor Controller Socket {} verbinden.",
- "gui_server_started_after_timeout": "Die Zeit ist abgelaufen bevor der Server gestartet werden konnte.\nBitte erneut etwas teilen.",
- "gui_server_timeout_expired": "Der Timer ist bereits abgelaufen.\nBearbeite diesen um das Teilen zu starten.",
+ "gui_server_started_after_autostop_timer": "Die Zeit ist abgelaufen bevor der Server gestartet werden konnte.\nBitte starte einen erneuten Teilvorgang.",
+ "gui_server_autostop_timer_expired": "Der Stoptimer ist bereits abgelaufen.\nBitte bearbeite diesen um das Teilen zu starten.",
"gui_status_indicator_share_stopped": "Bereit zum teilen",
"history_in_progress_tooltip": "{} läuft",
"receive_mode_upload_starting": "Hochladen von insgesamt {} beginnt",
@@ -197,5 +197,34 @@
"systray_share_completed_title": "Freigabe erfolgt",
"systray_share_completed_message": "Dateien erfolgreich versandt",
"systray_share_canceled_title": "Freigabe abgebrochen",
- "systray_share_canceled_message": "Jemand hat den Download deiner Dateien abgebrochen"
+ "systray_share_canceled_message": "Jemand hat den Download deiner Dateien abgebrochen",
+ "systray_receive_started_title": "Empfange",
+ "systray_receive_started_message": "Jemand sendet dir Dateien",
+ "gui_all_modes_history": "Verlauf",
+ "gui_all_modes_clear_history": "Alle löschen",
+ "gui_all_modes_transfer_started": "{} gestartet",
+ "gui_all_modes_transfer_finished_range": "{} - {} übertragen",
+ "gui_all_modes_transfer_finished": "{} übertragen",
+ "gui_all_modes_transfer_canceled_range": "{} - {} abgebrochen",
+ "gui_all_modes_transfer_canceled": "{} abgebrochen",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (berechne)",
+ "gui_share_mode_no_files": "Bisher keine Dateien versendet",
+ "gui_share_mode_autostop_timer_waiting": "Warte auf Abschluss des Sendens",
+ "gui_receive_mode_no_files": "Bisher keine Dateien empfangen",
+ "gui_receive_mode_autostop_timer_waiting": "Warte auf Abschluss des Empfangs",
+ "gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "gui_all_modes_progress_complete": "%p%, {0:s} vergangen.",
+ "gui_settings_autostart_timer_checkbox": "Automatische Startuhr verwenden",
+ "gui_settings_autostart_timer": "Teilen starten bei:",
+ "gui_waiting_to_start": "Geplant in {} zu starten. Klicken zum Abbrechen.",
+ "gui_stop_server_autostop_timer_tooltip": "Stoptimer endet um {}",
+ "gui_start_server_autostart_timer_tooltip": "Starttimer endet um {}",
+ "gui_server_autostart_timer_expired": "Die geplante Zeit ist bereits vergangen. Bitte aktualisieren um das Teilen zu starten.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Die Stopzeit kann nicht gleich oder früher als die Startzeit sein. Bitte aktutalisieren um das Teilen zu starten.",
+ "gui_status_indicator_share_scheduled": "Geplant…",
+ "gui_status_indicator_receive_scheduled": "Geplant…",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/el.json b/share/locale/el.json
index 4157c592..00a063c9 100644
--- a/share/locale/el.json
+++ b/share/locale/el.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "Το {0:s} δεν είναι αναγνώσιμο αρχείο.",
"no_available_port": "Δεν βρέθηκε διαθέσιμη θύρα για να ξεκινήσει η υπηρεσία onion",
"other_page_loaded": "Η διεύθυνση φορτώθηκε",
- "close_on_timeout": "Τερματίστηκε γιατί το χρονόμετρο τερματισμού έφτασε στο τέλος",
+ "close_on_autostop_timer": "Διακόπηκε διότι το χρονόμετρο αυτόματης διακοπής έφτασε στο τέλος",
"closing_automatically": "Τερματίστηκε επειδή η λήψη ολοκληρώθηκε",
"timeout_download_still_running": "Αναμονή ολοκλήρωσης της λήψης",
"large_filesize": "Προειδοποίηση: Η αποστολή μεγάλου όγκου δεδομένων μπορεί να διαρκέσει ώρες",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "Ένας/μια χρήστης/τρια ξεκίνησε να ανεβάζει αρχεία στον υπολογιστή σου",
"help_local_only": "Να μην χρησιμοποιηθεί το Tor (μόνο για development)",
"help_stay_open": "Να συνεχίσει ο διαμοιρασμός μετά την αποστολή των αρχείων",
- "help_shutdown_timeout": "Να τερματιστεί ο διαμοιρασμός μετά από ένα συγκεκριμένο αριθμό δευτερολέπτων",
+ "help_autostop_timer": "Να τερματιστεί ο διαμοιρασμός μετά από ένα συγκεκριμένο αριθμό δευτερολέπτων",
"help_stealth": "Κάντε χρήση εξουσιοδότησης πελάτη (Για προχωρημένους)",
"help_receive": "Λάβετε διαμοιρασμένα αρχεία αντι να τα στέλνετε",
- "help_debug": "Κατέγραψε τα σφάλματα του OnionShare στο stdout (συνήθως οθόνη) και τα σφάλματα web στον δίσκο",
+ "help_verbose": "Κατέγραψε τα σφάλματα του OnionShare στο stdout (συνήθως οθόνη) και τα σφάλματα web στον δίσκο",
"help_filename": "Λίστα αρχείων ή φακέλων για μοίρασμα",
"help_config": "Ορίστε σημείο αποθήκευσης αρχείου JSON",
"gui_drag_and_drop": "Σύρτε και αφήστε αρχεία και φακέλους\nγια να αρχίσετε να τα μοιράζεστε",
@@ -37,12 +37,12 @@
"gui_choose_items": "Επιλογή",
"gui_share_start_server": "Εκκίνηση μοιράσματος",
"gui_share_stop_server": "Τερματισμός μοιράσματος",
- "gui_share_stop_server_shutdown_timeout": "Τερματισμός μοιράσματος (απομένουν {}\")",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Το χρονόμετρο αυτόματου τερματισμού τελειώνει σε {}",
+ "gui_share_stop_server_autostop_timer": "Διακοπή μοιράσματος (απομένουν {}\")",
+ "gui_share_stop_server_autostop_timer_tooltip": "Το χρονόμετρο αυτόματου τερματισμού τελειώνει σε {}",
"gui_receive_start_server": "Εκκίνηση κατάστασης λήψης",
"gui_receive_stop_server": "Τερματισμός κατάστασης λήψης",
- "gui_receive_stop_server_shutdown_timeout": "Τερματισμός κατάστασης λήψης (υπολοίπονται {}\")",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Το χρονόμετρο αυτόματου τερματισμού τελειώνει σε {}",
+ "gui_receive_stop_server_autostop_timer": "Διακοπή Λειτουργίας Λήψης (υπολοίπονται {}\")",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Το χρονόμετρο αυτόματου τερματισμού τελειώνει σε {}",
"gui_copy_url": "Αντιγραφή διεύθυνσης",
"gui_copy_hidservauth": "Αντιγραφή HidServAuth",
"gui_downloads": "Ιστορικό Λήψεων",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "Αποθήκευση",
"gui_settings_button_cancel": "Ακύρωση",
"gui_settings_button_help": "Βοήθεια",
- "gui_settings_shutdown_timeout_checkbox": "Χρήση χρονομέτρου αυτόματου τερματισμού",
- "gui_settings_shutdown_timeout": "Τερματισμός της κοινοποίησης στα:",
+ "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 στις {}:{}.",
@@ -131,8 +131,8 @@
"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_timeout": "Η λειτουργία auto-stop τερματίστηκε πριν την εκκίνηση διακομιστή.\nΠαρακαλώ κάντε εναν νέο διαμοιρασμό.",
- "gui_server_timeout_expired": "Η λειτουργία auto-stop ήδη τερματίστηκε.\nΕνημερώστε την για να ξεκινήσετε τον διαμοιρασμό.",
+ "gui_server_started_after_autostop_timer": "Το χρονόμετρο αυτόματης διακοπής τελείωσε πριν την εκκίνηση του server.\nΠαρακαλείστε να κάνετε εναν νέο διαμοιρασμό.",
+ "gui_server_autostop_timer_expired": "Το χρονόμετρο αυτόματης διακοπής έχει ήδη τελειώσει.\nΠαρακαλείστε να το ανανεώσετε για να ξεκινήσετε τον διαμοιρασμό.",
"share_via_onionshare": "Κάντε το OnionShare",
"gui_use_legacy_v2_onions_checkbox": "Χρηση \"παραδοσιακών\" διευθύνσεων",
"gui_save_private_key_checkbox": "Χρήση μόνιμης διεύθυνσης",
@@ -208,10 +208,23 @@
"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_timeout_waiting": "Αναμένοντας την ολοκλήρωση αποστολής",
+ "gui_share_mode_autostop_timer_waiting": "Αναμένοντας την ολοκλήρωση της αποστολής",
"gui_receive_mode_no_files": "Δεν Εγινε Καμμία Λήψη Αρχείων Ακόμα",
- "gui_receive_mode_timeout_waiting": "Αναμένοντας την ολοκλήρωση της λήψης",
+ "gui_receive_mode_autostop_timer_waiting": "Αναμένοντας την ολοκλήρωση της λήψης",
"gui_settings_onion_label": "Ρυθμίσεις Onion",
"gui_all_modes_transfer_canceled_range": "Ακυρώθηκε {} - {}",
- "gui_all_modes_transfer_canceled": "Ακυρώθηκε {}"
+ "gui_all_modes_transfer_canceled": "Ακυρώθηκε {}",
+ "gui_stop_server_autostop_timer_tooltip": "Το χρονόμετρο αυτόματης διακοπής λήγει σε {}",
+ "gui_start_server_autostart_timer_tooltip": "Το χρονόμετρο αυτόματης έναρξης λήγει σε {}",
+ "gui_waiting_to_start": "Προγραμματισμένο να ξεκινήσει σε {}. Πατήστε για ακύρωση.",
+ "gui_settings_autostart_timer_checkbox": "Χρήση χρονομέτρου αυτόματης έναρξης",
+ "gui_settings_autostart_timer": "Εκκίνηση μοιράσματος σε:",
+ "gui_server_autostart_timer_expired": "Η προγραμματισμένη ώρα έχει ήδη παρέλθει.\nΠαρακαλείστε να την ανανεώσετε για να ξεκινήσετε τον διαμοιρασμό.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Η ώρα αυτόματης διακοπής δεν μπορεί να είναι ίδια ή νωρίτερα από την ώρα αυτόματης έναρξης.Παρακαλείστε να την ανανεώσετε για να ξεκινήσετε τον διαμοιρασμό.",
+ "gui_status_indicator_share_scheduled": "Προγραμματισμένο…",
+ "gui_status_indicator_receive_scheduled": "Προγραμματισμένο…",
+ "days_first_letter": "μ",
+ "hours_first_letter": "ω",
+ "minutes_first_letter": "λ",
+ "seconds_first_letter": "δ"
}
diff --git a/share/locale/en.json b/share/locale/en.json
index f7af9a80..40e3a1d4 100644
--- a/share/locale/en.json
+++ b/share/locale/en.json
@@ -1,26 +1,11 @@
{
- "config_onion_service": "Setting up onion service on port {0:d}.",
"preparing_files": "Compressing files.",
- "give_this_url": "Give this address to the recipient:",
- "give_this_url_stealth": "Give this address and HidServAuth line to the recipient:",
- "give_this_url_receive": "Give this address to the sender:",
- "give_this_url_receive_stealth": "Give this address and HidServAuth to the sender:",
- "ctrlc_to_stop": "Press Ctrl+C to stop the server",
- "not_a_file": "{0:s} is not a valid file.",
"not_a_readable_file": "{0:s} is not a readable file.",
"no_available_port": "Could not find an available port to start the onion service",
"other_page_loaded": "Address loaded",
- "close_on_timeout": "Stopped because auto-stop timer ran out",
+ "close_on_autostop_timer": "Stopped because auto-stop timer ran out",
"closing_automatically": "Stopped because transfer is complete",
"large_filesize": "Warning: Sending a large share could take hours",
- "help_local_only": "Don't use Tor (only for development)",
- "help_stay_open": "Continue sharing after files have been sent",
- "help_shutdown_timeout": "Stop sharing after a given amount of seconds",
- "help_stealth": "Use client authorization (advanced)",
- "help_receive": "Receive shares instead of sending them",
- "help_debug": "Log OnionShare errors to stdout, and web errors to disk",
- "help_filename": "List of files or folders to share",
- "help_config": "Custom JSON config file location (optional)",
"gui_drag_and_drop": "Drag and drop files and folders\nto start sharing",
"gui_add": "Add",
"gui_add_files": "Add Files",
@@ -29,12 +14,12 @@
"gui_choose_items": "Choose",
"gui_share_start_server": "Start sharing",
"gui_share_stop_server": "Stop sharing",
- "gui_share_stop_server_shutdown_timeout": "Stop Sharing ({}s remaining)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Auto-stop timer ends at {}",
+ "gui_share_stop_server_autostop_timer": "Stop Sharing ({})",
+ "gui_stop_server_autostop_timer_tooltip": "Auto-stop timer ends at {}",
+ "gui_start_server_autostart_timer_tooltip": "Auto-start timer ends at {}",
"gui_receive_start_server": "Start Receive Mode",
"gui_receive_stop_server": "Stop Receive Mode",
- "gui_receive_stop_server_shutdown_timeout": "Stop Receive Mode ({}s remaining)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Auto-stop timer ends at {}",
+ "gui_receive_stop_server_autostop_timer": "Stop Receive Mode ({} remaining)",
"gui_copy_url": "Copy Address",
"gui_copy_hidservauth": "Copy HidServAuth",
"gui_canceled": "Canceled",
@@ -42,8 +27,8 @@
"gui_copied_url": "OnionShare address copied to clipboard",
"gui_copied_hidservauth_title": "Copied HidServAuth",
"gui_copied_hidservauth": "HidServAuth line copied to clipboard",
+ "gui_waiting_to_start": "Scheduled to start in {}. Click to cancel.",
"gui_please_wait": "Starting… Click to cancel.",
- "version_string": "OnionShare {0:s} | https://onionshare.org/",
"gui_quit_title": "Not so fast",
"gui_share_quit_warning": "You're in the process of sending files. Are you sure you want to quit OnionShare?",
"gui_receive_quit_warning": "You're in the process of receiving files. Are you sure you want to quit OnionShare?",
@@ -92,8 +77,10 @@
"gui_settings_button_save": "Save",
"gui_settings_button_cancel": "Cancel",
"gui_settings_button_help": "Help",
- "gui_settings_shutdown_timeout_checkbox": "Use auto-stop timer",
- "gui_settings_shutdown_timeout": "Stop the share at:",
+ "gui_settings_autostop_timer_checkbox": "Use auto-stop timer",
+ "gui_settings_autostop_timer": "Stop the share at:",
+ "gui_settings_autostart_timer_checkbox": "Use auto-start timer",
+ "gui_settings_autostart_timer": "Start the share at:",
"settings_error_unknown": "Can't connect to Tor controller because your settings don't make sense.",
"settings_error_automatic": "Could not connect to the Tor controller. Is Tor Browser (available from torproject.org) running in the background?",
"settings_error_socket_port": "Can't connect to the Tor controller at {}:{}.",
@@ -107,7 +94,6 @@
"settings_test_success": "Connected to the Tor controller.\n\nTor version: {}\nSupports ephemeral onion services: {}.\nSupports client authentication: {}.\nSupports next-gen .onion addresses: {}.",
"error_tor_protocol_error": "There was an error with Tor: {}",
"error_tor_protocol_error_unknown": "There was an unknown error with Tor",
- "error_invalid_private_key": "This private key type is unsupported",
"connecting_to_tor": "Connecting to the Tor network",
"update_available": "New OnionShare out. <a href='{}'>Click here</a> to get it.<br><br>You are using {} and the latest is {}.",
"update_error_check_error": "Could not check for new versions: The OnionShare website is saying the latest version is the unrecognizable '{}'…",
@@ -119,8 +105,10 @@
"gui_tor_connection_error_settings": "Try changing how OnionShare connects to the Tor network in the settings.",
"gui_tor_connection_canceled": "Could not connect to Tor.\n\nEnsure you are connected to the Internet, then re-open OnionShare and set up its connection to Tor.",
"gui_tor_connection_lost": "Disconnected from Tor.",
- "gui_server_started_after_timeout": "The auto-stop timer ran out before the server started.\nPlease make a new share.",
- "gui_server_timeout_expired": "The auto-stop timer already ran out.\nPlease update it to start sharing.",
+ "gui_server_started_after_autostop_timer": "The auto-stop timer ran out before the server started. Please make a new share.",
+ "gui_server_autostop_timer_expired": "The auto-stop timer already ran out. Please update it to start sharing.",
+ "gui_server_autostart_timer_expired": "The scheduled time has already passed. Please update it to start sharing.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "The auto-stop time can't be the same or earlier than the auto-start time. Please update it to start sharing.",
"share_via_onionshare": "OnionShare it",
"gui_connect_to_tor_for_onion_settings": "Connect to Tor to see onion service settings",
"gui_use_legacy_v2_onions_checkbox": "Use legacy addresses",
@@ -133,20 +121,18 @@
"gui_url_label_onetime_and_persistent": "This share will not auto-stop.<br><br>Every subsequent share will reuse the address. (To use one-time addresses, turn off \"Use persistent address\" in the settings.)",
"gui_status_indicator_share_stopped": "Ready to share",
"gui_status_indicator_share_working": "Starting…",
+ "gui_status_indicator_share_scheduled": "Scheduled…",
"gui_status_indicator_share_started": "Sharing",
"gui_status_indicator_receive_stopped": "Ready to receive",
"gui_status_indicator_receive_working": "Starting…",
+ "gui_status_indicator_receive_scheduled": "Scheduled…",
"gui_status_indicator_receive_started": "Receiving",
"gui_file_info": "{} files, {}",
"gui_file_info_single": "{} file, {}",
"history_in_progress_tooltip": "{} in progress",
"history_completed_tooltip": "{} completed",
"error_cannot_create_data_dir": "Could not create OnionShare data folder: {}",
- "receive_mode_data_dir": "Files sent to you appear in this folder: {}",
- "receive_mode_warning": "Warning: Receive mode lets people upload files to your computer. 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.",
"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>",
- "receive_mode_upload_starting": "Upload of total size {} is starting",
- "receive_mode_received_file": "Received: {}",
"gui_mode_share_button": "Share Files",
"gui_mode_receive_button": "Receive Files",
"gui_settings_receiving_label": "Receiving settings",
@@ -178,7 +164,12 @@
"gui_all_modes_progress_starting": "{0:s}, %p% (calculating)",
"gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
"gui_share_mode_no_files": "No Files Sent Yet",
- "gui_share_mode_timeout_waiting": "Waiting to finish sending",
+ "gui_share_mode_autostop_timer_waiting": "Waiting to finish sending",
"gui_receive_mode_no_files": "No Files Received Yet",
- "gui_receive_mode_timeout_waiting": "Waiting to finish receiving"
+ "gui_receive_mode_autostop_timer_waiting": "Waiting to finish receiving",
+ "receive_mode_upload_starting": "Upload of total size {} is starting",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/eo.json b/share/locale/eo.json
index bf578276..ea3cef9c 100644
--- a/share/locale/eo.json
+++ b/share/locale/eo.json
@@ -11,7 +11,7 @@
"help_local_only": "Ne strebu uzi tor: nur por evoluado",
"help_stay_open": "Lasu onion service funkcii post fino de elŝuto",
"help_stealth": "Create stealth onion service (advanced)",
- "help_debug": "Protokoli erarojn sur disko",
+ "help_verbose": "Protokoli erarojn sur disko",
"help_filename": "Listo de dosieroj aŭ dosierujoj por kundividi",
"gui_drag_and_drop": "Ŝovu kaj metu\nla dosierojn ĉi tien",
"gui_add": "Aldoni",
diff --git a/share/locale/es.json b/share/locale/es.json
index 9ad6fad5..b5110f6f 100644
--- a/share/locale/es.json
+++ b/share/locale/es.json
@@ -7,7 +7,7 @@
"closing_automatically": "Detenido porque la transferencia se completó",
"help_local_only": "No usar Tor (sólo para desarrollo)",
"help_stay_open": "Continuar compartiendo luego que los archivos hayan sido enviados",
- "help_debug": "Enviar los errores de OnionShare a stdout, y los errores web al disco",
+ "help_verbose": "Enviar los errores de OnionShare a stdout, y los errores web al disco",
"help_filename": "Lista de archivos o carpetas para compartir",
"gui_drag_and_drop": "Arrastra y suelta archivos y carpetas\npara empezar a compartir",
"gui_add": "Añadir",
@@ -21,10 +21,10 @@
"config_onion_service": "Configurando el servicio cebolla en el puerto {0:d}.",
"give_this_url_stealth": "Dale esta dirección y la línea de HidServAuth a la persona a la que le estás enviando el archivo:",
"no_available_port": "No se pudo iniciar el servicio cebolla porque no había puerto disponible",
- "close_on_timeout": "Parado porque el temporizador expiró",
+ "close_on_autostop_timer": "Parado porque el temporizador de auto-parada expiró",
"timeout_download_still_running": "Esperando a que se complete la descarga",
"large_filesize": "Advertencia: Enviar un archivo tan grande podría llevar horas",
- "help_shutdown_timeout": "Dejar de compartir después de una determinada cantidad de segundos",
+ "help_autostop_timer": "Dejar de compartir después de una determinada cantidad de segundos",
"help_stealth": "Usar autorización de cliente (avanzada)",
"help_config": "Ubicación del archivo de configuración JSON personalizado (opcional)",
"gui_copied_url_title": "Dirección de OnionShare copiada",
@@ -60,12 +60,12 @@
"systray_upload_started_title": "Subida OnionShare Iniciada",
"systray_upload_started_message": "Un usuario comenzó a subir archivos a tu computadora",
"help_receive": "Recibir recursos compartidos en lugar de enviarlos",
- "gui_share_stop_server_shutdown_timeout": "Dejar de Compartir ({}s restantes)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "El temporizador de parada automática termina en {}",
+ "gui_share_stop_server_autostop_timer": "Dejar de Compartir ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "El temporizador de parada automática termina en {}",
"gui_receive_start_server": "Iniciar el modo de recepción",
"gui_receive_stop_server": "Detener el modo de recepción",
- "gui_receive_stop_server_shutdown_timeout": "Detener el modo de recepción ({}s restantes)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "El temporizador de parada automática termina en {}",
+ "gui_receive_stop_server_autostop_timer": "Detener el modo de recepción ({} restantes)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "El temporizador de parada automática termina en {}",
"gui_copy_hidservauth": "Copiar HidServAuth",
"gui_no_downloads": "Ninguna Descarga Todavía",
"gui_canceled": "Cancelado",
@@ -95,8 +95,8 @@
"gui_tor_connection_error_settings": "Intenta cambiando la forma en que OnionShare se conecta a la red Tor en tu configuración.",
"gui_tor_connection_canceled": "No se pudo conectar con Tor.\n\nAsegúrate de estar conectado a Internet, luego vuelve a abrir OnionShare y configurar tu conexión a Tor.",
"gui_tor_connection_lost": "Desconectado de Tor.",
- "gui_server_started_after_timeout": "El temporizador de parada automática se agotó antes de que se iniciara el servidor.\nPor favor crea una nueva conexión compartida.",
- "gui_server_timeout_expired": "El temporizador de parada automática ya se ha agotado.\nPor favor, actualízalo para comenzar a compartir.",
+ "gui_server_started_after_autostop_timer": "El temporizador de auto-parada expiró antes de que se iniciara el servidor.\nPor favor crea una nueva conexión compartida.",
+ "gui_server_autostop_timer_expired": "El temporizador de auto-parada ya expiró.\nPor favor actualízarlo para comenzar a compartir.",
"share_via_onionshare": "Compártelo con OnionShare",
"gui_use_legacy_v2_onions_checkbox": "Usar direcciones antiguas",
"gui_save_private_key_checkbox": "Usar una dirección persistente",
@@ -155,8 +155,8 @@
"gui_settings_button_save": "Guardar",
"gui_settings_button_cancel": "Cancelar",
"gui_settings_button_help": "Ayuda",
- "gui_settings_shutdown_timeout_checkbox": "Usar temporizador de parada automática",
- "gui_settings_shutdown_timeout": "Detener carpeta compartida en:",
+ "gui_settings_autostop_timer_checkbox": "Usar temporizador de auto-parada",
+ "gui_settings_autostop_timer": "Detener carpeta compartida en:",
"history_in_progress_tooltip": "{} en progreso",
"history_completed_tooltip": "{} completado",
"error_cannot_create_downloads_dir": "No se ha podido crear la carpeta en modo de recepción: {}",
@@ -212,10 +212,23 @@
"gui_all_modes_progress_starting": "{0:s}, %p% (calculando)",
"gui_all_modes_progress_eta": "{0:s}, TEA: {1:s}, %p%",
"gui_share_mode_no_files": "No se enviaron archivos todavía",
- "gui_share_mode_timeout_waiting": "Esperando a que termine el envío",
+ "gui_share_mode_autostop_timer_waiting": "Esperando a que termine el envío",
"gui_receive_mode_no_files": "No se recibieron archivos todavía",
- "gui_receive_mode_timeout_waiting": "Esperando a que termine la recepción",
+ "gui_receive_mode_autostop_timer_waiting": "Esperando a que termine la recepción",
"gui_all_modes_transfer_canceled_range": "Cancelado {} - {}",
"gui_all_modes_transfer_canceled": "Cancelado {}",
- "gui_settings_onion_label": "Configuración de Onion"
+ "gui_settings_onion_label": "Configuración de Onion",
+ "gui_stop_server_autostop_timer_tooltip": "El temporizador de auto-parada finaliza a las {}",
+ "gui_start_server_autostart_timer_tooltip": "El temporizador de auto-inicio finaliza a las {}",
+ "gui_waiting_to_start": "Agendado para empezar en {}. Clic para cancelar.",
+ "gui_settings_autostart_timer_checkbox": "Usar temporizador de auto-arranque",
+ "gui_settings_autostart_timer": "Iniciar compartición en:",
+ "gui_server_autostart_timer_expired": "La hora agendada ya ha pasado. Por favor actualizarla para comenzar a compartir.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "La hora de auto-inicio no puede ser la misma o anterior a la de auto-parada. Por favor actualizarla para comenzar a compartir.",
+ "gui_status_indicator_share_scheduled": "Agendado…",
+ "gui_status_indicator_receive_scheduled": "Agendado…",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/fa.json b/share/locale/fa.json
index 7e6c305c..1f2d327e 100644
--- a/share/locale/fa.json
+++ b/share/locale/fa.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "{0:s} قابل خواندن نمی باشد.",
"no_available_port": "پورت قابل استفاده برای شروع سرویس onion پیدا نشد",
"other_page_loaded": "آدرس بارگذاری شد",
- "close_on_timeout": "متوقف شد چون تایمر توقف خودکار به پایان رسید",
+ "close_on_autostop_timer": "متوقف شد چون تایمر توقف خودکار به پایان رسید",
"closing_automatically": "متوقف شد چون انتقال انجام شد",
"timeout_download_still_running": "انتظار برای تکمیل دانلود",
"large_filesize": "هشدار: یک اشتراک گذاری بزرگ ممکن است ساعت ها طول بکشد",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "یک کاربر شروع به آپلود فایل بر روی کامپیوتر شما کرده است",
"help_local_only": "عدم استفاده از Tor (فقط برای توسعه)",
"help_stay_open": "ادامه اشتراک گذاری پس از ارسال دانلود ها",
- "help_shutdown_timeout": "توقف به اشتراک گذاری پس از میزان ثانیه ای مشخص",
+ "help_autostop_timer": "توقف به اشتراک گذاری پس از میزان ثانیه ای مشخص",
"help_stealth": "استفاده از احراز هویت کلاینت (پیشرفته)",
"help_receive": "دریافت اشتراک به جای ارسال آن",
- "help_debug": "لاگ کردن خطاهای OnionShare روی stdout، و خطاهای وب بر روی دیسک",
+ "help_verbose": "لاگ کردن خطاهای OnionShare روی stdout، و خطاهای وب بر روی دیسک",
"help_filename": "لیست فایل ها یا فولدر ها برای به اشتراک گذاری",
"help_config": "مکان فایل کانفیگ JSON کاستوم (اختیاری)",
"gui_drag_and_drop": "فایل ها و پوشه ها را بکشید و رها کنید\nتا اشتراک گذاری آغاز شود",
@@ -37,12 +37,12 @@
"gui_choose_items": "انتخاب",
"gui_share_start_server": "شروع اشتراک گذاری",
"gui_share_stop_server": "توقف اشتراک گذاری",
- "gui_share_stop_server_shutdown_timeout": "توقف اشتراک گذاری ({} ثانیه باقیمانده)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "تایمر توقف خودکار در {} متوقف می شود",
+ "gui_share_stop_server_autostop_timer": "توقف اشتراک گذاری ({} ثانیه باقیمانده)",
+ "gui_share_stop_server_autostop_timer_tooltip": "تایمر توقف خودکار در {} متوقف می شود",
"gui_receive_start_server": "شروع حالت دریافت",
"gui_receive_stop_server": "توقف حالت دریافت",
- "gui_receive_stop_server_shutdown_timeout": "توقف حالت دریافت ({} ثانیه باقیمانده)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "تایمر توقف خودکار در {} به پایان می رسد",
+ "gui_receive_stop_server_autostop_timer": "توقف حالت دریافت ({} ثانیه باقیمانده)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "تایمر توقف خودکار در {} به پایان می رسد",
"gui_copy_url": "کپی آدرس",
"gui_copy_hidservauth": "کپی HidServAuth",
"gui_downloads": "دانلود تاریخچه",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "ذخیره",
"gui_settings_button_cancel": "لغو",
"gui_settings_button_help": "راهنما",
- "gui_settings_shutdown_timeout_checkbox": "استفاده از تایمر توقف خودکار",
- "gui_settings_shutdown_timeout": "توقف اشتراک در:",
+ "gui_settings_autostop_timer_checkbox": "استفاده از تایمر توقف خودکار",
+ "gui_settings_autostop_timer": "توقف اشتراک در:",
"settings_error_unknown": "ناتوانی در اتصال به کنترل کننده Tor بدلیل نامفهوم بودن تنظیمات.",
"settings_error_automatic": "ناتوانی در اتصال به کنترل کننده Tor. آیا مرورگر Tor (در دسترس از طریق torproject.org) در پس زمینه در حال اجراست؟",
"settings_error_socket_port": "ناتوانی در اتصال به کنترل کننده Tor در {}:{}.",
@@ -131,8 +131,8 @@
"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_timeout": "تایمر توقف خودکار قبل از آغاز سرور به پایان رسید.\nلطفا یک اشتراک جدید درست کنید.",
- "gui_server_timeout_expired": "تایمر توقف خودکار به پایان رسید.\nلطفا برای آغاز اشتراک گذاری آن را به روز رسانی کنید.",
+ "gui_server_started_after_autostop_timer": "تایمر توقف خودکار قبل از آغاز سرور به پایان رسید.\nلطفا یک اشتراک جدید درست کنید.",
+ "gui_server_autostop_timer_expired": "تایمر توقف خودکار به پایان رسید.\nلطفا برای آغاز اشتراک گذاری آن را به روز رسانی کنید.",
"share_via_onionshare": "OnionShare کنید",
"gui_use_legacy_v2_onions_checkbox": "استفاده از آدرس های بازمانده",
"gui_save_private_key_checkbox": "استفاده از یک آدرس پایا",
@@ -208,9 +208,9 @@
"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_timeout_waiting": "انتظار برای به پایان رسیدن ارسال",
+ "gui_share_mode_autostop_timer_waiting": "انتظار برای به پایان رسیدن ارسال",
"gui_receive_mode_no_files": "هیچ فایلی هنوز دریافت نشده است",
- "gui_receive_mode_timeout_waiting": "انتظار برای به پایان رسیدن دریافت",
+ "gui_receive_mode_autostop_timer_waiting": "انتظار برای به پایان رسیدن دریافت",
"gui_all_modes_transfer_canceled_range": "{} - {} لغو شد",
"gui_all_modes_transfer_canceled": "{} لغو شد"
}
diff --git a/share/locale/fi.json b/share/locale/fi.json
index 7f31450f..1dc1451f 100644
--- a/share/locale/fi.json
+++ b/share/locale/fi.json
@@ -1,25 +1,198 @@
{
- "preparing_files": "Valmistellaan tiedostoja jaettavaksi.",
+ "preparing_files": "Pakataan tiedostoja.",
"give_this_url": "Anna tämä URL-osoite vastaanottajalle:",
- "ctrlc_to_stop": "Näppäin Ctrl-C pysäyttää palvelimen",
+ "ctrlc_to_stop": "Pysäytä palvelin painamalla Ctrl+C",
"not_a_file": "{0:s} Ei ole tiedosto.",
"other_page_loaded": "URL-osoite ladattu",
- "closing_automatically": "Lataus valmis. Suljetaan automaattisesti",
- "large_filesize": "Varoitus: Isojen tiedostojen lähetys saattaa kestää tunteja",
- "help_local_only": "Älä käytä Toria: vain ohjelmakehitykseen",
- "help_stay_open": "Pidä piilopalvelu käynnissä latauksen jälkeen.",
- "help_debug": "Tallentaa virheet levylle",
+ "closing_automatically": "Lähetys valmis. Suljetaan automaattisesti",
+ "large_filesize": "Varoitus: Ison tiedoston lähetys saattaa kestää tunteja",
+ "help_local_only": "Älä käytä Toria (vain kehitykseen)",
+ "help_stay_open": "Jatka jakoa tiedostojen lähetyksen jälkeen",
+ "help_verbose": "Kirjaa OnionShare virheet stdout:tiin, ja verkko virheet levylle",
"help_filename": "Luettele jaettavat tiedostot tai kansiot",
"gui_drag_and_drop": "Vedä ja pudota\ntiedostot tänne",
"gui_add": "Lisää",
"gui_delete": "Poista",
"gui_choose_items": "Valitse",
- "gui_share_start_server": "Käynnistä palvelin",
- "gui_share_stop_server": "Pysäytä palvelin",
+ "gui_share_start_server": "Aloita jakaminen",
+ "gui_share_stop_server": "Pysäytä jakaminen",
"gui_copy_url": "Kopioi URL-osoite",
"gui_downloads": "Lataukset:",
"gui_canceled": "Peruutettu",
- "gui_copied_url": "URL-osoite kopioitu leikepöydälle",
- "gui_please_wait": "Odota...",
- "zip_progress_bar_format": "Tiivistän tiedostoja: %p%"
+ "gui_copied_url": "OnionShare-osoite kopioitu leikepöydälle",
+ "gui_please_wait": "Käynnistyy... Peruuta napsauttamalla.",
+ "zip_progress_bar_format": "Pakataan: %p%",
+ "config_onion_service": "Onion-palvelua asetetaan porttiin {0:d}.",
+ "give_this_url_stealth": "Anna tämä osoite ja HidServAuth rivi vastaanottajalle:",
+ "give_this_url_receive": "Anna tämä osoite lähettäjälle:",
+ "give_this_url_receive_stealth": "Anna tämä osoite ja HidServAuth lähettäjälle:",
+ "not_a_readable_file": "{0:s} ei ole luettava tiedosto.",
+ "no_available_port": "Vapaata porttia onion palvelulle ei löydetty",
+ "close_on_autostop_timer": "Pysäytetty koska auto-stop ajastin loppui",
+ "help_autostop_timer": "Lopeta jakaminen annetun sekunnin kuluttua",
+ "help_stealth": "Käytä asiakasvaltuutusta (edistynyt)",
+ "help_receive": "Vastaanota osia niiden lähettämisen sijaan",
+ "help_config": "Mukautettu JSON-määritystiedoston sijainti (valinnainen)",
+ "gui_add_files": "Lisää tiedostoja",
+ "gui_add_folder": "Lisää kansio",
+ "gui_share_stop_server_autostop_timer": "Lopeta jakaminen ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Auto-stop ajastin loppuu {} jälkeen",
+ "gui_receive_start_server": "Aloita vastaanotto tila",
+ "gui_receive_stop_server": "Lopeta vastaanotto tila",
+ "gui_receive_stop_server_autostop_timer": "Lopeta vastaanotto tila ({} jäljellä)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Auto-stop ajastin loppuu kello {}",
+ "gui_copy_hidservauth": "Kopioi HidServAuth",
+ "gui_copied_url_title": "Kopioi OnionShare osoite",
+ "gui_copied_hidservauth_title": "HidServAuth kopioitu",
+ "gui_copied_hidservauth": "HidServAuth rivi kopioitu leikepöydälle",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Ei niin nopeasti",
+ "gui_share_quit_warning": "Olet lähettämässä tiedostoja. Haluatko varmasti lopettaa OnionSharen?",
+ "gui_receive_quit_warning": "Olet vastaanottamassa tiedostoja. Haluatko varmasti lopettaa OnionSharen?",
+ "gui_quit_warning_quit": "Lopeta",
+ "gui_quit_warning_dont_quit": "Peruuta",
+ "error_rate_limit": "Joku on tehnyt liian monta väärää yritystä osoitteeseesi, mikä tarkoittaa, että he voisivat yrittää arvata sitä, joten OnionShare on pysäyttänyt palvelimen. Aloita jakaminen uudelleen ja lähetä vastaanottajalle uusi osoite jatkaaksesi.",
+ "error_stealth_not_supported": "Asiakasvaltuuden käyttämiseen tarvitaan ainakin Tor 0.2.9.1-alpha (tai Tor Browser 6.5) ja python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionSharen käyttö vaatii ainakin Tor 0.2.7.1 ja python3-stem 1.4.0.",
+ "gui_settings_window_title": "Asetukset",
+ "gui_settings_whats_this": "<a href='{0:s}'>Mikä tämä on?</a>",
+ "gui_settings_stealth_option": "Käytä asiakaslupaa",
+ "gui_settings_stealth_hidservauth_string": "Nyt kun olet tallentanut yksityisen avaimesi uudelleenkäyttöä varten, voit kopioida HidServAuth-osoitteesi napista.",
+ "gui_settings_autoupdate_label": "Tarkista päivitykset",
+ "gui_settings_autoupdate_option": "Ilmoita minulle, kun uusi versio on saatavilla",
+ "gui_settings_autoupdate_timestamp": "Viimeksi tarkistettu: {}",
+ "gui_settings_autoupdate_timestamp_never": "ei koskaan",
+ "gui_settings_autoupdate_check_button": "Tarkista päivitykset",
+ "gui_settings_general_label": "Yleiset asetukset",
+ "gui_settings_onion_label": "Onion asetukset",
+ "gui_settings_sharing_label": "Jako asetukset",
+ "gui_settings_close_after_first_download_option": "Lopeta jakaminen tiedostojen lähetyksen jälkeen",
+ "gui_settings_connection_type_label": "Miten OnionSharen kuuluisi yhdistää Tor:iin?",
+ "gui_settings_connection_type_bundled_option": "Käytä OnionShareen sisäänrakennettua Tor versiota",
+ "gui_settings_connection_type_automatic_option": "Kokeile automaattista konfigurointia Tor-selaimella",
+ "gui_settings_connection_type_control_port_option": "Yhdistä käyttämällä control porttia",
+ "gui_settings_connection_type_socket_file_option": "Yhdistä käyttäen socket tiedostoa",
+ "gui_settings_connection_type_test_button": "Testaa Tor yhteyttä",
+ "gui_settings_control_port_label": "Control port",
+ "gui_settings_socket_file_label": "Socket tiedosto",
+ "gui_settings_socks_label": "SOCKS portti",
+ "gui_settings_authenticate_label": "Tor todennus asetukset",
+ "gui_settings_authenticate_no_auth_option": "Ei todentamista, tai evästeiden todentamista",
+ "gui_settings_authenticate_password_option": "Salasana",
+ "gui_settings_password_label": "Salasana",
+ "gui_settings_tor_bridges": "Tor silta-solmu tuki",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Älä käytä silta-solmuja",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Käytä sisäänrakennettuja obfs4-liitettäviä kuljetuksia",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Käytä sisäänrakennettuja obfs4-liitettäviä kuljetuksia (vaatii obfs4proxyn)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Käytä sisäänrakennettuja meek_lite (Azure)-liitettäviä kuljetuksia",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Käytä sisäänrakennettuja meek_lite (Azure)-liitettäviä kuljetuksia (vaatii obfs4proxyn)",
+ "gui_settings_meek_lite_expensive_warning": "Varoitus: Meek_lite-sillat ovat Tor-projektille erittäin kalliita. <br><br> Käytä niitä vain, jos et pysty muodostamaan yhteyttä suoraan Toriin, obfs4-kuljetusten tai muiden tavallisten silta-solmujen kautta.",
+ "gui_settings_tor_bridges_custom_radio_option": "Käytä mukautettuja silta-solmuja",
+ "gui_settings_tor_bridges_custom_label": "Löydät silta-solmut osoitteesta <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Mikään lisäämistäsi silta-solmuista ei toiminut\nUudellen tarkista ne tai lisää muita.",
+ "gui_settings_button_save": "Tallenna",
+ "gui_settings_button_cancel": "Peruuttaa",
+ "gui_settings_button_help": "Apua",
+ "gui_settings_autostop_timer_checkbox": "Käytä auto-stop ajastinta",
+ "gui_settings_autostop_timer": "Lopeta jakaminen kello:",
+ "settings_error_unknown": "Ei voi muodostaa yhteyttä Tor-ohjaimeen, koska asetuksesi eivät ole järkeviä.",
+ "settings_error_automatic": "Tor-ohjaimeen ei voitu muodostaa yhteyttä. Onko Tor Browser (saatavilla osoitteesta torproject.org) avoimena taustalla?",
+ "settings_error_socket_port": "Ei voi muodostaa yhteyttä Tor-ohjaimeen: {}:{}.",
+ "settings_error_socket_file": "Ei voi muodostaa yhteyttä Tor-ohjaimeen käyttämällä socket-tiedostoa {}.",
+ "settings_error_auth": "Yhdistetty osoitteeseen {}:{}, mutta ei voida todentaa. Ehkä tämä ei ole Tor ohjain?",
+ "settings_error_missing_password": "Yhdistetty Tor ohjaimeen, mutta se vaatii salasanan todentamiseen.",
+ "settings_error_unreadable_cookie_file": "Yhdistetty tor ohjaimeen, mutta salasana saattaa olla väärä, tai käyttäjä ei saa lukea evästetiedostoa.",
+ "settings_error_bundled_tor_not_supported": "OnionSharen mukana tulevan Tor version käyttäminen ei toimi Developer-tilassa Windowsissa tai MacOSissa.",
+ "settings_error_bundled_tor_timeout": "Yhdistäminen Tor:iin kestää lian kauan. Ehkä et ole yhteydessä nettiin, tai järjestelmäsi kello on epätarkka?",
+ "settings_error_bundled_tor_broken": "OnionShare ei voinut yhdistää Tor:iin taustalla\n{}",
+ "settings_test_success": "Yhditetty Tor ohjaimeen.\n\nTor versio: {}\nTykee lyhytaikaista onion palvelua: {}.\nTukee asiakas todennusta: {}.\nTukee uuden sukupolven .onion osoitteita: {}.",
+ "error_tor_protocol_error": "Tor-verkossa tapahtui virhe: {}",
+ "error_tor_protocol_error_unknown": "Tor-verkossa tapahtui tuntematon virhe",
+ "error_invalid_private_key": "Tätä yksityisen avaimen tyyppiä ei tueta",
+ "connecting_to_tor": "Yhdistetään Tor-verkkoon",
+ "update_available": "Uusi OnionShare version on julkaistu. <a href='{}'>Paina tästä</a> ladataksesi sen.<br><br>Sinulla on versio {} ja uusin version on {}.",
+ "update_error_check_error": "Päivityksien tarkistaminen epäonnistui: OnionShare-sivusto kertoo, että uusin versio on tunnistamaton '{}'…",
+ "update_error_invalid_latest_version": "Päivityksien tarkistaminen epäonnistui: Ehkä et ole yhteydessä Tor-verkkoon, tai OnionShare-sivusto on alhaalla?",
+ "update_not_available": "Sinulla on OnionSharen uusin versio.",
+ "gui_tor_connection_ask": "Avaa asetukset Tor-yhteyden selvittämiseksi?",
+ "gui_tor_connection_ask_open_settings": "Kyllä",
+ "gui_tor_connection_ask_quit": "Lopeta",
+ "gui_tor_connection_error_settings": "Yritä muuttaa miten OnionShare yhdistää Tor-verkkoon asetuksista.",
+ "gui_tor_connection_canceled": "Tor-yhteyden muodostus epäonnistui.\n\nVarmista että sinulla on toimiva internet yhteys, jonka jälkeen uudelleen avaa OnionShare ja sen Tor-yhteys.",
+ "gui_tor_connection_lost": "Tor-yhteys katkaistu.",
+ "gui_server_started_after_autostop_timer": "Auto-stop ajastin loppui ennen palvelimen käynnistymistä.\nLuo uusi jako.",
+ "gui_server_autostop_timer_expired": "Auto-stop ajastin loppui jo.\nPäivitä se jaon aloittamiseksi.",
+ "share_via_onionshare": "OnionShare se",
+ "gui_connect_to_tor_for_onion_settings": "Yhdistä Tor-verkkoon nähdäksesi onion palvelun asetukset",
+ "gui_use_legacy_v2_onions_checkbox": "Käytä vanhoja osoitteita",
+ "gui_save_private_key_checkbox": "Käytä pysyviä osoitteita",
+ "gui_share_url_description": "<b>Kaikki</b> joilla on tämä OnionShare osoite voivat <b>ladata</b> tiedostojasi käyttämällä <b>Tor selainta</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Kaikki</b> joilla on tämä OnionShare osoite voivat <b>lähettää</b>tiedostoja tietokoneellesi käyttämällä <b>Tor selainta</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Tämä jako ei pysähdy automaattisesti.<br><br>Jokainen seuraava jako käyttää osoitetta uudelleen. (Jos haluat käyttää kertaluontoisia osoitteita, sammuta \"Käytä pysyvää osoitetta\" asetuksissa.)",
+ "gui_url_label_stay_open": "Tämä jako ei pysähdy automaattisesti.",
+ "gui_url_label_onetime": "Tämä jako lopetetaan ensimmäisen valmistumisen jälkeen.",
+ "gui_url_label_onetime_and_persistent": "Tämä jako ei pysähdy automaattisesti.<br><br>Jokainen seuraava jako käyttää osoitetta uudelleen. (Jos haluat käyttää kertaluontoisia osoitteita, sammuta \"Käytä pysyvää osoitetta\" asetuksissa.)",
+ "gui_status_indicator_share_stopped": "Valmis jakamaan",
+ "gui_status_indicator_share_working": "Aloitetaan…",
+ "gui_status_indicator_share_started": "Jakaa",
+ "gui_status_indicator_receive_stopped": "Valmis vastaanottamaan",
+ "gui_status_indicator_receive_working": "Vastaanotetaan…",
+ "gui_status_indicator_receive_started": "Vastaanotetaan",
+ "gui_file_info": "{} tiedostoa, {}",
+ "gui_file_info_single": "{} tiedosto, {}",
+ "history_in_progress_tooltip": "{} meneillään",
+ "history_completed_tooltip": "{} valmistunut",
+ "error_cannot_create_data_dir": "OnionShare-tietokansiota ei voitu luoda: {}",
+ "receive_mode_data_dir": "Sinulle lähetetyt tiedostot löytyvät tästä kansiosta: {}",
+ "receive_mode_warning": "Varoitus: Vastaanottotila antaa ihmisille mahdollisuuden ladata tiedostoja tietokoneeseen. Jotkin tiedostot voivat hallita tietokonettasi, jos avaat ne. Avaa vain tiedostot, joihin luotat, tai jos tiedät, mitä teet.",
+ "gui_receive_mode_warning": "Vastaanottotila antaa ihmisille mahdollisuuden ladata tiedostoja tietokoneellesi.<br><br><b>Jotkin tiedostot voivat hallita tietokonettasi, jos avaat ne. Avaa asioita vain ihmisiltä, joihin luotat, tai jos tiedät, mitä olet tekemässä. </b>",
+ "receive_mode_upload_starting": "Lähetys jonka koko on {} alkaa",
+ "receive_mode_received_file": "Vastaanotetaan: {}",
+ "gui_mode_share_button": "Jaa Tiedostoja",
+ "gui_mode_receive_button": "Vastaanota Tiedostoja",
+ "gui_settings_receiving_label": "Vastaanoton asetukset",
+ "gui_settings_data_dir_label": "Tallenna tiedostot",
+ "gui_settings_data_dir_browse_button": "Selaa",
+ "gui_settings_public_mode_checkbox": "Julkinen tila",
+ "gui_open_folder_error_nautilus": "Kansiota ei voi avata, koska nautilus ei ole käytettävissä. Tiedosto on täällä: {}",
+ "gui_settings_language_label": "Haluttu kieli",
+ "gui_settings_language_changed_notice": "Käynnistä OnionShare uudelleen, jotta kieli muuttuu.",
+ "systray_menu_exit": "Lopeta",
+ "systray_page_loaded_title": "Sivu Ladattu",
+ "systray_page_loaded_message": "OnionShare-osoite ladattu",
+ "systray_share_started_title": "Jako Aloitettu",
+ "systray_share_started_message": "Tiedostojen lähettäminen jollekulle aloitetaan",
+ "systray_share_completed_title": "Jakaminen Valmis",
+ "systray_share_completed_message": "Tiedostojen lähetys valmis",
+ "systray_share_canceled_title": "Jako keskeytetty",
+ "systray_share_canceled_message": "Joku keskeytti tiedostojesi vastaanottamisen",
+ "systray_receive_started_title": "Vastaanottaminen Aloitettu",
+ "systray_receive_started_message": "Joku lähettää tiedostoja sinulle",
+ "gui_all_modes_history": "Historia",
+ "gui_all_modes_clear_history": "Tyhjennä",
+ "gui_all_modes_transfer_started": "Aloitettu {}",
+ "gui_all_modes_transfer_finished_range": "Siirretty {} - {}",
+ "gui_all_modes_transfer_finished": "Siirretty {}",
+ "gui_all_modes_transfer_canceled_range": "Keskeytetty {} - {}",
+ "gui_all_modes_transfer_canceled": "Keskeytetty {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} kulunut.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (lasketaan)",
+ "gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "gui_share_mode_no_files": "Yhtäkään tiedostoa ei ole lähetetty vielä",
+ "gui_share_mode_autostop_timer_waiting": "Odotetaan lähettämisen valmistumista",
+ "gui_receive_mode_no_files": "Yhtäkään tiedostoa ei ole vastaanotettu vielä",
+ "gui_receive_mode_autostop_timer_waiting": "Odotetaan vastaanottamisen valmistumista",
+ "gui_stop_server_autostop_timer_tooltip": "Auto-stop ajastin loppuu {} päästä",
+ "gui_start_server_autostart_timer_tooltip": "Auto-start ajastin loppu {} päästä",
+ "gui_waiting_to_start": "Ajastettu aloitus {} päästä. Peruuta napsauttamalla.",
+ "gui_settings_autostart_timer_checkbox": "Käytä auto-start ajastinta",
+ "gui_settings_autostart_timer": "Aloita jakaminen:",
+ "gui_server_autostart_timer_expired": "Aikataulu on jo kulunut. Päivitä se aloittaaksesi jakamisen.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Auto-stop aika ei voi olla sama tai aikaisempi kuin auto-start aika. Päivitä se aloittaaksesi jakamisen.",
+ "gui_status_indicator_share_scheduled": "Ajastettu…",
+ "gui_status_indicator_receive_scheduled": "Ajastettu…",
+ "days_first_letter": "pv",
+ "hours_first_letter": "t",
+ "minutes_first_letter": "min",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/fr.json b/share/locale/fr.json
index 8d87a501..d066ba3d 100644
--- a/share/locale/fr.json
+++ b/share/locale/fr.json
@@ -13,7 +13,7 @@
"systray_download_canceled_message": "La personne a annulé le téléchargement",
"help_local_only": "Ne pas utiliser Tor (uniquement pour le développement)",
"help_stay_open": "Continuer le partage après l’envoi des fichiers",
- "help_debug": "Journaliser les erreurs d’OnionShare sur la sortie standard et les erreurs Web sur le disque",
+ "help_verbose": "Journaliser les erreurs d’OnionShare sur la sortie standard et les erreurs Web sur le disque",
"help_filename": "Liste des fichiers ou dossiers à partager",
"gui_drag_and_drop": "Glisser-déposer des fichiers et dossiers\npour commencer le partage",
"gui_add": "Ajouter",
@@ -54,18 +54,18 @@
"gui_settings_button_save": "Enregistrer",
"gui_settings_button_cancel": "Annuler",
"gui_settings_button_help": "Aide",
- "gui_settings_shutdown_timeout": "Arrêter le partage à :",
+ "gui_settings_autostop_timer": "Arrêter le partage à :",
"connecting_to_tor": "Connexion au réseau Tor",
"help_config": "Emplacement du fichier personnalisé de configuration JSON (facultatif)",
"large_filesize": "Avertissement : envoyer un gros partage peut prendre des heures",
"gui_copied_hidservauth": "La ligne HidServAuth a été copiée dans le presse-papiers",
"version_string": "OnionShare {0:s} | https://onionshare.org/",
- "zip_progress_bar_format": "Compression : %p%",
+ "zip_progress_bar_format": "Compression : %p %",
"error_ephemeral_not_supported": "OnionShare exige au moins Tor 0.2.7.1 et python3-stem 1.4.0.",
- "help_shutdown_timeout": "Arrêter le partage après un certain nombre de secondes",
+ "help_autostop_timer": "Arrêter le partage après un certain nombre de secondes",
"gui_tor_connection_error_settings": "Essayez de modifier dans les paramètres la façon dont OnionShare se connecte au réseau Tor.",
"no_available_port": "Impossible de trouver un port disponible pour démarrer le service oignon",
- "gui_share_stop_server_shutdown_timeout": "Arrêter le partage ({}s restantes)",
+ "gui_share_stop_server_autostop_timer": "Arrêter le partage ({})",
"systray_upload_started_title": "Envoi OnionShare démarré",
"systray_upload_started_message": "Une personne a commencé à envoyer des fichiers vers votre ordinateur",
"gui_no_downloads": "Pas encore de téléchargement",
@@ -143,12 +143,12 @@
"gui_upload_finished": "{} envoyé",
"gui_download_in_progress": "Téléchargement démarré {}",
"gui_open_folder_error_nautilus": "Impossible d’ouvrir le dossier, car nautilus n’est pas disponible. Le fichier est ici : {}",
- "gui_settings_language_label": "Langue préférée",
+ "gui_settings_language_label": "Langue de choix",
"help_stealth": "Utilisation de l’autorisation client (avancé)",
"help_receive": "Recevoir des partages au lieu de les envoyer",
"gui_receive_start_server": "Démarrer le mode réception",
"gui_receive_stop_server": "Arrêter le mode réception",
- "gui_receive_stop_server_shutdown_timeout": "Arrêter le mode réception ({}s restantes)",
+ "gui_receive_stop_server_autostop_timer": "Arrêter le mode réception ({} restantes)",
"gui_download_upload_progress_complete": "%p%, {0:s} écoulées.",
"gui_download_upload_progress_starting": "{0:s}, %p% (estimation)",
"gui_download_upload_progress_eta": "{0:s}, Fin : {1:s}, %p%",
@@ -172,17 +172,17 @@
"systray_page_loaded_title": "La page a été chargée",
"systray_download_page_loaded_message": "Une personne a chargé la page de téléchargement",
"systray_upload_page_loaded_message": "Une personne a chargé la page d'envoi",
- "gui_share_stop_server_shutdown_timeout_tooltip": "La minuterie d’arrêt automatique se termine à {}",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "La minuterie d’arrêt automatique se termine à {}",
+ "gui_share_stop_server_autostop_timer_tooltip": "La minuterie d’arrêt automatique se termine à {}",
+ "gui_receive_stop_server_autostop_timer_tooltip": "La minuterie d’arrêt automatique se termine à {}",
"gui_settings_tor_bridges_obfs4_radio_option": "Utiliser les transports enfichables obfs4 intégrés",
"gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Utiliser les transports enfichables obfs4 intégrés (exige obfs4proxy)",
"gui_settings_tor_bridges_meek_lite_azure_radio_option": "Utiliser les transports enfichables meek_lite (Azure) intégrés",
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Utiliser les transports enfichables meek_lite (Azure) intégrés (exige obfs4proxy)",
"gui_settings_meek_lite_expensive_warning": "Avertissement : l’exploitation de ponts meek_lite demande beaucoup de ressources au Projet Tor.<br><br>Ne les utilisez que si vous ne pouvez pas vous connecter directement à Tor par les transports obfs4 ou autres ponts normaux.",
- "gui_settings_shutdown_timeout_checkbox": "Utiliser la minuterie d’arrêt automatique",
- "gui_server_started_after_timeout": "La minuterie d’arrêt automatique est arrivée au bout de son délai avant le démarrage du serveur.\nVeuillez mettre en place un nouveau partage.",
- "gui_server_timeout_expired": "La minuterie d’arrêt automatique est déjà arrivée au bout de son délai.\nVeuillez la mettre à jour pour commencer le partage.",
- "close_on_timeout": "Arrêté, car la minuterie d’arrêt automatique est arrivée au bout de son délai",
+ "gui_settings_autostop_timer_checkbox": "Utiliser une minuterie d’arrêt automatique",
+ "gui_server_started_after_autostop_timer": "La minuterie d’arrêt automatique est arrivée au bout de son délai avant le démarrage du serveur.\nVeuillez mettre en place un nouveau partage.",
+ "gui_server_autostop_timer_expired": "La minuterie d’arrêt automatique est déjà arrivée au bout de son délai.\nVeuillez la modifier pour commencer le partage.",
+ "close_on_autostop_timer": "Arrêté, car la minuterie d’arrêt automatique est arrivée au bout de son délai",
"gui_add_files": "Ajouter des fichiers",
"gui_add_folder": "Ajouter un dossier",
"error_cannot_create_data_dir": "Impossible de créer le dossier de données d’OnionShare : {}",
@@ -206,12 +206,25 @@
"gui_all_modes_progress_starting": "{0:s}, %p % (estimation)",
"gui_all_modes_progress_eta": "{0:s}, fin prévue : {1:s}, %p %",
"gui_share_mode_no_files": "Aucun fichier n’a encore été envoyé",
- "gui_share_mode_timeout_waiting": "En attente de la fin de l’envoi",
+ "gui_share_mode_autostop_timer_waiting": "En attente de la fin de l’envoi",
"gui_receive_mode_no_files": "Aucun fichier n’a encore été reçu",
- "gui_receive_mode_timeout_waiting": "En attente de la fin de la réception",
- "gui_connect_to_tor_for_onion_settings": "Connectez-vous à Tor pour voir les paramètres du service onion",
+ "gui_receive_mode_autostop_timer_waiting": "En attente de la fin de la réception",
+ "gui_connect_to_tor_for_onion_settings": "Se connecter à Tor pour voir les paramètres du service onion",
"systray_share_completed_message": "L’envoi de fichiers est terminé",
"gui_all_modes_transfer_canceled": "Annulé le {}",
"gui_settings_onion_label": "Paramètres onion",
- "gui_all_modes_transfer_canceled_range": "Annulé {} - {}"
+ "gui_all_modes_transfer_canceled_range": "Annulé {} - {}",
+ "gui_stop_server_autostop_timer_tooltip": "La minuterie d’arrêt automatique se termine à {}",
+ "gui_start_server_autostart_timer_tooltip": "La minuterie de démarrage automatique se termine à {}",
+ "gui_waiting_to_start": "Programmé pour démarrer dans {}. Cliquer pour annuler.",
+ "gui_settings_autostart_timer_checkbox": "Utiliser une minuterie de démarrage automatique",
+ "gui_settings_autostart_timer": "Démarrer le partage à :",
+ "gui_server_autostart_timer_expired": "L’heure programmée est déjà passée. Veuillez la modifier pour démarrer le partage.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "La minuterie d’arrêt automatique ne peut pas être égale ou antérieure à l’heure de démarrage automatique. Veuillez la modifier pour démarrer le partage.",
+ "gui_status_indicator_share_scheduled": "Programmé…",
+ "gui_status_indicator_receive_scheduled": "Programmé…",
+ "days_first_letter": "j",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "min",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/ga.json b/share/locale/ga.json
index 114661d2..249494bc 100644
--- a/share/locale/ga.json
+++ b/share/locale/ga.json
@@ -10,8 +10,8 @@
"not_a_readable_file": "Ní comhad inléite é {0:s}.",
"no_available_port": "Níorbh fhéidir port a aimsiú chun an tseirbhís onion a thosú",
"other_page_loaded": "Seoladh lódáilte",
- "close_on_timeout": "Cuireadh stop leis toisc go bhfuil an t-amadóir caite",
- "closing_automatically": "Cuireadh stop leis toisc go bhfuil an íoslódáil críochnaithe",
+ "close_on_autostop_timer": "Cuireadh stop leis toisc go bhfuil an t-amadóir uathstoptha caite",
+ "closing_automatically": "Cuireadh stop leis toisc go bhfuil an t-aistriú críochnaithe",
"timeout_download_still_running": "Ag fanacht go gcríochnódh an íoslódáil",
"large_filesize": "Rabhadh: D'fhéadfadh go dtógfadh sé tamall fada comhad mór a sheoladh",
"systray_menu_exit": "Scoir",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "Thosaigh úsáideoir ag uaslódáil comhad go dtí do ríomhaire",
"help_local_only": "Ná húsáid Tor (tástáil amháin)",
"help_stay_open": "Lean ort ag comhroinnt tar éis an chéad íoslódáil",
- "help_shutdown_timeout": "Stop ag comhroinnt tar éis líon áirithe soicindí",
+ "help_autostop_timer": "Stop ag comhroinnt tar éis líon áirithe soicindí",
"help_stealth": "Úsáid údarú cliaint (ardleibhéal)",
"help_receive": "Glac le comhaid chomhroinnte in áit iad a sheoladh",
- "help_debug": "Déan tuairisc ar earráidí OnionShare ar stdout, agus earráidí Gréasáin ar an diosca",
+ "help_verbose": "Déan tuairisc ar earráidí OnionShare ar stdout, agus earráidí Gréasáin ar an diosca",
"help_filename": "Liosta comhad nó fillteán le comhroinnt",
"help_config": "Suíomh saincheaptha don chomhad cumraíochta JSON (roghnach)",
"gui_drag_and_drop": "Tarraing agus scaoil comhaid agus fillteáin\nchun iad a chomhroinnt",
@@ -37,12 +37,12 @@
"gui_choose_items": "Roghnaigh",
"gui_share_start_server": "Comhroinn",
"gui_share_stop_server": "Stop ag comhroinnt",
- "gui_share_stop_server_shutdown_timeout": "Stop ag Comhroinnt ({}s fágtha)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Amadóir uathstoptha caite {}",
+ "gui_share_stop_server_autostop_timer": "Stop ag Comhroinnt ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Amadóir uathstoptha caite {}",
"gui_receive_start_server": "Tosaigh an Mód Glactha",
"gui_receive_stop_server": "Stop an Mód Glactha",
- "gui_receive_stop_server_shutdown_timeout": "Stop an Mód Glactha ({}s fágtha)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Amadóir uathstoptha caite {}",
+ "gui_receive_stop_server_autostop_timer": "Stop an Mód Glactha ({} fágtha)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Amadóir uathstoptha caite {}",
"gui_copy_url": "Cóipeáil an Seoladh",
"gui_copy_hidservauth": "Cóipeáil HidServAuth",
"gui_downloads": "Stair Íoslódála",
@@ -68,8 +68,8 @@
"error_ephemeral_not_supported": "Teastaíonn uait ar a laghad Tor 0.2.7.1 agus python3-stem 1.4.0 chun OnionShare a úsáid.",
"gui_settings_window_title": "Socruithe",
"gui_settings_whats_this": "<a href='{0:s}'>Cad é seo</a>",
- "gui_settings_stealth_option": "Úsáid údarú cliaint (seanleagan)",
- "gui_settings_stealth_hidservauth_string": "Toisc gur shábháil tú d'eochair phríobháideach, anois is féidir leat\ncliceáil chun an HidServAuth a chóipeáil.",
+ "gui_settings_stealth_option": "Úsáid údarú cliaint",
+ "gui_settings_stealth_hidservauth_string": "Toisc gur shábháil tú d'eochair phríobháideach, anois is féidir leat cliceáil chun an HidServAuth a chóipeáil.",
"gui_settings_autoupdate_label": "Lorg nuashonruithe",
"gui_settings_autoupdate_option": "Cuir in iúl dom nuair a bheidh leagan nua ar fáil",
"gui_settings_autoupdate_timestamp": "Seiceáilte: {}",
@@ -77,7 +77,7 @@
"gui_settings_autoupdate_check_button": "Lorg Nuashonrú",
"gui_settings_general_label": "Socruithe ginearálta",
"gui_settings_sharing_label": "Socruithe comhroinnte",
- "gui_settings_close_after_first_download_option": "Stop ag comhroinnt tar éis an chéad íoslódáil",
+ "gui_settings_close_after_first_download_option": "Stop ag comhroinnt tar éis na comhaid a sheoladh",
"gui_settings_connection_type_label": "Cén chaoi ar chóir do OnionShare ceangal le Tor?",
"gui_settings_connection_type_bundled_option": "Úsáid an leagan de Tor ionsuite in OnionShare",
"gui_settings_connection_type_automatic_option": "Déan cumraíocht uathoibríoch le Brabhsálaí Tor",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "Sábháil",
"gui_settings_button_cancel": "Cealaigh",
"gui_settings_button_help": "Cabhair",
- "gui_settings_shutdown_timeout_checkbox": "Úsáid amadóir uathstoptha",
- "gui_settings_shutdown_timeout": "Stop ag comhroinnt ag:",
+ "gui_settings_autostop_timer_checkbox": "Úsáid an t-amadóir uathstoptha",
+ "gui_settings_autostop_timer": "Stop ag comhroinnt ag:",
"settings_error_unknown": "Ní féidir ceangal a bhunú leis an rialaitheoir Tor toisc nach féidir linn ciall a bhaint as na socruithe.",
"settings_error_automatic": "Níorbh fhéidir ceangal a bhunú leis an rialaitheoir Tor. An bhfuil Brabhsálaí Tor (ar fáil ó torproject.org) ag rith sa gcúlra?",
"settings_error_socket_port": "Ní féidir ceangal a bhunú leis an rialaitheoir Tor ag {}:{}.",
@@ -131,11 +131,11 @@
"gui_tor_connection_error_settings": "Bain triail as na socruithe líonra a athrú chun ceangal le líonra Tor ó OnionShare.",
"gui_tor_connection_canceled": "Níorbh fhéidir ceangal a bhunú le Tor.\n\nDeimhnigh go bhfuil tú ceangailte leis an Idirlíon, ansin oscail OnionShare arís agus socraigh an ceangal le Tor.",
"gui_tor_connection_lost": "Dícheangailte ó Tor.",
- "gui_server_started_after_timeout": "Bhí an t-amadóir uathstoptha caite sular thosaigh an freastalaí.\nCaithfidh tú comhroinnt nua a chruthú.",
- "gui_server_timeout_expired": "Tá an t-amadóir uathstoptha caite cheana.\nCaithfidh tú é a athshocrú sular féidir leat comhaid a chomhroinnt.",
+ "gui_server_started_after_autostop_timer": "Bhí an t-amadóir uathstoptha caite sular thosaigh an freastalaí. Caithfidh tú comhroinnt nua a chruthú.",
+ "gui_server_autostop_timer_expired": "Tá an t-amadóir uathstoptha caite cheana. Caithfidh tú é a athshocrú sular féidir leat comhaid a chomhroinnt.",
"share_via_onionshare": "Comhroinn trí OnionShare é",
"gui_use_legacy_v2_onions_checkbox": "Úsáid seoltaí sean-nóis",
- "gui_save_private_key_checkbox": "Úsáid seoladh seasmhach (seanleagan)",
+ "gui_save_private_key_checkbox": "Úsáid seoladh seasmhach",
"gui_share_url_description": "Tá <b>aon duine</b> a bhfuil an seoladh OnionShare aige/aici in ann do chuid comhad a <b>íoslódáil</b> le <b>Brabhsálaí Tor</b>: <img src='{}' />",
"gui_receive_url_description": "Tá <b>aon duine</b> a bhfuil an seoladh OnionShare aige/aici in ann comhaid a <b>uaslódáil</b> go dtí do ríomhaire le <b>Brabhsálaí Tor</b>: <img src='{}' />",
"gui_url_label_persistent": "Ní stopfaidh an chomhroinnt seo go huathoibríoch.<br><br>Úsáidfear an seoladh seo arís gach uair a dhéanfaidh tú comhroinnt. (Chun seoladh aon uaire a úsáid, múch \"Úsáid seoladh seasmhach\" sna socruithe.)",
@@ -169,7 +169,7 @@
"gui_settings_public_mode_checkbox": "Mód poiblí",
"systray_close_server_title": "Tá an freastalaí OnionShare dúnta",
"systray_close_server_message": "Dhún úsáideoir an freastalaí",
- "systray_page_loaded_title": "Lódáladh leathanach OnionShare",
+ "systray_page_loaded_title": "Lódáladh an leathanach",
"systray_download_page_loaded_message": "Lódáil úsáideoir an leathanach íoslódála",
"systray_upload_page_loaded_message": "Lódáil úsáideoir an leathanach uaslódála",
"gui_uploads": "Stair Uaslódála",
@@ -181,5 +181,32 @@
"gui_download_in_progress": "Tosaíodh an Íoslódáil {}",
"gui_open_folder_error_nautilus": "Ní féidir an fillteán a oscailt toisc nach bhfuil nautilus ar fáil. Tá an comhad anseo: {}",
"gui_settings_language_label": "Do rogha teanga",
- "gui_settings_language_changed_notice": "Atosaigh OnionShare chun an teanga nua a chur i bhfeidhm."
+ "gui_settings_language_changed_notice": "Atosaigh OnionShare chun an teanga nua a chur i bhfeidhm.",
+ "gui_add_files": "Cuir Comhaid Leis",
+ "gui_add_folder": "Cuir Fillteán Leis",
+ "gui_stop_server_autostop_timer_tooltip": "Críochnóidh an t-amadóir uathstoptha ag {}",
+ "gui_start_server_autostart_timer_tooltip": "Críochnóidh an t-amadóir uath-thosaithe ag {}",
+ "gui_waiting_to_start": "Tosóidh sé i gceann {}. Cliceáil lena chur ar ceal.",
+ "gui_settings_onion_label": "Socruithe Onion",
+ "gui_settings_autostart_timer_checkbox": "Úsáid an t-amadóir uath-thosaithe",
+ "gui_settings_autostart_timer": "Tosaigh ag comhroinnt ag:",
+ "gui_server_autostart_timer_expired": "Tá an t-am sceidealta caite cheana. Caithfidh tú é a nuashonrú chun comhaid a chomhroinnt.",
+ "gui_connect_to_tor_for_onion_settings": "Ceangail le Tor chun socruithe na seirbhíse onion a fheiceáil",
+ "gui_status_indicator_share_scheduled": "Sceidealaithe…",
+ "gui_status_indicator_receive_scheduled": "Sceidealaithe…",
+ "error_cannot_create_data_dir": "Níorbh fhéidir fillteán sonraí OnionShare a chruthú: {}",
+ "gui_settings_data_dir_label": "Sábháil comhaid i",
+ "gui_settings_data_dir_browse_button": "Brabhsáil",
+ "systray_page_loaded_message": "Lódáladh an seoladh OnionShare",
+ "systray_share_started_title": "Tosaíodh an Chomhroinnt",
+ "systray_share_started_message": "Seoladh na gcomhad á thosú",
+ "systray_share_completed_title": "Comhroinnt curtha i gcrích",
+ "systray_receive_started_message": "Tá duine éigin ag seoladh comhad chugat",
+ "gui_all_modes_history": "Stair",
+ "gui_all_modes_clear_history": "Glan Uile",
+ "gui_all_modes_transfer_started": "Tosaithe {}",
+ "gui_all_modes_transfer_finished_range": "Aistrithe {} - {}",
+ "gui_all_modes_transfer_finished": "Aistrithe {}",
+ "gui_all_modes_transfer_canceled_range": "Cealaithe {} - {}",
+ "gui_all_modes_transfer_canceled": "Cealaithe {}"
}
diff --git a/share/locale/gu.json b/share/locale/gu.json
index 8ebfc5fb..bd855bf9 100644
--- a/share/locale/gu.json
+++ b/share/locale/gu.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"timeout_upload_still_running": "",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -38,12 +38,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -105,8 +105,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -132,8 +132,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/he.json b/share/locale/he.json
index 11c255f6..07840429 100644
--- a/share/locale/he.json
+++ b/share/locale/he.json
@@ -10,12 +10,12 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"timeout_upload_still_running": "",
"large_filesize": "",
- "systray_menu_exit": "",
+ "systray_menu_exit": "יציאה",
"systray_download_started_title": "",
"systray_download_started_message": "",
"systray_download_completed_title": "",
@@ -26,31 +26,31 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
- "gui_add": "",
+ "gui_add": "הוסף",
"gui_add_files": "",
"gui_add_folder": "",
- "gui_delete": "",
- "gui_choose_items": "",
+ "gui_delete": "מחיקה",
+ "gui_choose_items": "בחירה",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
"gui_no_downloads": "",
- "gui_canceled": "",
+ "gui_canceled": "Canceled",
"gui_copied_url_title": "",
"gui_copied_url": "",
"gui_copied_hidservauth_title": "",
@@ -63,22 +63,22 @@
"gui_quit_title": "",
"gui_share_quit_warning": "",
"gui_receive_quit_warning": "",
- "gui_quit_warning_quit": "",
- "gui_quit_warning_dont_quit": "",
+ "gui_quit_warning_quit": "יציאה",
+ "gui_quit_warning_dont_quit": "ביטול",
"error_rate_limit": "",
"zip_progress_bar_format": "",
"error_stealth_not_supported": "",
"error_ephemeral_not_supported": "",
- "gui_settings_window_title": "",
+ "gui_settings_window_title": "הגדרות",
"gui_settings_whats_this": "",
"gui_settings_stealth_option": "",
"gui_settings_stealth_hidservauth_string": "",
- "gui_settings_autoupdate_label": "",
+ "gui_settings_autoupdate_label": "בדיקה לאיתור גרסה חדשה",
"gui_settings_autoupdate_option": "",
"gui_settings_autoupdate_timestamp": "",
- "gui_settings_autoupdate_timestamp_never": "",
+ "gui_settings_autoupdate_timestamp_never": "לעולם לא",
"gui_settings_autoupdate_check_button": "",
- "gui_settings_general_label": "",
+ "gui_settings_general_label": "הגדרות כלליות",
"gui_settings_sharing_label": "",
"gui_settings_close_after_first_download_option": "",
"gui_settings_connection_type_label": "",
@@ -87,13 +87,13 @@
"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_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_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": "",
@@ -104,11 +104,11 @@
"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_save": "שמור",
+ "gui_settings_button_cancel": "ביטול",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -129,13 +129,13 @@
"update_error_invalid_latest_version": "",
"update_not_available": "",
"gui_tor_connection_ask": "",
- "gui_tor_connection_ask_open_settings": "",
- "gui_tor_connection_ask_quit": "",
+ "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_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_connect_to_tor_for_onion_settings": "",
"gui_use_legacy_v2_onions_checkbox": "",
@@ -151,7 +151,7 @@
"gui_status_indicator_share_started": "",
"gui_status_indicator_receive_stopped": "",
"gui_status_indicator_receive_working": "",
- "gui_status_indicator_receive_started": "",
+ "gui_status_indicator_receive_started": "במהלך קבלה",
"gui_file_info": "",
"gui_file_info_single": "",
"history_in_progress_tooltip": "",
@@ -184,5 +184,8 @@
"gui_download_in_progress": "",
"gui_open_folder_error_nautilus": "",
"gui_settings_language_label": "",
- "gui_settings_language_changed_notice": ""
+ "gui_settings_language_changed_notice": "",
+ "gui_settings_data_dir_browse_button": "עיין",
+ "gui_all_modes_history": "היסטוריה",
+ "gui_all_modes_clear_history": "למחוק הכול"
}
diff --git a/share/locale/hi.json b/share/locale/hi.json
new file mode 100644
index 00000000..8cc4612c
--- /dev/null
+++ b/share/locale/hi.json
@@ -0,0 +1,184 @@
+{
+ "config_onion_service": "",
+ "preparing_files": "",
+ "give_this_url": "",
+ "give_this_url_stealth": "",
+ "give_this_url_receive": "",
+ "give_this_url_receive_stealth": "",
+ "ctrlc_to_stop": "",
+ "not_a_file": "",
+ "not_a_readable_file": "",
+ "no_available_port": "",
+ "other_page_loaded": "",
+ "close_on_autostop_timer": "",
+ "closing_automatically": "",
+ "large_filesize": "",
+ "help_local_only": "",
+ "help_stay_open": "",
+ "help_autostop_timer": "",
+ "help_stealth": "",
+ "help_receive": "",
+ "help_verbose": "",
+ "help_filename": "",
+ "help_config": "",
+ "gui_drag_and_drop": "",
+ "gui_add": "जोड़ें",
+ "gui_add_files": "",
+ "gui_add_folder": "",
+ "gui_delete": "हटाएं",
+ "gui_choose_items": "चुनें",
+ "gui_share_start_server": "",
+ "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_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
+ "gui_copy_url": "",
+ "gui_copy_hidservauth": "",
+ "gui_canceled": "Canceled",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "gui_copied_hidservauth_title": "",
+ "gui_copied_hidservauth": "",
+ "gui_please_wait": "",
+ "version_string": "",
+ "gui_quit_title": "",
+ "gui_share_quit_warning": "",
+ "gui_receive_quit_warning": "",
+ "gui_quit_warning_quit": "छोड़ें",
+ "gui_quit_warning_dont_quit": "रद्द करे",
+ "error_rate_limit": "",
+ "zip_progress_bar_format": "",
+ "error_stealth_not_supported": "",
+ "error_ephemeral_not_supported": "",
+ "gui_settings_window_title": "सेटिंग",
+ "gui_settings_whats_this": "",
+ "gui_settings_stealth_option": "",
+ "gui_settings_stealth_hidservauth_string": "",
+ "gui_settings_autoupdate_label": "",
+ "gui_settings_autoupdate_option": "",
+ "gui_settings_autoupdate_timestamp": "अंतिम जाँच %1",
+ "gui_settings_autoupdate_timestamp_never": "कभी नहीँ",
+ "gui_settings_autoupdate_check_button": "",
+ "gui_settings_general_label": "जनरल सेटिंग्स",
+ "gui_settings_onion_label": "",
+ "gui_settings_sharing_label": "",
+ "gui_settings_close_after_first_download_option": "",
+ "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": "मदद",
+ "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": "",
+ "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": "",
+ "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": "",
+ "share_via_onionshare": "",
+ "gui_connect_to_tor_for_onion_settings": "",
+ "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": "",
+ "error_cannot_create_data_dir": "",
+ "receive_mode_data_dir": "",
+ "receive_mode_warning": "",
+ "gui_receive_mode_warning": "",
+ "receive_mode_upload_starting": "",
+ "receive_mode_received_file": "",
+ "gui_mode_share_button": "",
+ "gui_mode_receive_button": "",
+ "gui_settings_receiving_label": "",
+ "gui_settings_data_dir_label": "",
+ "gui_settings_data_dir_browse_button": "ब्राउज़",
+ "gui_settings_public_mode_checkbox": "",
+ "gui_open_folder_error_nautilus": "",
+ "gui_settings_language_label": "",
+ "gui_settings_language_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_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_progress_starting": "",
+ "gui_all_modes_progress_eta": "",
+ "gui_share_mode_no_files": "",
+ "gui_share_mode_autostop_timer_waiting": "",
+ "gui_receive_mode_no_files": "",
+ "gui_receive_mode_autostop_timer_waiting": ""
+}
diff --git a/share/locale/hu.json b/share/locale/hu.json
index 34cc480b..e84d0e64 100644
--- a/share/locale/hu.json
+++ b/share/locale/hu.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"large_filesize": "",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -37,12 +37,12 @@
"gui_choose_items": "Kiválaszt",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "Mentés",
"gui_settings_button_cancel": "Megszakítás",
"gui_settings_button_help": "Súgó",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/id.json b/share/locale/id.json
index 0557aca9..c40ada6b 100644
--- a/share/locale/id.json
+++ b/share/locale/id.json
@@ -1,19 +1,19 @@
{
- "config_onion_service": "",
- "preparing_files": "",
- "give_this_url": "",
- "give_this_url_stealth": "",
- "give_this_url_receive": "",
- "give_this_url_receive_stealth": "",
- "ctrlc_to_stop": "",
- "not_a_file": "",
- "not_a_readable_file": "",
- "no_available_port": "",
- "other_page_loaded": "",
- "close_on_timeout": "",
- "closing_automatically": "",
+ "config_onion_service": "Mengatur layanan onion pada port {0:d}.",
+ "preparing_files": "Mengompresi berkas-berkas.",
+ "give_this_url": "Beri alamat ini kepada penerima:",
+ "give_this_url_stealth": "Beri alamat ini dan baris HidServAuth kepada penerima:",
+ "give_this_url_receive": "Beri alamat ini kepada pengirim:",
+ "give_this_url_receive_stealth": "Beri alamat ini dan HidServAuth kepada pengirim:",
+ "ctrlc_to_stop": "Tekan Ctrl+C untuk menghentikan peladen",
+ "not_a_file": "{0:s} bukan berkas yang sah.",
+ "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": "",
+ "closing_automatically": "Terhenti karena transfer telah tuntas",
"timeout_download_still_running": "",
- "large_filesize": "",
+ "large_filesize": "Peringatan: Mengirim dalam jumlah besar dapat memakan waktu berjam-jam",
"systray_menu_exit": "Keluar",
"systray_download_started_title": "",
"systray_download_started_message": "",
@@ -23,74 +23,74 @@
"systray_download_canceled_message": "",
"systray_upload_started_title": "",
"systray_upload_started_message": "",
- "help_local_only": "",
- "help_stay_open": "",
- "help_shutdown_timeout": "",
- "help_stealth": "",
+ "help_local_only": "Tidak menggunakan Tor (hanya untuk pengembangan)",
+ "help_stay_open": "Lanjutkan berbagi setelah berkas telah terkirim",
+ "help_autostop_timer": "Berhenti berbagi setelah beberapa detik",
+ "help_stealth": "Gunakan otorisasi klien (lanjutan)",
"help_receive": "",
- "help_debug": "",
- "help_filename": "",
+ "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": "",
+ "gui_drag_and_drop": "Seret dan lepas berkas dan folder\nuntuk mulai berbagi",
"gui_add": "Tambahkan",
"gui_delete": "Hapus",
"gui_choose_items": "Pilih",
- "gui_share_start_server": "",
- "gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
- "gui_receive_start_server": "",
- "gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
- "gui_copy_url": "",
- "gui_copy_hidservauth": "",
+ "gui_share_start_server": "Mulai berbagi",
+ "gui_share_stop_server": "Berhenti berbagi",
+ "gui_share_stop_server_autostop_timer": "Berhenti Berbagi ({}d tersisa)",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
+ "gui_receive_start_server": "Mulai Mode Menerima",
+ "gui_receive_stop_server": "Menghentikan Mode Menerima",
+ "gui_receive_stop_server_autostop_timer": "Menghentikan Mode Menerima ({} tersisa)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
+ "gui_copy_url": "Salin Alamat",
+ "gui_copy_hidservauth": "Salin HidServAuth",
"gui_downloads": "",
"gui_no_downloads": "",
"gui_canceled": "Dibatalkan",
- "gui_copied_url_title": "",
- "gui_copied_url": "",
- "gui_copied_hidservauth_title": "",
- "gui_copied_hidservauth": "",
- "gui_please_wait": "",
+ "gui_copied_url_title": "Alamat OnionShare disalin",
+ "gui_copied_url": "Alamat OnionShare disalin ke papan klip",
+ "gui_copied_hidservauth_title": "HidServAuth disalin",
+ "gui_copied_hidservauth": "Baris HidServAuth disalin ke papan klip",
+ "gui_please_wait": "Memulai... Klik untuk membatalkan.",
"gui_download_upload_progress_complete": "",
"gui_download_upload_progress_starting": "",
"gui_download_upload_progress_eta": "",
- "version_string": "",
- "gui_quit_title": "",
- "gui_share_quit_warning": "",
- "gui_receive_quit_warning": "",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Tidak begitu cepat",
+ "gui_share_quit_warning": "Anda sedang dalam proses pengiriman berkas. Apakah Anda yakin ingin menghentikan OnionShare?",
+ "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": "",
- "zip_progress_bar_format": "",
- "error_stealth_not_supported": "",
- "error_ephemeral_not_supported": "",
+ "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.",
"gui_settings_window_title": "Pengaturan",
- "gui_settings_whats_this": "",
- "gui_settings_stealth_option": "",
- "gui_settings_stealth_hidservauth_string": "",
- "gui_settings_autoupdate_label": "",
- "gui_settings_autoupdate_option": "",
- "gui_settings_autoupdate_timestamp": "",
- "gui_settings_autoupdate_timestamp_never": "Tak pernah",
- "gui_settings_autoupdate_check_button": "",
+ "gui_settings_whats_this": "<a href='{0:s}'>Apakah ini?</a>",
+ "gui_settings_stealth_option": "Gunakan otorisasi klien",
+ "gui_settings_stealth_hidservauth_string": "Telah menyimpan kunci privat Anda untuk digunakan kembali, berarti Anda dapat klik untuk menyalin HidServAuth Anda.",
+ "gui_settings_autoupdate_label": "Periksa versi terbaru",
+ "gui_settings_autoupdate_option": "Beritahu saya ketika versi baru tersedia",
+ "gui_settings_autoupdate_timestamp": "Terakhir diperiksa: {}",
+ "gui_settings_autoupdate_timestamp_never": "Tidak pernah",
+ "gui_settings_autoupdate_check_button": "Periksa Versi Terbaru",
"gui_settings_general_label": "Pengaturan umum",
- "gui_settings_sharing_label": "",
- "gui_settings_close_after_first_download_option": "",
- "gui_settings_connection_type_label": "",
+ "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_automatic_option": "",
- "gui_settings_connection_type_control_port_option": "",
+ "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_test_button": "",
+ "gui_settings_connection_type_test_button": "Menguji sambungan ke Tor",
"gui_settings_control_port_label": "Port kontrol",
- "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_socket_file_label": "Berkas soket",
+ "gui_settings_socks_label": "Porta SOCKS",
+ "gui_settings_authenticate_label": "Pengaturan otentikasi Tor",
+ "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": "",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "Simpan",
"gui_settings_button_cancel": "Batal",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
@@ -181,5 +181,8 @@
"gui_download_in_progress": "",
"gui_open_folder_error_nautilus": "",
"gui_settings_language_label": "",
- "gui_settings_language_changed_notice": ""
+ "gui_settings_language_changed_notice": "",
+ "gui_add_files": "Tambahkan berkas",
+ "gui_add_folder": "Tambahkan Folder",
+ "gui_settings_onion_label": "Pengaturan Onion"
}
diff --git a/share/locale/is.json b/share/locale/is.json
index 85b492ab..2c4f7182 100644
--- a/share/locale/is.json
+++ b/share/locale/is.json
@@ -1,19 +1,19 @@
{
- "config_onion_service": "",
- "preparing_files": "",
- "give_this_url": "",
- "give_this_url_stealth": "",
- "give_this_url_receive": "",
- "give_this_url_receive_stealth": "",
- "ctrlc_to_stop": "",
- "not_a_file": "",
- "not_a_readable_file": "",
- "no_available_port": "",
- "other_page_loaded": "",
- "close_on_timeout": "",
- "closing_automatically": "",
+ "config_onion_service": "Set upp onion-þjónustu á gátt {0:d}.",
+ "preparing_files": "Þjappa skrám.",
+ "give_this_url": "Láttu viðtakandann hafa þetta vistfang:",
+ "give_this_url_stealth": "Láttu viðtakandann hafa þetta vistfang ásamt línunni með HidServAuth:",
+ "give_this_url_receive": "Láttu sendandann hafa þetta vistfang:",
+ "give_this_url_receive_stealth": "Láttu sendandann hafa þetta vistfang ásamt línunni með HidServAuth:",
+ "ctrlc_to_stop": "Ýttu á Ctrl+C til að stöðva þjóninn",
+ "not_a_file": "{0:s} er ekki gild skrá.",
+ "not_a_readable_file": "{0:s} er ekki læsileg skrá.",
+ "no_available_port": "Fann ekki tiltæka gátt til að hefja á onion-þjónustuna",
+ "other_page_loaded": "Vistfangi hlaðið inn",
+ "close_on_autostop_timer": "Stöðvað vegna þess að sjálfvirk niðurtalning endaði",
+ "closing_automatically": "Stöðvað vegna þess að flutningi er lokið",
"timeout_download_still_running": "",
- "large_filesize": "",
+ "large_filesize": "Aðvörun: að senda stóra skrá getur tekið klukkustundir",
"systray_menu_exit": "Hætta",
"systray_download_started_title": "",
"systray_download_started_message": "",
@@ -23,153 +23,152 @@
"systray_download_canceled_message": "",
"systray_upload_started_title": "",
"systray_upload_started_message": "",
- "help_local_only": "",
- "help_stay_open": "",
- "help_shutdown_timeout": "",
- "help_stealth": "",
- "help_receive": "",
- "help_debug": "",
- "help_filename": "",
- "help_config": "",
- "gui_drag_and_drop": "",
- "gui_add": "",
- "gui_delete": "",
- "gui_choose_items": "",
- "gui_share_start_server": "",
- "gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
- "gui_receive_start_server": "",
- "gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
- "gui_copy_url": "",
- "gui_copy_hidservauth": "",
+ "help_local_only": "Ekki nota Tor (einungis fyrir þróunarvinnu)",
+ "help_stay_open": "Halda áfram deilingu eftir að skrár hafa verið sendar",
+ "help_autostop_timer": "Hætta deilingu eftir tiltekinn fjölda sekúndna",
+ "help_stealth": "Nota auðkenningu biðlaraforrits (ítarlegt)",
+ "help_receive": "Taka á móti sameignum í staðinn fyrir að senda þær",
+ "help_debug": "Skrá OnionShare-villur í stdout og vefvillur á disk",
+ "help_filename": "Listi yfir skrár eða möppur sem á að deila",
+ "help_config": "Staðsetning sérsniðinnar JSON-stillingaskrár (valfrjálst)",
+ "gui_drag_and_drop": "Dragðu og slepptu skrám og möppum\ntil að hefja deilingu",
+ "gui_add": "Bæta við",
+ "gui_delete": "Eyða",
+ "gui_choose_items": "Veldu",
+ "gui_share_start_server": "Hefja deilingu",
+ "gui_share_stop_server": "Hætta deilingu",
+ "gui_share_stop_server_autostop_timer": "Hætta deilingu ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Sjálfvirk niðurtalning endar {}",
+ "gui_receive_start_server": "Byrja í móttökuham",
+ "gui_receive_stop_server": "Hætta í móttökuham",
+ "gui_receive_stop_server_autostop_timer": "Hætta í móttökuham ({} eftir)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Sjálfvirk niðurtalning endar {}",
+ "gui_copy_url": "Afrita vistfang",
+ "gui_copy_hidservauth": "Afrita HidServAuth",
"gui_downloads": "",
"gui_no_downloads": "",
- "gui_canceled": "",
- "gui_copied_url_title": "",
- "gui_copied_url": "",
- "gui_copied_hidservauth_title": "",
- "gui_copied_hidservauth": "",
- "gui_please_wait": "",
+ "gui_canceled": "Hætt við",
+ "gui_copied_url_title": "Afritaði OnionShare-vistfang",
+ "gui_copied_url": "OnionShare-vistfang afritað á klippispjald",
+ "gui_copied_hidservauth_title": "Afritaði HidServAuth",
+ "gui_copied_hidservauth": "HidServAuth-lína afrituð á klippispjald",
+ "gui_please_wait": "Ræsi... Smelltu til að hætta við.",
"gui_download_upload_progress_complete": "",
"gui_download_upload_progress_starting": "",
"gui_download_upload_progress_eta": "",
- "version_string": "",
- "gui_quit_title": "",
- "gui_share_quit_warning": "",
- "gui_receive_quit_warning": "",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Ekki svona snöggt",
+ "gui_share_quit_warning": "Þú ert að senda skrár. Ertu viss um að þú viljir hætta í OnionShare?",
+ "gui_receive_quit_warning": "Þú ert að taka á móti skrám. Ertu viss um að þú viljir hætta í OnionShare?",
"gui_quit_warning_quit": "Hætta",
- "gui_quit_warning_dont_quit": "",
- "error_rate_limit": "",
- "zip_progress_bar_format": "",
- "error_stealth_not_supported": "",
- "error_ephemeral_not_supported": "",
- "gui_settings_window_title": "",
- "gui_settings_whats_this": "",
- "gui_settings_stealth_option": "",
- "gui_settings_stealth_hidservauth_string": "",
- "gui_settings_autoupdate_label": "",
- "gui_settings_autoupdate_option": "",
- "gui_settings_autoupdate_timestamp": "",
+ "gui_quit_warning_dont_quit": "Hætta við",
+ "error_rate_limit": "Einhver hefur gert of margar rangar tilraunir með þínu vistfangi, sem þýðir að hann gæti verið að reyna að giska á það, þannig að OnionShare hefur stöðvað þjóninn. Byrjaðu deiling aftur og sendu viðtakandanum nýtt vistfang til deilingar.",
+ "zip_progress_bar_format": "Þjappa: %p%",
+ "error_stealth_not_supported": "Til að nota biðlaraauðkenningu þarf a.m.k. bæði Tor 0.2.9.1-Alpha (eða Tor Browser 6,5) og python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare krefst a.m.k. bæði Tor 0.2.7.1 og python3-stem 1.4.0.",
+ "gui_settings_window_title": "Stillingar",
+ "gui_settings_whats_this": "<a href='{0:s}'>Hvað er þetta?</a>",
+ "gui_settings_stealth_option": "Nota auðkenningu biðlaraforrits",
+ "gui_settings_stealth_hidservauth_string": "Ef þú hefur vistað einkalykil til endurnotkunar, þýðir að þú getur nú smellt til að afrita HidServAuth.",
+ "gui_settings_autoupdate_label": "Athuga með nýja útgáfu",
+ "gui_settings_autoupdate_option": "Láta vita þegar ný útgáfa er tiltæk",
+ "gui_settings_autoupdate_timestamp": "Síðast athugað: {}",
"gui_settings_autoupdate_timestamp_never": "Aldrei",
- "gui_settings_autoupdate_check_button": "",
+ "gui_settings_autoupdate_check_button": "Athuga með nýjar útgáfur",
"gui_settings_general_label": "Almennar stillingar",
- "gui_settings_sharing_label": "",
- "gui_settings_close_after_first_download_option": "",
- "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": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
- "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": "",
- "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": "",
+ "gui_settings_sharing_label": "Stillingar deilingar",
+ "gui_settings_close_after_first_download_option": "Hætta deilingu eftir að skrár hafa verið sendar",
+ "gui_settings_connection_type_label": "Hvernig ætti OnionShare að tengjast við Tor?",
+ "gui_settings_connection_type_bundled_option": "Nota Tor útgáfuna sem er innbyggð í OnionShare",
+ "gui_settings_connection_type_automatic_option": "Reyna sjálfvirka uppsetningu með Tor-vafranum",
+ "gui_settings_connection_type_control_port_option": "Tengjast með stýrigátt",
+ "gui_settings_connection_type_socket_file_option": "Tengjast með sökkulskrá",
+ "gui_settings_connection_type_test_button": "Prófa tengingu við Tor",
+ "gui_settings_control_port_label": "Stýrigátt",
+ "gui_settings_socket_file_label": "Sökkulskrá",
+ "gui_settings_socks_label": "SOCKS-gátt",
+ "gui_settings_authenticate_label": "Auðkenningarstillingar Tor",
+ "gui_settings_authenticate_no_auth_option": "Engin auðkenning eða auðkenning með vefköku",
+ "gui_settings_authenticate_password_option": "Lykilorð",
+ "gui_settings_password_label": "Lykilorð",
+ "gui_settings_tor_bridges": "Stuðningur við Tor-brýr",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Ekki nota brýr",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Nota innbyggðar obfs4 'pluggable transport' tengileiðir",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Nota innbyggðar obfs4 'pluggable transport' tengileiðir (þarfnast obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Nota innbyggðar meek_lite (Azure) 'pluggable transport' tengileiðir",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Nota innbyggðar meek_lite (Azure) 'pluggable transport' tengileiðir (þarfnast obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Aðvörun: Að reka meek_lite brýrnar er kostnaðarsamt fyrir Tor-verkefnið.<br><br>Ekki nota þær nema þér takist ekki að tengjast beint við Tor, með obfs4 tengileið, eða öðrum venjulegum brúm.",
+ "gui_settings_tor_bridges_custom_radio_option": "Nota sérsniðnar brýr",
+ "gui_settings_tor_bridges_custom_label": "Þú getur náð í brýr frá <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Engar af brúnum sem þú bættir við virka. \nYfirfarðu þær eða bættu öðrum við.",
+ "gui_settings_button_save": "Vista",
+ "gui_settings_button_cancel": "Hætta við",
+ "gui_settings_button_help": "Hjálp",
+ "gui_settings_autostop_timer_checkbox": "Nota sjálfvirka niðurtalningu",
+ "gui_settings_autostop_timer": "Stöðva deilinguna:",
+ "settings_error_unknown": "Gat ekki tengst við Tor-stýringu því engin glóra er í stillingunum þínum.",
+ "settings_error_automatic": "Ekki tókst að tengjast Tor-stýringunni. Er Tor-vafrinn (tiltækur á torproject.org) keyrandi í bakgrunni?",
+ "settings_error_socket_port": "Gat ekki tengst við Tor-stýringu á {}:{}.",
+ "settings_error_socket_file": "Gat ekki tengst við Tor-stýringu með sökkulskrá á {}:{}.",
+ "settings_error_auth": "Tengt við {}:{}, en get ekki auðkennt. Kannski er þetta ekki Tor-stýring?",
+ "settings_error_missing_password": "Tengt við Tor-stýringu, en hún krefst lykilorðs fyrir auðkenningu.",
+ "settings_error_unreadable_cookie_file": "Tengt við Tor-stýringuna, en lykilorðið gæti verið rangt eða að notandinn þinn hafi ekki heimild til að lesa vefkökuskrána.",
+ "settings_error_bundled_tor_not_supported": "Sé notuð Tor útgáfan sem er innbyggð í OnionShare, virkar hún ekki í þróunarham á Windows eða macOS.",
+ "settings_error_bundled_tor_timeout": "Það tekur of langan tíma að tengjast við Tor. Kannski er ekki tenging við internetið, nú eða að klukka kerfisins sé ekki rétt stillt?",
+ "settings_error_bundled_tor_broken": "OnionShare gat ekki tengst við Tor í bakgrunni:\n{}",
+ "settings_test_success": "Tengt við Tor-stýringuna.\n\nTor útgáfa: {}\nStyður stuttlifandi onion-þjónustur: {}.\nStyður auðkenningu biðlaraforrits: {}.\nStyður næstu-kynslóðar .onion vistföng: {}.",
+ "error_tor_protocol_error": "Það kom upp villa í Tor: {}",
+ "error_tor_protocol_error_unknown": "Það kom uppóþekkt villa varðandi Tor",
+ "error_invalid_private_key": "Þessi gerð einkalykils er ekki studd",
+ "connecting_to_tor": "Tengist við Tor-netkerfið",
+ "update_available": "Ný útgáfa OnionShare er komin út. <a href='{}'>Smelltu hér</a> til að ná í hana.<br><br>Þú ert að nota útgáfu {} og sú nýjasta er {}.",
+ "update_error_check_error": "Gat ekki athugað með nýjar uppfærslur: vefsvæði OnionShare tilkynnir að nýjasta útgáfan sé hin óskiljanlega '{}'…",
+ "update_error_invalid_latest_version": "Gat ekki athugað með nýjar uppfærslur: mögulega ertu ekki tengd(ur) við Tor eða að vefsvæði OnionShare sé óvirkt í augnablikinu?",
+ "update_not_available": "Þú ert þegar að keyra nýjustu útgáfu OnionShare.",
+ "gui_tor_connection_ask": "Opna stillingarnar til að ráða fram úr tengingu við Tor?",
"gui_tor_connection_ask_open_settings": "Já",
"gui_tor_connection_ask_quit": "Hætta",
- "gui_tor_connection_error_settings": "",
- "gui_tor_connection_canceled": "",
- "gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
- "share_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_tor_connection_error_settings": "Prófaðu að breyta í stillingunum hvernig OnionShare tengist við Tor-netkerfið.",
+ "gui_tor_connection_canceled": "Tókst ekki að tengjast Tor.\n\nGakktu úr skugga um að þú sért tengdur internetinu, opnaðu síðan aftur OnionShare og settu upp tengingu þess við Tor.",
+ "gui_tor_connection_lost": "Aftengt frá Tor.",
+ "gui_server_autostop_timer_expired": "Sjálfvirkri niðurtalningu er þegar lokið. Uppfærðu hana til að hefja deilingu.",
+ "share_via_onionshare": "Deila þessu með OnionShare",
+ "gui_use_legacy_v2_onions_checkbox": "Nota eldri vistföng",
+ "gui_save_private_key_checkbox": "Nota viðvarandi vistföng",
+ "gui_share_url_description": "<b>Hver sem er</b> með þetta OnionShare vistfang getur <b>sótt</b> skrárnar þínar með því að nota <b>Tor-vafrann</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Hver sem er</b> með þetta OnionShare vistfang getur <b>sent skrár inn</b> á tölvuna þína með því að nota <b>Tor-vafrann</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Deiling þessarar sameignar mun ekki stöðvast sjálfvirkt.<br><br>Allar deilingar sem á eftir koma munu endurnýta vistfangið. (Til að nota eins-skiptis vistföng skaltu slökkva á \"Nota viðvarandi vistföng\" í stillingunum.)",
+ "gui_url_label_stay_open": "Deiling þessarar sameignar mun ekki stöðvast sjálfvirkt.",
+ "gui_url_label_onetime": "Deiling þessarar sameignar mun stöðvast eftir fyrstu klárun.",
+ "gui_url_label_onetime_and_persistent": "Deiling þessarar sameignar mun ekki stöðvast sjálfvirkt.<br><br>Allar deilingar sem á eftir koma munu endurnýta vistfangið. (Til að nota eins-skiptis vistföng skaltu slökkva á \"Nota viðvarandi vistföng\" í stillingunum.)",
+ "gui_status_indicator_share_stopped": "Tilbúið til að deila",
+ "gui_status_indicator_share_working": "Ræsi…",
+ "gui_status_indicator_share_started": "Deiling",
+ "gui_status_indicator_receive_stopped": "Tilbúið til að taka við",
+ "gui_status_indicator_receive_working": "Ræsi…",
+ "gui_status_indicator_receive_started": "Tek á móti",
+ "gui_file_info": "{} skrár, {}",
+ "gui_file_info_single": "{} skrá, {}",
+ "history_in_progress_tooltip": "{} í vinnslu",
+ "history_completed_tooltip": "{} lokið",
"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": "",
- "receive_mode_upload_starting": "",
- "receive_mode_received_file": "",
- "gui_mode_share_button": "",
- "gui_mode_receive_button": "",
- "gui_settings_receiving_label": "",
+ "receive_mode_warning": "Aðvörun: móttökuhamur leyfir fólk að hlaða skrám inn á tölvuna þína. Sumar skrár geta hugsanlega tekið yfir stjórn á tölvunni ef þær eru opnaðar. Ekki opna hluti nema frá fólki sem þú treystir, eða ef þú veist raunverulega hvað þú ert að gera.",
+ "gui_receive_mode_warning": "Móttökuhamur leyfir fólk að hlaða skrám inn á tölvuna þína. <br><br><b>Sumar skrár geta hugsanlega tekið yfir stjórn á tölvunni ef þær eru opnaðar. Ekki opna hluti nema frá fólki sem þú treystir, eða ef þú veist raunverulega hvað þú ert að gera.</b>",
+ "receive_mode_upload_starting": "Innsending alls {} er að ræsast",
+ "receive_mode_received_file": "Móttekið: {}",
+ "gui_mode_share_button": "Deila skrám",
+ "gui_mode_receive_button": "Taka á móti skrám",
+ "gui_settings_receiving_label": "Stillingar á móttöku",
"gui_settings_downloads_label": "",
"gui_settings_downloads_button": "Flakka",
"gui_settings_receive_allow_receiver_shutdown_checkbox": "",
- "gui_settings_public_mode_checkbox": "",
+ "gui_settings_public_mode_checkbox": "Opinber hamur",
"systray_close_server_title": "",
"systray_close_server_message": "",
- "systray_page_loaded_title": "",
+ "systray_page_loaded_title": "Síða lesin inn",
"systray_download_page_loaded_message": "",
"systray_upload_page_loaded_message": "",
"gui_uploads": "",
@@ -179,7 +178,52 @@
"gui_upload_finished_range": "",
"gui_upload_finished": "",
"gui_download_in_progress": "",
- "gui_open_folder_error_nautilus": "",
- "gui_settings_language_label": "",
- "gui_settings_language_changed_notice": ""
+ "gui_open_folder_error_nautilus": "Get ekki opnað möppu því nautilus er ekki til taks. Skráin er hér: {}",
+ "gui_settings_language_label": "Umbeðið tungumál",
+ "gui_settings_language_changed_notice": "Þú þarft að endurræsa OnionShare til að breyting á tungumáli taki gildi.",
+ "gui_add_files": "Bæta við skrám",
+ "gui_add_folder": "Bæta við möppu",
+ "gui_settings_onion_label": "Onion-stillingar",
+ "gui_connect_to_tor_for_onion_settings": "Tengstu við Tor til að sjá stillingar onion-þjónustu",
+ "error_cannot_create_data_dir": "Gat ekki búið til OnionShare gagnamöppu: {}",
+ "receive_mode_data_dir": "Skrár sem þér eru sendar munu birtast í þessari möppu: {}",
+ "gui_settings_data_dir_label": "Vista skrár í",
+ "gui_settings_data_dir_browse_button": "Flakka",
+ "systray_page_loaded_message": "OnionShare-vistfang hlaðið inn",
+ "systray_share_started_title": "Deiling hafin",
+ "systray_share_started_message": "Byrja að senda skrár til einhvers",
+ "systray_share_completed_title": "Deilingu lokið",
+ "systray_share_completed_message": "Lokið við að senda skrár",
+ "systray_share_canceled_title": "Hætt við deilingu",
+ "systray_share_canceled_message": "Einhver hætti við að taka á móti skrám frá þér",
+ "systray_receive_started_title": "Móttaka hafin",
+ "systray_receive_started_message": "Einhver er að senda þér skrár",
+ "gui_all_modes_history": "Vinnsluferill",
+ "gui_all_modes_clear_history": "Hreinsa allt",
+ "gui_all_modes_transfer_started": "Ræsti {}",
+ "gui_all_modes_transfer_finished_range": "Færði {} - {}",
+ "gui_all_modes_transfer_finished": "Færði {}",
+ "gui_all_modes_transfer_canceled_range": "Hætt við {} - {}",
+ "gui_all_modes_transfer_canceled": "Hætt við {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} liðnar.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (reikna)",
+ "gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
+ "gui_share_mode_no_files": "Engar skrár sendar ennþá",
+ "gui_share_mode_autostop_timer_waiting": "Bíð þess að sendingu ljúki",
+ "gui_receive_mode_no_files": "Engar skrár mótteknar ennþá",
+ "gui_receive_mode_autostop_timer_waiting": "Bíð þess að móttöku ljúki",
+ "gui_stop_server_autostop_timer_tooltip": "Sjálfvirk niðurtalning endar kl. {}",
+ "gui_start_server_autostart_timer_tooltip": "Sjálfvirk ræsing endar kl. {}",
+ "gui_waiting_to_start": "Áætlað að ræsa eftir {}. Smelltu til að hætta við.",
+ "gui_settings_autostart_timer_checkbox": "Nota sjálfvirka niðurtalningu ræsingar",
+ "gui_settings_autostart_timer": "Byrja deilinguna:",
+ "gui_server_started_after_autostop_timer": "Sjálfvirka niðurtalningin rann út áður en þjónninn ræstist. Útbúðu nýja sameign.",
+ "gui_server_autostart_timer_expired": "Áætlaðri tímasetningu er þegar lokið. Uppfærðu hana til að hefja deilingu.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Tímasetning sjálfvirkrar lokaniðurtalningar má ekki vera sú sama eða á undan sjálfvirkri ræsiniðurtalningu. Uppfærðu tímasetninguna til að hefja deilingu.",
+ "gui_status_indicator_share_scheduled": "Áætlað…",
+ "gui_status_indicator_receive_scheduled": "Áætlað…",
+ "days_first_letter": "dag",
+ "hours_first_letter": "klst",
+ "minutes_first_letter": "mín",
+ "seconds_first_letter": "sek"
}
diff --git a/share/locale/it.json b/share/locale/it.json
index 6e23cb1e..8779cf2e 100644
--- a/share/locale/it.json
+++ b/share/locale/it.json
@@ -1,14 +1,14 @@
{
"preparing_files": "Compressione dei file in corso.",
- "give_this_url": "Dai questa URL al destinatario:",
+ "give_this_url": "Dai questo indirizzo al destinatario:",
"ctrlc_to_stop": "Premi Ctrl+C per fermare il server",
"not_a_file": "{0:s} non è un file valido.",
"other_page_loaded": "URL caricato",
- "closing_automatically": "Fermato perchè il trasferimento è stato completato",
+ "closing_automatically": "Fermato perché il trasferimento è stato completato",
"large_filesize": "Attenzione: inviare file di grandi dimensioni può richiedere ore",
"help_local_only": "Non usare Tor (solo per lo sviluppo)",
"help_stay_open": "Mantieni la condivisione attiva anche dopo che i file sono stati inviati",
- "help_debug": "Registra gli errori sul disco",
+ "help_verbose": "Registra gli errori sul disco",
"help_filename": "Lista dei file o cartelle da condividere",
"gui_drag_and_drop": "Trascina e rilascia i file e le cartelle per iniziare la condivisione",
"gui_add": "Aggiungi",
@@ -23,12 +23,12 @@
"gui_please_wait": "Avviato... Cliccare per interrompere.",
"zip_progress_bar_format": "Compressione in corso: %p%",
"config_onion_service": "Preparando il servizio onion sulla porta {0:d}.",
- "give_this_url_stealth": "Dai questa URL e la linea HidServAuth al destinatario:",
+ "give_this_url_stealth": "Dai questo indirizzo e la linea HidServAuth al destinatario:",
"give_this_url_receive": "Dai questo indirizzo al mittente:",
"give_this_url_receive_stealth": "Condividi questo indirizzo e la linea HideServAuth con il mittente:",
"not_a_readable_file": "{0:s} non è un file leggibile.",
"no_available_port": "Non è stato possibile trovare alcuna porta per avviare il servizio onion",
- "close_on_timeout": "Arrestato per tempo scaduto",
+ "close_on_autostop_timer": "Fermato perché il timer di arresto automatico è scaduto",
"timeout_download_still_running": "download in corso, attendere",
"systray_menu_exit": "Termina",
"systray_download_started_title": "Download con OnionShare avviato",
@@ -39,15 +39,15 @@
"systray_download_canceled_message": "L'utente ha interrotto il download",
"systray_upload_started_title": "Upload con OnionShare avviato",
"systray_upload_started_message": "Un utente ha avviato l'upload di file sul tuo computer",
- "help_shutdown_timeout": "Termina la condivisione dopo alcuni secondi",
+ "help_autostop_timer": "Termina la condivisione dopo alcuni secondi",
"help_stealth": "Usa l'autorizzazione del client (avanzato)",
"help_config": "Specifica il percorso del file di configurazione del JSON personalizzato",
- "gui_share_stop_server_shutdown_timeout": "Arresta la condivisione ({}s rimanenti)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Il timer si arresterà tra {}",
+ "gui_share_stop_server_autostop_timer": "Arresta la condivisione ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Il timer si arresterà tra {}",
"gui_receive_start_server": "Inizia la ricezione",
"gui_receive_stop_server": "Arresta la ricezione",
- "gui_receive_stop_server_shutdown_timeout": "Interrompi la ricezione ({}s rimanenti)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Il timer termina tra {}",
+ "gui_receive_stop_server_autostop_timer": "Interrompi la ricezione ({} rimanenti)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Il timer termina tra {}",
"gui_copy_hidservauth": "Copia HidServAuth",
"gui_no_downloads": "Ancora nessun Download",
"gui_copied_url_title": "Indirizzo OnionShare copiato",
@@ -85,7 +85,7 @@
"gui_settings_language_changed_notice": "Riavvia OnionShare affinché il cambiamento della tua lingua abbia effetto.",
"gui_settings_tor_bridges_custom_radio_option": "Utilizzare ponti personalizzati",
"timeout_upload_still_running": "In attesa del completamento dell'upload",
- "gui_add_files": "Aggiungi archivi",
+ "gui_add_files": "Aggiungi Files",
"gui_add_folder": "Aggiungi una cartella",
"gui_settings_connection_type_control_port_option": "Connessione usando la porta di controllo",
"gui_settings_connection_type_socket_file_option": "Connessione usando il file di socket",
@@ -109,8 +109,8 @@
"gui_settings_button_save": "Salva",
"gui_settings_button_cancel": "Cancella",
"gui_settings_button_help": "Aiuto",
- "gui_settings_shutdown_timeout_checkbox": "Utilizza il timer di arresto automatico",
- "gui_settings_shutdown_timeout": "Ferma la condivisione alle:",
+ "gui_settings_autostop_timer_checkbox": "Utilizza il timer di arresto automatico",
+ "gui_settings_autostop_timer": "Ferma la condivisione alle:",
"settings_error_unknown": "Impossibile connettersi al controller Tor perché le tue impostazioni non hanno senso.",
"settings_error_automatic": "Impossibile connettersi al controller Tor. Tor Browser (disponibile da torproject.org) è in esecuzione in background?",
"settings_error_socket_port": "Impossibile connettersi al controller Tor in {}: {}.",
@@ -136,8 +136,8 @@
"gui_tor_connection_error_settings": "Prova a modificare le impostazioni di come OnionShare si connette alla rete Tor.",
"gui_tor_connection_canceled": "Impossibile connettersi a Tor,\n\nVerifica la connessione a Internet, dopo prova a riaprire OnionShare e configurare la connessione a Tor.",
"gui_tor_connection_lost": "Disconnesso da Tor.",
- "gui_server_started_after_timeout": "Il timer auto-stop si è esaurito prima dell'avvio del server.\nSi prega di fare una nuova condivisione.",
- "gui_server_timeout_expired": "Il timer auto-stop ha già finito.\nPer favore aggiornalo per iniziare la condivisione.",
+ "gui_server_started_after_autostop_timer": "Il timer ad arresto automatico si è fermato prima dell'avvio del server. Si prega di fare una nuova condivisione.",
+ "gui_server_autostop_timer_expired": "Il timer di arresto automatico è già scaduto. Si prega di aggiornarlo per iniziare la condivisione.",
"share_via_onionshare": "Usa OnionShare",
"gui_connect_to_tor_for_onion_settings": "Connetti a Tor per vedere le impostazioni del servizio onion",
"gui_use_legacy_v2_onions_checkbox": "Usa gli indirizzi legacy",
@@ -210,7 +210,20 @@
"gui_all_modes_progress_starting": "{0:s}, %p% (in calcolo)",
"gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
"gui_share_mode_no_files": "Nessun file ancora inviato",
- "gui_share_mode_timeout_waiting": "In attesa di finire l'invio",
+ "gui_share_mode_autostop_timer_waiting": "In attesa di finire l'invio",
"gui_receive_mode_no_files": "Nessun file ricevuto ancora",
- "gui_receive_mode_timeout_waiting": "In attesa di finire la ricezione"
+ "gui_receive_mode_autostop_timer_waiting": "In attesa di finire la ricezione",
+ "gui_stop_server_autostop_timer_tooltip": "Il timer di arresto automatico termina a {}",
+ "gui_start_server_autostart_timer_tooltip": "Il timer a partenza automatica finisce a {}",
+ "gui_waiting_to_start": "Programmato per partire in {}. Clicca per cancellare.",
+ "gui_settings_autostart_timer_checkbox": "Usa il timer a partenza automatica",
+ "gui_settings_autostart_timer": "Inizia la condivisione a:",
+ "gui_server_autostart_timer_expired": "L'ora pianificata è già passata. Si prega di aggiornarlo per iniziare la condivisione.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Il tempo di arresto automatico non può essere uguale o precedente all'ora di avvio automatico. Si prega di aggiornarlo per iniziare la condivisione.",
+ "gui_status_indicator_share_scheduled": "In programma…",
+ "gui_status_indicator_receive_scheduled": "In programma…",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/ja.json b/share/locale/ja.json
index ad559ca2..03f28f1e 100644
--- a/share/locale/ja.json
+++ b/share/locale/ja.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "{0:s}は読めるファイルではありません。",
"no_available_port": "onionサービスを実行するための利用可能ポートを見つかりません",
"other_page_loaded": "アドレスはロードされています",
- "close_on_timeout": "自動タイマーがタイムアウトしたため停止されました",
+ "close_on_autostop_timer": "自動タイマーがタイムアウトしたため停止されました",
"closing_automatically": "転送が完了されたため停止されました",
"timeout_download_still_running": "ダウンロード完了待ち",
"timeout_upload_still_running": "アップロード完了待ち",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "ユーザーがファイルをアップロードし始めました",
"help_local_only": "Torを使わない(開発利用のみ)",
"help_stay_open": "ファイルが送信された後に共有し続けます",
- "help_shutdown_timeout": "数秒後に共有が停止されます",
+ "help_autostop_timer": "数秒後に共有が停止されます",
"help_stealth": "クライアント認証を使う(上級者向け)",
"help_receive": "共有を送信する代わりに受信する",
- "help_debug": "OnionShareのエラーを標準出力に、Webのエラーをディスクに記録する",
+ "help_verbose": "OnionShareのエラーを標準出力に、Webのエラーをディスクに記録する",
"help_filename": "共有するファイルとフォルダの一覧",
"help_config": "カスタムJSON設定ファイルの位置(任意)",
"gui_drag_and_drop": "共有を始めるにはファイルやフォルダをドラッグアンドドロップしてください",
@@ -40,12 +40,12 @@
"gui_choose_items": "選択",
"gui_share_start_server": "共有を開始する",
"gui_share_stop_server": "共有を停止する",
- "gui_share_stop_server_shutdown_timeout": "共有を停止中です(残り{}秒)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "{}に自動停止します",
+ "gui_share_stop_server_autostop_timer": "共有を停止中です({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "{}に自動停止します",
"gui_receive_start_server": "受信モードを開始",
"gui_receive_stop_server": "受信モードを停止",
- "gui_receive_stop_server_shutdown_timeout": "受信モードを停止中(残り{}秒)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "{}に自動停止します",
+ "gui_receive_stop_server_autostop_timer": "受信モードを停止(残り {} 秒)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "{}に自動停止します",
"gui_copy_url": "アドレスをコピー",
"gui_copy_hidservauth": "HidServAuthをコピー",
"gui_downloads": "ダウンロード履歴",
@@ -107,8 +107,8 @@
"gui_settings_button_save": "保存",
"gui_settings_button_cancel": "キャンセル",
"gui_settings_button_help": "ヘルプ",
- "gui_settings_shutdown_timeout_checkbox": "自動停止タイマーを使用する",
- "gui_settings_shutdown_timeout": "共有を停止する時間:",
+ "gui_settings_autostop_timer_checkbox": "自動停止タイマーを使用する",
+ "gui_settings_autostop_timer": "共有を停止する時間:",
"settings_error_unknown": "設定を解釈できないため、Torコントローラーと接続できません。",
"settings_error_automatic": "Torコントローラーと接続できません。Torブラウザ(torproject.orgから入手できる)がバックグラウンドで動作していますか?",
"settings_error_socket_port": "{}:{}でTorコントローラーと接続できません。",
@@ -134,8 +134,8 @@
"gui_tor_connection_error_settings": "設定でTorとの接続方法を変更してみて下さい。",
"gui_tor_connection_canceled": "Torと接続できませんでした。\n\nインターネット接続を確認してから、OnionShareを再開してTorとの接続を設定して下さい。",
"gui_tor_connection_lost": "Torから切断されました。",
- "gui_server_started_after_timeout": "サーバーが起動した前、自動停止タイマーがタイムアウトしました。\n再びファイル共有をして下さい。",
- "gui_server_timeout_expired": "自動停止タイマーはすでにタイムアウトしています。\n共有し始めるにはリセットして下さい。",
+ "gui_server_started_after_autostop_timer": "サーバーが起動した前、自動停止タイマーがタイムアウトしました。\n再びファイル共有をして下さい。",
+ "gui_server_autostop_timer_expired": "自動停止タイマーはすでにタイムアウトしています。\n共有し始めるにはタイマーをアップデートして下さい。",
"share_via_onionshare": "OnionShareで共有する",
"gui_connect_to_tor_for_onion_settings": "onionサービス設定を見るのにTorと接続して下さい",
"gui_use_legacy_v2_onions_checkbox": "レガシーアドレスを使用する",
@@ -209,8 +209,21 @@
"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_timeout_waiting": "送信完了を待機しています",
+ "gui_share_mode_autostop_timer_waiting": "送信完了を待機しています",
"gui_receive_mode_no_files": "受信されたファイルがまだありません",
- "gui_receive_mode_timeout_waiting": "受信完了を待機しています",
- "gui_settings_onion_label": "Onion設定"
+ "gui_receive_mode_autostop_timer_waiting": "受信完了を待機しています",
+ "gui_settings_onion_label": "Onion設定",
+ "gui_stop_server_autostop_timer_tooltip": "自動停止タイマーは {} に終了します",
+ "gui_start_server_autostart_timer_tooltip": "自動スタートタイマーは {} に終了します",
+ "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_receive_scheduled": "予定されました…",
+ "days_first_letter": "日",
+ "hours_first_letter": "時間",
+ "minutes_first_letter": "分",
+ "seconds_first_letter": "秒"
}
diff --git a/share/locale/ka.json b/share/locale/ka.json
index 0f6541fa..9c41ed9f 100644
--- a/share/locale/ka.json
+++ b/share/locale/ka.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"large_filesize": "",
@@ -25,24 +25,24 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
- "gui_add": "",
+ "gui_add": "დამატება",
"gui_delete": "",
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -101,11 +101,11 @@
"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_save": "შენახვა",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
@@ -181,5 +181,7 @@
"gui_download_in_progress": "",
"gui_open_folder_error_nautilus": "",
"gui_settings_language_label": "",
- "gui_settings_language_changed_notice": ""
+ "gui_settings_language_changed_notice": "",
+ "gui_settings_data_dir_browse_button": "არჩევა",
+ "gui_all_modes_history": ""
}
diff --git a/share/locale/km.json b/share/locale/km.json
new file mode 100644
index 00000000..44dfde5a
--- /dev/null
+++ b/share/locale/km.json
@@ -0,0 +1,175 @@
+{
+ "preparing_files": "",
+ "not_a_readable_file": "",
+ "no_available_port": "",
+ "other_page_loaded": "",
+ "close_on_autostop_timer": "",
+ "closing_automatically": "",
+ "large_filesize": "",
+ "gui_drag_and_drop": "",
+ "gui_add": "",
+ "gui_add_files": "",
+ "gui_add_folder": "",
+ "gui_delete": "",
+ "gui_choose_items": "",
+ "gui_share_start_server": "",
+ "gui_share_stop_server": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "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_copy_url": "",
+ "gui_copy_hidservauth": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "gui_copied_hidservauth_title": "",
+ "gui_copied_hidservauth": "",
+ "gui_waiting_to_start": "",
+ "gui_please_wait": "",
+ "gui_quit_title": "",
+ "gui_share_quit_warning": "",
+ "gui_receive_quit_warning": "",
+ "gui_quit_warning_quit": "",
+ "gui_quit_warning_dont_quit": "",
+ "error_rate_limit": "",
+ "zip_progress_bar_format": "",
+ "error_stealth_not_supported": "",
+ "error_ephemeral_not_supported": "",
+ "gui_settings_window_title": "",
+ "gui_settings_whats_this": "",
+ "gui_settings_stealth_option": "",
+ "gui_settings_stealth_hidservauth_string": "",
+ "gui_settings_autoupdate_label": "",
+ "gui_settings_autoupdate_option": "",
+ "gui_settings_autoupdate_timestamp": "",
+ "gui_settings_autoupdate_timestamp_never": "",
+ "gui_settings_autoupdate_check_button": "",
+ "gui_settings_general_label": "",
+ "gui_settings_onion_label": "",
+ "gui_settings_sharing_label": "",
+ "gui_settings_close_after_first_download_option": "",
+ "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": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "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_bundled_tor_broken": "",
+ "settings_test_success": "",
+ "error_tor_protocol_error": "",
+ "error_tor_protocol_error_unknown": "",
+ "connecting_to_tor": "",
+ "update_available": "",
+ "update_error_check_error": "",
+ "update_error_invalid_latest_version": "",
+ "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_connect_to_tor_for_onion_settings": "",
+ "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_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": "",
+ "error_cannot_create_data_dir": "",
+ "gui_receive_mode_warning": "",
+ "gui_mode_share_button": "",
+ "gui_mode_receive_button": "",
+ "gui_settings_receiving_label": "",
+ "gui_settings_data_dir_label": "",
+ "gui_settings_data_dir_browse_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "gui_open_folder_error_nautilus": "",
+ "gui_settings_language_label": "",
+ "gui_settings_language_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_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_progress_starting": "",
+ "gui_all_modes_progress_eta": "",
+ "gui_share_mode_no_files": "",
+ "gui_share_mode_autostop_timer_waiting": "",
+ "gui_receive_mode_no_files": "",
+ "gui_receive_mode_autostop_timer_waiting": "",
+ "receive_mode_upload_starting": "",
+ "days_first_letter": "",
+ "hours_first_letter": "",
+ "minutes_first_letter": "",
+ "seconds_first_letter": ""
+}
diff --git a/share/locale/ko.json b/share/locale/ko.json
index c5da4e9b..adda3a69 100644
--- a/share/locale/ko.json
+++ b/share/locale/ko.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "{0:s} 는 읽을수 없는 파일입니다.",
"no_available_port": "어니언 서비스를 시작하기 위한 사용 가능한 포트를 찾을수 없었습니다",
"other_page_loaded": "주소가 로드되다",
- "close_on_timeout": "자동멈춤 타이머가 끝났기 때문에 정지되다",
+ "close_on_autostop_timer": "자동멈춤 타이머가 끝났기 때문에 정지되다",
"closing_automatically": "다운로드가 완료되었기 때문에 정지되다",
"timeout_download_still_running": "다운로드가 완료되기를 기다리는 중입니다",
"timeout_upload_still_running": "업로드가 완료되기를 기다리는 중입니다",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "사용자가 파일들을 당신의 컴퓨터로 업로딩 하는것을 시작했습니다",
"help_local_only": "Tor를 사용하지 마시오 (오직 개발자용)",
"help_stay_open": "첫 다운로드 후 계속 공유하시오",
- "help_shutdown_timeout": "정해진 초단위의 시간이 지난후 공유하는 것을 멈추시오",
+ "help_autostop_timer": "정해진 초단위의 시간이 지난후 공유하는 것을 멈추시오",
"help_stealth": "고객 허가를 사용 (고급 수준의)",
"help_receive": "그것들을 보내는것 대신 공유를 받으시오",
- "help_debug": "어니언쉐어 에러들은 표준 출력 장치로 접속하고, 웹 에러들은 디스크로 접속 ",
+ "help_verbose": "어니언쉐어 에러들은 표준 출력 장치로 접속하고, 웹 에러들은 디스크로 접속 ",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -38,12 +38,12 @@
"gui_choose_items": "선택",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -105,8 +105,8 @@
"gui_settings_button_save": "저장",
"gui_settings_button_cancel": "취소",
"gui_settings_button_help": "도움말",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -132,8 +132,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/lg.json b/share/locale/lg.json
index 25cd5c48..96b5a0d1 100644
--- a/share/locale/lg.json
+++ b/share/locale/lg.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"timeout_upload_still_running": "",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -38,12 +38,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -105,8 +105,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -132,8 +132,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/mk.json b/share/locale/mk.json
index 2273ba1e..b389c2a0 100644
--- a/share/locale/mk.json
+++ b/share/locale/mk.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"large_filesize": "",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -37,12 +37,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "Зачувување",
"gui_settings_button_cancel": "Откажи",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/ms.json b/share/locale/ms.json
new file mode 100644
index 00000000..77a441e8
--- /dev/null
+++ b/share/locale/ms.json
@@ -0,0 +1,184 @@
+{
+ "config_onion_service": "",
+ "preparing_files": "",
+ "give_this_url": "",
+ "give_this_url_stealth": "",
+ "give_this_url_receive": "",
+ "give_this_url_receive_stealth": "",
+ "ctrlc_to_stop": "",
+ "not_a_file": "",
+ "not_a_readable_file": "",
+ "no_available_port": "",
+ "other_page_loaded": "",
+ "close_on_autostop_timer": "",
+ "closing_automatically": "",
+ "large_filesize": "",
+ "help_local_only": "",
+ "help_stay_open": "",
+ "help_autostop_timer": "",
+ "help_stealth": "",
+ "help_receive": "",
+ "help_verbose": "",
+ "help_filename": "",
+ "help_config": "",
+ "gui_drag_and_drop": "",
+ "gui_add": "",
+ "gui_add_files": "",
+ "gui_add_folder": "",
+ "gui_delete": "",
+ "gui_choose_items": "",
+ "gui_share_start_server": "",
+ "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_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
+ "gui_copy_url": "",
+ "gui_copy_hidservauth": "",
+ "gui_canceled": "",
+ "gui_copied_url_title": "",
+ "gui_copied_url": "",
+ "gui_copied_hidservauth_title": "",
+ "gui_copied_hidservauth": "",
+ "gui_please_wait": "",
+ "version_string": "",
+ "gui_quit_title": "",
+ "gui_share_quit_warning": "",
+ "gui_receive_quit_warning": "",
+ "gui_quit_warning_quit": "",
+ "gui_quit_warning_dont_quit": "",
+ "error_rate_limit": "",
+ "zip_progress_bar_format": "",
+ "error_stealth_not_supported": "",
+ "error_ephemeral_not_supported": "",
+ "gui_settings_window_title": "",
+ "gui_settings_whats_this": "",
+ "gui_settings_stealth_option": "",
+ "gui_settings_stealth_hidservauth_string": "",
+ "gui_settings_autoupdate_label": "",
+ "gui_settings_autoupdate_option": "",
+ "gui_settings_autoupdate_timestamp": "",
+ "gui_settings_autoupdate_timestamp_never": "",
+ "gui_settings_autoupdate_check_button": "",
+ "gui_settings_general_label": "",
+ "gui_settings_onion_label": "",
+ "gui_settings_sharing_label": "",
+ "gui_settings_close_after_first_download_option": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "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": "",
+ "share_via_onionshare": "",
+ "gui_connect_to_tor_for_onion_settings": "",
+ "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": "",
+ "error_cannot_create_data_dir": "",
+ "receive_mode_data_dir": "",
+ "receive_mode_warning": "",
+ "gui_receive_mode_warning": "",
+ "receive_mode_upload_starting": "",
+ "receive_mode_received_file": "",
+ "gui_mode_share_button": "",
+ "gui_mode_receive_button": "",
+ "gui_settings_receiving_label": "",
+ "gui_settings_data_dir_label": "",
+ "gui_settings_data_dir_browse_button": "",
+ "gui_settings_public_mode_checkbox": "",
+ "gui_open_folder_error_nautilus": "",
+ "gui_settings_language_label": "",
+ "gui_settings_language_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_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_progress_starting": "",
+ "gui_all_modes_progress_eta": "",
+ "gui_share_mode_no_files": "",
+ "gui_share_mode_autostop_timer_waiting": "",
+ "gui_receive_mode_no_files": "",
+ "gui_receive_mode_autostop_timer_waiting": ""
+}
diff --git a/share/locale/no.json b/share/locale/nb.json
index 9d67e6fa..8041db76 100644
--- a/share/locale/no.json
+++ b/share/locale/nb.json
@@ -10,11 +10,11 @@
"give_this_url_receive": "Gi denne adressen til avsenderen:",
"give_this_url_receive_stealth": "Gi denne adressen og HidServAuth-linjen til avsenderen:",
"not_a_readable_file": "{0:s} er ikke en lesbar fil.",
- "no_available_port": "Fant ikke tilgjengelig port for oppstart av løktjenesten",
- "close_on_timeout": "Stoppet fordi tidsavbruddsuret gikk ut",
- "closing_automatically": "Stoppet fordi nedlasting fullførtes",
+ "no_available_port": "Fant ikke tilgjengelig port for oppstart av løk-tjenesten",
+ "close_on_autostop_timer": "Stoppet fordi tidsavbruddsuret gikk ut",
+ "closing_automatically": "Stoppet fordi nedlastingen er ferdig",
"timeout_download_still_running": "Venter på at nedlastingen skal fullføres",
- "large_filesize": "Advarsel: forsendelse av stor deling kan ta timer",
+ "large_filesize": "Advarsel: Forsendelse av stor deling kan ta flere timer",
"systray_menu_exit": "Avslutt",
"systray_download_started_title": "OnionShare-nedlasting startet",
"systray_download_started_message": "En bruker startet nedlasting av filene dine",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "En bruker startet opplasting av filer til din datamaskin",
"help_local_only": "Ikke bruk Tor (kun i utviklingsøyemed)",
"help_stay_open": "Fortsett å dele etter at filene har blitt sendt",
- "help_shutdown_timeout": "Stopp deling etter et gitt antall sekunder",
+ "help_autostop_timer": "Stopp deling etter et gitt antall sekunder",
"help_stealth": "Bruk klientidentifisering (avansert)",
"help_receive": "Motta delinger istedenfor å sende dem",
- "help_debug": "Log OnionShare-feil til stdout, og vev-feil til disk",
+ "help_verbose": "Log OnionShare-feil til stdout, og vev-feil til disk",
"help_filename": "Liste over filer eller mapper å dele",
"help_config": "Egendefinert JSON-oppsettsfil (valgfri)",
"gui_drag_and_drop": "Dra og slipp filer og mapper\nfor å starte deling",
@@ -38,19 +38,19 @@
"gui_choose_items": "Velg",
"gui_share_start_server": "Start deling",
"gui_share_stop_server": "Stopp deling",
- "gui_share_stop_server_shutdown_timeout": "Stopp deling ({}s gjenstår)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Tidsavbruddsuret går ut {}",
+ "gui_share_stop_server_autostop_timer": "Stopp deling ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Tidsavbruddsuret går ut {}",
"gui_receive_start_server": "Start mottaksmodus",
"gui_receive_stop_server": "Stopp mottaksmodus",
- "gui_receive_stop_server_shutdown_timeout": "Stopp mottaksmodus ({}s gjenstår)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Tidsavbruddsuret går ut {}",
+ "gui_receive_stop_server_autostop_timer": "Stopp mottaksmodus ({} gjenstår)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Tidsavbruddsuret går ut {}",
"gui_copy_url": "Kopier nettadresse",
"gui_copy_hidservauth": "Kopier HidServAuth",
"gui_downloads": "Nedlastingshistorikk",
"gui_no_downloads": "Ingen nedlastinger enda.",
"gui_canceled": "Avbrutt",
"gui_copied_url_title": "Kopierte OnionShare-adressen",
- "gui_copied_hidservauth_title": "Kopierte HidServAuth-linje",
+ "gui_copied_hidservauth_title": "Kopierte HidServAuth",
"gui_copied_hidservauth": "HidServAuth-linje kopiert til utklippstavle",
"gui_please_wait": "Starter… Klikk for å avbryte.",
"gui_download_upload_progress_complete": "%p%, {0:s} forløpt.",
@@ -59,28 +59,28 @@
"version_string": "OnionShare {0:s} | https://onionshare.org/",
"gui_quit_title": "Hold an",
"gui_share_quit_warning": "Filer er i ferd med å bli sendt. Er du sikker på at du ønsker å avslutte OnionShare?",
- "gui_receive_quit_warning": "Du har ikke fått overført alle filene til deg enda. Er du sikker på at du ønsker å avslutte OnionShare?",
+ "gui_receive_quit_warning": "Du har ikke fått alle filene enda. Er du sikker på at du ønsker å avslutte OnionShare?",
"gui_quit_warning_quit": "Avslutt",
"gui_quit_warning_dont_quit": "Avbryt",
- "error_rate_limit": "Noen har prøvd adressen din for mange ganger, som kan betyr at de prøver å gjette seg fram til den, OnionShare har derfor stoppet tjeneren. Start deling igjen, og send mottakeren en ny adresse å dele.",
+ "error_rate_limit": "Noen har prøvd adressen din for mange ganger, noe som kan betyr at de prøver å gjette seg fram til den, OnionShare har derfor stoppet tjeneren. Start deling igjen, og send mottakeren en ny adresse å dele.",
"zip_progress_bar_format": "Pakker sammen: %p%",
- "error_stealth_not_supported": "For å bruke klientidentitetsbekreftelse, trenger du minst Tor 0.2.9.1-alpha (eller Tor-nettleseren 6.5) og python3-stem 1.5.0.",
+ "error_stealth_not_supported": "For å bruke klientidentitetsbekreftelse, trenger du minst Tor 0.2.9.1-alpha (eller Tor-Browser 6.5) og python3-stem 1.5.0.",
"error_ephemeral_not_supported": "OnionShare krever minst både Tor 0.2.7.1 og pything3-stem 1.4.0.",
"gui_settings_window_title": "Innstillinger",
"gui_settings_whats_this": "<a href='{0:s}'>Hva er dette?</a>",
"gui_settings_stealth_option": "Bruk klientidentifisering",
- "gui_settings_stealth_hidservauth_string": "Siden du har lagret din private nøkkel for gjenbruk, kan du nå\nklikke for å kopiere din HidServAuth-linje.",
+ "gui_settings_stealth_hidservauth_string": "Siden du har lagret din private nøkkel for gjenbruk, kan du nå klikke for å kopiere din HidServAuth-linje.",
"gui_settings_autoupdate_label": "Se etter ny versjon",
"gui_settings_autoupdate_option": "Gi meg beskjed når en ny versjon er tilgjengelig",
"gui_settings_autoupdate_timestamp": "Sist sjekket: {}",
"gui_settings_autoupdate_timestamp_never": "Aldri",
"gui_settings_autoupdate_check_button": "Se etter ny versjon",
- "gui_settings_general_label": "Hovedinnstillinger",
+ "gui_settings_general_label": "Generelle innstillinger",
"gui_settings_sharing_label": "Delingsinnstillinger",
"gui_settings_close_after_first_download_option": "Stopp deling etter at filene har blitt sendt",
"gui_settings_connection_type_label": "Hvordan skal OnionShare koble seg til Tor?",
- "gui_settings_connection_type_bundled_option": "Bruk Tor-versjonen som kommer med OnionShare",
- "gui_settings_connection_type_automatic_option": "Forsøk automatisk oppsett med Tor-nettleser",
+ "gui_settings_connection_type_bundled_option": "Bruk Tor-versjonen som er bygget inn i OnionShare",
+ "gui_settings_connection_type_automatic_option": "Forsøk automatisk oppsett med Tor-nettleseren",
"gui_settings_connection_type_control_port_option": "Koble til ved bruk av kontrollport",
"gui_settings_connection_type_socket_file_option": "Koble til ved bruk av socket-fil",
"gui_settings_connection_type_test_button": "Test tilkobling til Tor",
@@ -88,14 +88,14 @@
"gui_settings_socket_file_label": "Socket-fil",
"gui_settings_socks_label": "SOCKS-port",
"gui_settings_authenticate_label": "Tor-identitetsbekreftelsesinnstillinger",
- "gui_settings_authenticate_no_auth_option": "Ingen identitetsbekreftelse, eller kakeidentifiseringsbekreftelse",
+ "gui_settings_authenticate_no_auth_option": "Ingen identitetsbekreftelse, eller cookie-identifiseringsbekreftelse",
"gui_settings_authenticate_password_option": "Passord",
"gui_settings_password_label": "Passord",
"gui_settings_tor_bridges": "Støtte for Tor-bro",
"gui_settings_tor_bridges_no_bridges_radio_option": "Ikke benytt broer",
"gui_settings_tor_bridges_obfs4_radio_option": "Bruk innebygd pluggbare obfs4-transporter",
"gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Bruk innebygd pluggbare obfs4-transporter (krever obfs4proxy)",
- "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Bruk innebygd pluggbare meek_lite (Azure) transporter",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Bruk innebygd pluggbare meek_lite (Azure)-transporter",
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Bruk innebygd pluggbare meek_lite (Azure) transporter (krever obfs4proxy)",
"gui_settings_meek_lite_expensive_warning": "Advarsel: Meek-lite-broene er veldig kostbare å kjøre for Tor-prosjektet.<br><br>Kun bruk dem hvis direkte tilkobling til Tor ikke virker, via obfs-transporter, eller andre normale broer.",
"gui_settings_tor_bridges_custom_radio_option": "Bruk egendefinerte broer",
@@ -104,41 +104,41 @@
"gui_settings_button_save": "Lagre",
"gui_settings_button_cancel": "Avbryt",
"gui_settings_button_help": "Hjelp",
- "gui_settings_shutdown_timeout_checkbox": "Bruk tidsavbruddsur",
- "gui_settings_shutdown_timeout": "Stopp deling ved:",
+ "gui_settings_autostop_timer_checkbox": "Bruk tidsavbruddsur",
+ "gui_settings_autostop_timer": "Stopp deling ved:",
"settings_saved": "Innstillinger lagret i {}",
"settings_error_unknown": "Kan ikke koble til Tor-kontroller fordi innstillingene dine ikke gir mening.",
- "settings_error_automatic": "Kunne ikke koble til Tor-kontrolleren. Kjører Tor-nettleseren (tilgjengelig fra torproject.org) i bakgrunnen?",
+ "settings_error_automatic": "Kunne ikke koble til Tor-kontrolleren. Kjører Tor Browser (tilgjengelig fra torproject.org) i bakgrunnen?",
"settings_error_socket_port": "Kan ikke koble til Tor-kontroller på {}:{}.",
"settings_error_socket_file": "Kan ikke koble til Tor-kontroller ved bruk av socket-fil {}.",
- "settings_error_auth": "Tilkoblet til {}:{}, men kan ikke identitetsbekrefte. Kanskje dette ikke er en Tor-kontroller?",
+ "settings_error_auth": "Koblet til {}:{}, men kan ikke identitetsbekrefte. Kanskje dette ikke er en Tor-kontroller?",
"settings_error_missing_password": "Tilkoblet til Tor-kontroller, men den krever et passord for å identitetsbekrefte.",
- "settings_error_unreadable_cookie_file": "Tilkoblet til Tor-kontrolleren, men passordet kan være galt, eller så har ikke brukeren din tilgang til å lese fra kakefilen.",
+ "settings_error_unreadable_cookie_file": "Koblet til Tor-kontrolleren, men passordet kan være galt, eller så har ikke brukeren din tilgang til å lese fra kakefilen.",
"settings_error_bundled_tor_not_supported": "Bruk av Tor-versjonen som kommer med OnionShare fungerer ikke i utviklermodus på Windows eller macOS.",
"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øktjenester: {}.\nStøtter klientidentifisering: {}.\nStøtter nestegenerasjons .onion-adresser: {}.",
+ "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_unknown": "Ukjent feil med Tor",
"error_invalid_private_key": "Denne private nøkkeltypen er ikke støttet",
"connecting_to_tor": "Kobler til Tor-nettverket",
- "update_available": "Ny OnionShare lansert. <a href='{}'>Klikk her</a> for å hente det.<br><br>Du bruker {} og nyeste versjon er {}.",
+ "update_available": "Ny OnionShare-versjon tilgjenglig. <a href='{}'>Klikk her</a> for å laste den ned.<br><br>Du bruker {} og nyeste versjon er {}.",
"update_error_check_error": "Kunne ikke sjekke etter nye versjoner: OnionShare-nettsiden sier at siste versjon er det ugjenkjennelige \"{}\"…",
"update_error_invalid_latest_version": "Kunne ikke sjekke etter ny versjon: Kanskje du ikke er koblet til Tor, eller kanskje OnionShare-nettsiden er nede?",
- "update_not_available": "Du kjører siste OnionShare.",
+ "update_not_available": "Du kjører siste versjon av OnionShare.",
"gui_tor_connection_ask": "Åpne innstillingene for å ordne opp i tilkoblingen til Tor?",
"gui_tor_connection_ask_open_settings": "Ja",
"gui_tor_connection_ask_quit": "Avslutt",
"gui_tor_connection_error_settings": "Prøv å endre hvordan OnionShare kobler til Tor-nettverket i innstillingene.",
"gui_tor_connection_canceled": "Kunne ikke koble til Tor.\n\nForsikre deg om at du er koblet til Internett, åpne så OnionShare igjen, og sett opp dets tilkobling til Tor.",
"gui_tor_connection_lost": "Frakoblet fra Tor.",
- "gui_server_started_after_timeout": "Tidsavbruddsuret gikk ut før tjeneren startet.\nLag en ny deling.",
- "gui_server_timeout_expired": "Tidsavbruddsuret har gått ut allerede.\nOppdater det for å starte deling.",
+ "gui_server_started_after_autostop_timer": "Tidsavbruddsuret gikk ut før tjeneren startet.\nLag en ny deling.",
+ "gui_server_autostop_timer_expired": "Tidsavbruddsuret har gått ut allerede.\nOppdater det for å starte deling.",
"share_via_onionshare": "OnionShare det",
"gui_use_legacy_v2_onions_checkbox": "Bruk gammeldagse adresser",
"gui_save_private_key_checkbox": "Bruk en vedvarende adresse",
- "gui_share_url_description": "<b>Alle</b> som har denne OnionShare-adressen kan <b>Laste ned</b> filene dine ved bruk av <b>Tor-nettleseren</b>: <img src='{}' />",
- "gui_receive_url_description": "<b>Alle</b> som har denne OnionShare-adressen kan <b>Laste opp</b> filer til din datamaskin ved bruk av <b>Tor-nettleseren</b>: <img src='{}' />",
+ "gui_share_url_description": "<b>Alle</b> som har denne OnionShare-adressen kan <b>Laste ned</b> filene dine ved bruk av <b>Tor-Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Alle</b> som har denne OnionShare-adressen kan <b>Laste opp</b> filer til din datamaskin ved bruk av <b>Tor-Browser</b>: <img src='{}' />",
"gui_url_label_persistent": "Delingen vil ikke stoppe automatisk.<br><br>Hver påfølgende deling vil gjenbruke adressen. (For engangsadresser, skru av \"Bruk vedvarende adresse\" i innstillingene.)",
"gui_url_label_stay_open": "Denne delingen vil ikke stoppe automatisk.",
"gui_url_label_onetime": "Denne delingen vil stoppe etter første fullføring.",
@@ -159,7 +159,7 @@
"error_downloads_dir_not_writable": "Mottaksmodusmappen er skrivebeskyttet: {}",
"receive_mode_downloads_dir": "Filer sendt til deg vil vises i denne mappen: {}",
"receive_mode_warning": "Advarsel: Mottaksmodus lar folk laste opp filer til din datamaskin. Noen filer kan potensielt ta over datamaskinen din hvis du åpner dem. Kun åpne ting fra folk du stoler på, eller hvis du vet hva du gjør.",
- "gui_receive_mode_warning": "Mottaksmodus lar folk laste opp filer til din datamaskin.<br><br><b>Noen filer kan potensielt ta over datamaskinen din hvis du åpner dem. Kun åpne ting fra folk du stoler på, eller hvis du vet hva du gjør.</b>",
+ "gui_receive_mode_warning": "Mottaksmodus lar folk laste opp filer til din datamaskin.<br><br><b>Noen filer kan potensielt ta over datamaskinen din hvis du åpner dem. Åpne kun filer fra personer du stoler på, eller hvis du vet hva du gjør.</b>",
"receive_mode_upload_starting": "Opplasting av total størrelse {} starter",
"receive_mode_received_file": "Mottatt: {}",
"gui_mode_share_button": "Del filer",
@@ -189,12 +189,12 @@
"timeout_upload_still_running": "Venter på at opplastingen fullføres",
"gui_add_files": "Legg til filer",
"gui_add_folder": "Legg til mappe",
- "gui_connect_to_tor_for_onion_settings": "Koble til Tor for å se løktjeneste-innstillinger",
+ "gui_connect_to_tor_for_onion_settings": "Koble til Tor for å se Onion-innstillinger",
"error_cannot_create_data_dir": "Kunne ikke opprette OnionShare-datamappe: {}",
"receive_mode_data_dir": "Filers sendt til deg havner i denne mappen: {}",
"gui_settings_data_dir_label": "Lagre filer i",
"gui_settings_data_dir_browse_button": "Utforsk",
- "systray_page_loaded_message": "OnionShare-adresse innlastet",
+ "systray_page_loaded_message": "OnionShare-adresse lastet",
"systray_share_started_title": "Deling startet",
"systray_share_started_message": "Begynner å sende filer til noen",
"systray_share_completed_title": "Deling fullført",
@@ -202,7 +202,7 @@
"systray_share_canceled_title": "Deling avbrutt",
"systray_share_canceled_message": "Noen avbrøt mottak av filene dine",
"systray_receive_started_title": "Mottak startet",
- "systray_receive_started_message": "Noen sender filer til deg",
+ "systray_receive_started_message": "Noen sender deg filer",
"gui_all_modes_history": "Historikk",
"gui_all_modes_clear_history": "Tøm alt",
"gui_all_modes_transfer_started": "Startet {}",
@@ -212,9 +212,23 @@
"gui_all_modes_progress_starting": "{0:s}, %p% (kalkulerer)",
"gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
"gui_share_mode_no_files": "Ingen filer sendt enda",
- "gui_share_mode_timeout_waiting": "Venter på fullføring av forsendelse",
+ "gui_share_mode_autostop_timer_waiting": "Venter på fullføring av forsendelse",
"gui_receive_mode_no_files": "Ingen filer mottatt enda",
- "gui_receive_mode_timeout_waiting": "Venter på fullføring av mottak",
+ "gui_receive_mode_autostop_timer_waiting": "Venter på fullføring av mottak",
"gui_all_modes_transfer_canceled_range": "Avbrutt {} - {}",
- "gui_all_modes_transfer_canceled": "Avbrutt {}"
+ "gui_all_modes_transfer_canceled": "Avbrutt {}",
+ "gui_settings_onion_label": "Løk-innstillinger",
+ "gui_stop_server_autostop_timer_tooltip": "Automatisk tidsavbruddsur utløper {}",
+ "gui_start_server_autostart_timer_tooltip": "Automatisk tidsur slutter {}",
+ "gui_waiting_to_start": "Planlagt start om {}. Klikk for å avbryte.",
+ "gui_settings_autostart_timer_checkbox": "Bruk tidur for automatisk start",
+ "gui_settings_autostart_timer": "Start delingen:",
+ "gui_server_autostart_timer_expired": "Planlagt tid allerede tilbakelagt. Oppdater den for å begynne deling.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Automatisk tidsavbruddsur kan ikke være likt eller predatere auomatisk starttid. Oppdater det for å starte deling.",
+ "gui_status_indicator_share_scheduled": "Planlagt…",
+ "gui_status_indicator_receive_scheduled": "Planlagt…",
+ "days_first_letter": "d",
+ "hours_first_letter": "t",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/nl.json b/share/locale/nl.json
index 39c5ba9f..6ca041e5 100644
--- a/share/locale/nl.json
+++ b/share/locale/nl.json
@@ -8,7 +8,7 @@
"not_a_readable_file": "{0:s} is geen leesbaar bestand.",
"no_available_port": "Er is geen poort beschikbaar om de onion-dienst op te starten",
"other_page_loaded": "Adres geladen",
- "close_on_timeout": "Gestopt omdat de automatische time-out bereikt is",
+ "close_on_autostop_timer": "Gestopt omdat de automatische time-out bereikt is",
"closing_automatically": "Gestopt omdat de download is afgerond",
"timeout_download_still_running": "Bezig met wachten op afronden van download",
"large_filesize": "Waarschuwing: het versturen van grote bestanden kan uren duren",
@@ -21,9 +21,9 @@
"systray_download_canceled_message": "De gebruiker heeft de download afgebroken",
"help_local_only": "Tor niet gebruiken (alleen voor ontwikkelingsdoeleinden)",
"help_stay_open": "Blijven delen na afronden van eerste download",
- "help_shutdown_timeout": "Stoppen met delen na het opgegeven aantal seconden",
+ "help_autostop_timer": "Stoppen met delen na het opgegeven aantal seconden",
"help_stealth": "Client-authorisatie gebruiken (geavanceerd)",
- "help_debug": "Log OnionShare fouten naar stdout, en web fouten naar disk",
+ "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",
@@ -73,7 +73,7 @@
"gui_settings_button_save": "Opslaan",
"gui_settings_button_cancel": "Annuleren",
"gui_settings_button_help": "Help",
- "gui_settings_shutdown_timeout": "Stop het delen om:",
+ "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_automatic": "Kon geen verbinding maken met de Tor controller. Draait Tor Browser (beschikbaar via torproject.org) in de achtergrond?",
@@ -97,8 +97,8 @@
"gui_tor_connection_ask_quit": "Afsluiten",
"gui_tor_connection_error_settings": "Probeer hoe OnionShare verbind met het Tor network te veranderen in de instellingen.",
"gui_tor_connection_canceled": "Kon niet verbinden met Tor.\n\nWees er zeker van dat je verbonden bent met het internet, herstart OnionShare en configureer de verbinding met Tor.",
- "gui_server_started_after_timeout": "De auto-stop timer liep af voordat de server startte.\nMaak een nieuwe share aan.",
- "gui_server_timeout_expired": "De auto-stop timer is al verlopen.\nStel een nieuwe tijd in om te beginnen met delen.",
+ "gui_server_started_after_autostop_timer": "De auto-stop timer liep af voordat de server startte.\nMaak een nieuwe share aan.",
+ "gui_server_autostop_timer_expired": "De auto-stop timer is al verlopen.\nStel een nieuwe tijd in om te beginnen met delen.",
"share_via_onionshare": "Deel via OnionShare",
"give_this_url_receive": "Geef dit adres aan de afzender:",
"give_this_url_receive_stealth": "Geef dit adres en de HidServAuth-regel aan de afzender:",
@@ -108,12 +108,12 @@
"timeout_upload_still_running": "Wachten op voltooiing van de upload",
"gui_share_start_server": "Start met delen",
"gui_share_stop_server": "Stop met delen",
- "gui_share_stop_server_shutdown_timeout": "Stop met Delen ({}s resterend)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Auto-stop timer eindigt bij {}",
+ "gui_share_stop_server_autostop_timer": "Stop met Delen ({}s resterend)",
+ "gui_share_stop_server_autostop_timer_tooltip": "Auto-stop timer eindigt bij {}",
"gui_receive_start_server": "Start Ontvangstmodus",
"gui_receive_stop_server": "Stop Ontvangstmodus",
- "gui_receive_stop_server_shutdown_timeout": "Stop Ontvangstmodus ({}s resterend)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Auto-stop timer stopt bij {}",
+ "gui_receive_stop_server_autostop_timer": "Stop Ontvangstmodus ({} resterend)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Auto-stop timer stopt bij {}",
"gui_no_downloads": "Nog Geen Downloads",
"gui_copied_url_title": "Gekopieerd OnionShare Adres",
"gui_copied_hidservauth_title": "HidServAuth gekopieerd",
@@ -132,7 +132,7 @@
"gui_settings_tor_bridges_custom_radio_option": "Gebruik custom bridges",
"gui_settings_tor_bridges_custom_label": "Je kan bridges krijgen via <a href=\"https://bridges.torproject.org/options\">1https://bridges.torproject.org</a>2",
"gui_settings_tor_bridges_invalid": "Geen van de bridges die je hebt toegevoegd werken. \nControleer ze of voeg andere toe.",
- "gui_settings_shutdown_timeout_checkbox": "Gebruik auto-stop timer",
+ "gui_settings_autostop_timer_checkbox": "Gebruik auto-stop timer",
"error_tor_protocol_error_unknown": "Er was een onbekende fout met Tor",
"error_invalid_private_key": "Dit type privésleutel wordt niet ondersteund",
"gui_tor_connection_lost": "De verbinding met Tor is verbroken.",
diff --git a/share/locale/pa.json b/share/locale/pa.json
index a2a967cc..165e297b 100644
--- a/share/locale/pa.json
+++ b/share/locale/pa.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"large_filesize": "",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -37,12 +37,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/pl.json b/share/locale/pl.json
index f10a30ce..33b0ea73 100644
--- a/share/locale/pl.json
+++ b/share/locale/pl.json
@@ -10,8 +10,8 @@
"not_a_readable_file": "{0:s} nie jest plikiem do odczytu.",
"no_available_port": "Nie można znaleźć dostępnego portu aby włączyć usługę onion",
"other_page_loaded": "Adres został wczytany",
- "close_on_timeout": "Zatrzymano, gdyż upłynął czas",
- "closing_automatically": "Zatrzymano, gdyż pobieranie zostało ukończone",
+ "close_on_autostop_timer": "Zatrzymano, ponieważ czasomierz automatycznego zatrzymania wygasł",
+ "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",
"systray_menu_exit": "Wyjście",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "Użytkownik rozpoczął wysyłanie plików na Twój komputer",
"help_local_only": "Nie wykorzystuj sieci Tor (opcja zaawansowana)",
"help_stay_open": "Kontynuuj udostępnianie po pierwszym pobraniu",
- "help_shutdown_timeout": "Przestań udostępniać po określonym czasie w sekundach",
+ "help_autostop_timer": "Przestań udostępniać po określonym czasie w sekundach",
"help_stealth": "Korzystaj z weryfikacji klienta (zaawansowane)",
"help_receive": "Odbieraj dane zamiast je wysyłać",
- "help_debug": "Zapisz błędy OnionShare do stdout i zapisz błędy sieciowe na dysku",
+ "help_verbose": "Zapisz błędy OnionShare do stdout i zapisz błędy sieciowe na dysku",
"help_filename": "Lista plików i folderów do udostępnienia",
"help_config": "Lokalizacja niestandarowego pliku konfiguracyjnego JSON (opcjonalne)",
"gui_drag_and_drop": "Przeciągnij i upuść pliki i foldery\naby je udostępnić",
@@ -37,12 +37,12 @@
"gui_choose_items": "Wybierz",
"gui_share_start_server": "Rozpocznij udostępnianie",
"gui_share_stop_server": "Zatrzymaj udostępnianie",
- "gui_share_stop_server_shutdown_timeout": "Zatrzymaj udostępnianie (zostało {}s)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Czas upłynie za {}",
+ "gui_share_stop_server_autostop_timer": "Przerwij Udostępnianie ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Czas upłynie za {}",
"gui_receive_start_server": "Rozpocznij tryb odbierania",
"gui_receive_stop_server": "Zatrzymaj tryb odbierania",
- "gui_receive_stop_server_shutdown_timeout": "Zatrzymaj tryb odbierania (pozostało {}s)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Czas upływa za {}",
+ "gui_receive_stop_server_autostop_timer": "Zatrzymaj tryb odbierania (pozostało {})",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Czas upływa za {}",
"gui_copy_url": "Kopiuj adres załącznika",
"gui_copy_hidservauth": "Kopiuj HidServAuth",
"gui_downloads": "Historia pobierania",
@@ -69,7 +69,7 @@
"gui_settings_window_title": "Ustawienia",
"gui_settings_whats_this": "<a href='{0:s}'>Co to jest?</a>",
"gui_settings_stealth_option": "Użyj autoryzacji klienta",
- "gui_settings_stealth_hidservauth_string": "Skoro zapisałeś swój klucz prywatny do ponownego użycia, oznacza to, że możesz\nnacisnąć aby skopiować Twój HidServAuth.",
+ "gui_settings_stealth_hidservauth_string": "Po zapisaniu klucza prywatnego do ponownego użycia, możesz teraz kliknąć, aby skopiować HidServAuth.",
"gui_settings_autoupdate_label": "Sprawdź nową wersję",
"gui_settings_autoupdate_option": "Poinformuj mnie, kiedy nowa wersja programu będzie dostępna",
"gui_settings_autoupdate_timestamp": "Ostatnie sprawdzenie aktualizacji: {}",
@@ -77,11 +77,11 @@
"gui_settings_autoupdate_check_button": "Sprawdź, czy nowa wersja programu jest dostępna",
"gui_settings_general_label": "Ustawienia ogólne",
"gui_settings_sharing_label": "Ustawienia udostępniania",
- "gui_settings_close_after_first_download_option": "Przestań udostępniać po pierwszym pobraniu",
+ "gui_settings_close_after_first_download_option": "Zatrzymaj udostępnianie po wysłaniu plików",
"gui_settings_connection_type_label": "W jaki sposób OnionShare powinien połączyć się z siecią Tor?",
"gui_settings_connection_type_bundled_option": "Skorzystaj z wersji Tora udostępnionego wraz z OnionShare",
"gui_settings_connection_type_automatic_option": "Spróbuj automatycznej konfiguracji za pomocą Tor Browser",
- "gui_settings_connection_type_control_port_option": "",
+ "gui_settings_connection_type_control_port_option": "Połącz za pomocą portu sterowania",
"gui_settings_connection_type_socket_file_option": "Połącz z użyciem pliku socket",
"gui_settings_connection_type_test_button": "Sprawdź połączenie z siecią Tor",
"gui_settings_control_port_label": "Port sterowania",
@@ -93,10 +93,10 @@
"gui_settings_password_label": "Hasło",
"gui_settings_tor_bridges": "Wsparcie mostków sieci Tor",
"gui_settings_tor_bridges_no_bridges_radio_option": "Nie korzystaj z mostków sieci Tor",
- "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_obfs4_radio_option": "Użyj wbudowanych transportów wtykowych obfs4",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Użyj wbudowanych transportów plug-in obfs4 (wymaga obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Użyj wbudowanych przenośnych transportów meek_lite (Azure)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Użyj wbudowanych przenośnych transportów meek_lite (Azure) (wymaga obfs4proxy)",
"gui_settings_meek_lite_expensive_warning": "Uwaga: Mostki meek_lite są bardzo kosztowne dla Tor Project.<br><br>Korzystaj z nich tylko wtedy, gdy nie możesz połączyć się bezpośrednio z siecią Tor, poprzez obsf4 albo przez inne normalne mostki.",
"gui_settings_tor_bridges_custom_radio_option": "Użyj niestandardowych mostków",
"gui_settings_tor_bridges_custom_label": "Mostki możesz znaleźć na <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "Zapisz",
"gui_settings_button_cancel": "Anuluj",
"gui_settings_button_help": "Pomoc",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "Użyj czasomierza automatycznego zatrzymania",
+ "gui_settings_autostop_timer": "Zatrzymaj udział w:",
"settings_error_unknown": "Nie można połączyć się z kontrolerem Tor, ponieważ Twoje ustawienia nie mają sensu.",
"settings_error_automatic": "Nie można połączyć się z kontrolerem Tor. Czy Tor Browser (dostępny na torproject.org) działa w tle?",
"settings_error_socket_port": "Nie można połączyć się z kontrolerem Tor pod adresem {}:{}.",
@@ -113,7 +113,7 @@
"settings_error_auth": "Połączono z {}:{} ale nie można uwierzytelnić. Być może to nie jest kontroler Tor?",
"settings_error_missing_password": "Połączono z kontrolerem Tor ale wymaga on hasła do uwierzytelnienia.",
"settings_error_unreadable_cookie_file": "Połączono z kontrolerem Tor ale hasło może być niepoprawne albo Twój użytkownik nie ma uprawnień do odczytania plików cookie.",
- "settings_error_bundled_tor_not_supported": "",
+ "settings_error_bundled_tor_not_supported": "Używanie wersji Tora dołączonej do OnionShare nie działa w trybie programisty w systemie Windows lub MacOS.",
"settings_error_bundled_tor_timeout": "Połączenie się z siecią Tor zajmuje zbyt dużo czasu. Być może nie jesteś połączony z internetem albo masz niedokładny zegar systemowy?",
"settings_error_bundled_tor_broken": "OnionShare nie mógł połączyć się z siecią Tor w tle\n{}",
"settings_test_success": "Połączono z kontrolerem Tor.\n\nWersja Tor: {}\nWsparcie ulotnych serwisów onion: {}.\nWsparcie autoryzacji klienta: {}.\nWsparcie adresów onion nowej generacji: {}.",
@@ -123,53 +123,53 @@
"connecting_to_tor": "Łączę z siecią Tor",
"update_available": "Nowa wersja programu OnionShare jest dostępna. <a href='{}'>Naciśnij tutaj</a> aby ją ściągnąć.<br><br>Korzystasz z wersji {} a najnowszą jest {}.",
"update_error_check_error": "Nie można sprawdzić czy są dostępne aktualizacje. Strona programu OnionShare mówi, że ostatnia wersja programu jest nierozpoznawalna '{}'…",
- "update_error_invalid_latest_version": "",
- "update_not_available": "",
- "gui_tor_connection_ask": "",
+ "update_error_invalid_latest_version": "Nie można sprawdzić nowej wersji: Może nie masz połączenia z Torem lub nie działa witryna OnionShare?",
+ "update_not_available": "Korzystasz z najnowszej wersji OnionShare.",
+ "gui_tor_connection_ask": "Otworzyć ustawienia w celu poprawy połączenia z Tor?",
"gui_tor_connection_ask_open_settings": "Tak",
"gui_tor_connection_ask_quit": "Wyjście",
- "gui_tor_connection_error_settings": "",
- "gui_tor_connection_canceled": "",
- "gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
- "share_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_tor_connection_error_settings": "Spróbuj w ustawieniach zmienić sposób, w jaki OnionShare łączy się z siecią Tor.",
+ "gui_tor_connection_canceled": "Nie można połączyć się z Tor.\n\nSprawdź połączenie z Internetem, następnie ponownie otwórz OnionShare i skonfiguruj połączenie z Tor.",
+ "gui_tor_connection_lost": "Odłączony od Tor.",
+ "gui_server_started_after_autostop_timer": "Czasomierz automatycznego rozpoczęcia wygasł przed uruchomieniem serwera. Utwórz nowy udział.",
+ "gui_server_autostop_timer_expired": "Czasomierz automatycznego rozpoczęcia wygasł. Zaktualizuj go, aby rozpocząć udostępnianie.",
+ "share_via_onionshare": "OnionShare'uj to",
+ "gui_use_legacy_v2_onions_checkbox": "Użyj starszych adresów",
+ "gui_save_private_key_checkbox": "Użyj stałego adresu",
+ "gui_share_url_description": "<b>Każdy</b> z tym adresem OnionShare może <b> pobrać</b> Twoje pliki za pomocą przeglądarki <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Każdy</b> z tym adresem OnionShare może <b>przesyłać</b> pliki na komputer za pomocą przeglądarki <b>Tor Browser</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Ten udział nie zatrzyma się automatycznie.\n\nKażdy kolejny udział ponownie używa adresu. (Aby użyć adresów jednorazowych, wyłącz w ustawieniach „Użyj stałego adresu”.)",
+ "gui_url_label_stay_open": "Ten udział nie zostanie automatycznie zatrzymany.",
+ "gui_url_label_onetime": "Ten udział zatrzyma się po pierwszym zakończeniu.",
+ "gui_url_label_onetime_and_persistent": "Ten udział nie zatrzyma się automatycznie.\n\nKażdy kolejny udział ponownie wykorzysta adres. (Aby użyć adresów jednorazowych, wyłącz w ustawieniach „Użyj stałego adresu”.)",
+ "gui_status_indicator_share_stopped": "Gotowy do udostępniania",
+ "gui_status_indicator_share_working": "Rozpoczynanie…",
"gui_status_indicator_share_started": "Udostępnianie",
- "gui_status_indicator_receive_stopped": "",
- "gui_status_indicator_receive_working": "",
+ "gui_status_indicator_receive_stopped": "Gotowy do odbioru",
+ "gui_status_indicator_receive_working": "Rozpoczynanie…",
"gui_status_indicator_receive_started": "Otrzymuję",
- "gui_file_info": "",
- "gui_file_info_single": "",
- "history_in_progress_tooltip": "",
- "history_completed_tooltip": "",
+ "gui_file_info": "{} pliki, {}",
+ "gui_file_info_single": "{} plik, {}",
+ "history_in_progress_tooltip": "{} w trakcie",
+ "history_completed_tooltip": "{} zakończone",
"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": "",
- "receive_mode_upload_starting": "",
+ "gui_receive_mode_warning": "Tryb odbioru umożliwia przesyłanie plików do komputera.<br><br><b>Niektóre pliki mogą potencjalnie przejąć kontrolę nad komputerem, jeśli je otworzysz. Otwieraj rzeczy tylko od osób, którym ufasz, lub jeśli wiesz, co robisz.</b>",
+ "receive_mode_upload_starting": "Wysyłanie o całkowitej wielkości {} rozpoczyna się",
"receive_mode_received_file": "",
- "gui_mode_share_button": "",
- "gui_mode_receive_button": "",
- "gui_settings_receiving_label": "",
+ "gui_mode_share_button": "Udostępnij pliki",
+ "gui_mode_receive_button": "Odbierz pliki",
+ "gui_settings_receiving_label": "Ustawienia odbioru",
"gui_settings_downloads_label": "",
"gui_settings_downloads_button": "Przeglądaj",
"gui_settings_receive_allow_receiver_shutdown_checkbox": "",
- "gui_settings_public_mode_checkbox": "",
+ "gui_settings_public_mode_checkbox": "Tryb publiczny",
"systray_close_server_title": "",
"systray_close_server_message": "",
- "systray_page_loaded_title": "",
+ "systray_page_loaded_title": "Strona załadowana",
"systray_download_page_loaded_message": "",
"systray_upload_page_loaded_message": "",
"gui_uploads": "",
@@ -179,10 +179,51 @@
"gui_upload_finished_range": "",
"gui_upload_finished": "",
"gui_download_in_progress": "",
- "gui_open_folder_error_nautilus": "",
+ "gui_open_folder_error_nautilus": "Nie można otworzyć folderu, ponieważ nautilus nie jest dostępny. Plik jest tutaj:{}",
"gui_settings_language_label": "Preferowany język",
- "gui_settings_language_changed_notice": "",
+ "gui_settings_language_changed_notice": "Uruchom ponownie aplikację OnionShare, aby zmiana języka zaczęła obowiązywać.",
"timeout_upload_still_running": "Czekam na ukończenie wysyłania",
"gui_add_files": "Dodaj pliki",
- "gui_add_folder": "Dodaj foldery"
+ "gui_add_folder": "Dodaj foldery",
+ "gui_stop_server_autostop_timer_tooltip": "Automatyczne zatrzymanie zakończy się {}",
+ "gui_waiting_to_start": "Planowane rozpoczęcie w {}. Kliknij, aby anulować.",
+ "gui_settings_onion_label": "Ustawienia Onion",
+ "gui_settings_autostart_timer": "Rozpocznij udział w:",
+ "gui_server_autostart_timer_expired": "Zaplanowany czas już minął. Zaktualizuj go, aby rozpocząć udostępnianie.",
+ "gui_status_indicator_share_scheduled": "Zaplanowane…",
+ "gui_status_indicator_receive_scheduled": "Zaplanowane…",
+ "error_cannot_create_data_dir": "Nie można utworzyć folderu danych OnionShare: {}",
+ "gui_settings_data_dir_label": "Zapisz pliki do",
+ "gui_settings_data_dir_browse_button": "Przeglądaj",
+ "systray_page_loaded_message": "Załadowano adres OnionShare",
+ "systray_share_started_title": "Udostępnianie rozpoczęte",
+ "systray_share_started_message": "Rozpoczynam wysyłać pliki",
+ "systray_share_completed_title": "Udostępnianie zakończone",
+ "systray_share_completed_message": "Zakończono wysyłanie plików",
+ "systray_share_canceled_title": "Udostępnianie anulowane",
+ "systray_share_canceled_message": "Anulowano odbieranie plików",
+ "systray_receive_started_title": "Rozpoczęte Odbieranie",
+ "systray_receive_started_message": "Ktoś wysyła do ciebie pliki",
+ "gui_all_modes_history": "Historia",
+ "gui_all_modes_clear_history": "Wyczyść wszystko",
+ "gui_all_modes_transfer_started": "Uruchomiono {}",
+ "gui_all_modes_transfer_finished_range": "Przesyłano {} - {}",
+ "gui_all_modes_transfer_finished": "Przesyłano {}",
+ "gui_all_modes_transfer_canceled_range": "Anulowano {} - {}",
+ "gui_all_modes_transfer_canceled": "Anulowano {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} upłynęło.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (obliczanie)",
+ "gui_share_mode_no_files": "Żadne pliki nie zostały jeszcze wysłane",
+ "gui_share_mode_autostop_timer_waiting": "Oczekiwanie na zakończenie wysyłania",
+ "gui_receive_mode_no_files": "Nie odebrano jeszcze żadnych plików",
+ "gui_receive_mode_autostop_timer_waiting": "Czekam na zakończenie odbioru",
+ "gui_start_server_autostart_timer_tooltip": "Automatyczne rozpoczęcie zakończy się {}",
+ "gui_settings_autostart_timer_checkbox": "Użyj czasomierza automatycznego rozpoczęcia",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Czas automatycznego zakończenia nie może być równy bądź wcześniejszy niż czas automatycznego startu. Zaktualizuj go, aby rozpocząć udostępnianie.",
+ "gui_connect_to_tor_for_onion_settings": "Połącz się z Tor, aby zobaczyć ustawienia usług onion",
+ "gui_all_modes_progress_eta": "{0:s}, pozostało: {1:s}, %p%",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/pt_BR.json b/share/locale/pt_BR.json
index 7ff64809..c28f9f29 100644
--- a/share/locale/pt_BR.json
+++ b/share/locale/pt_BR.json
@@ -6,11 +6,11 @@
"give_this_url_receive": "Enviar este endereço à pessoa remetente:",
"give_this_url_receive_stealth": "Dar este endereço e HidServAuth à pessoa remetente:",
"ctrlc_to_stop": "Pressione Ctrl+C para interromper o servidor",
- "not_a_file": "{0:s} não é um ficheiro válido.",
- "not_a_readable_file": "{0:s} não é um ficheiro legível.",
- "no_available_port": "Não foi possível encontrar um pórtico disponível para iniciar o serviço onion",
+ "not_a_file": "{0:s} não é um arquivo válido.",
+ "not_a_readable_file": "{0:s} não é um arquivo legível.",
+ "no_available_port": "Não foi possível encontrar uma porta disponível para iniciar o serviço onion",
"other_page_loaded": "Endereço carregado",
- "close_on_timeout": "Interrompido ao final da contagem do cronômetro automático",
+ "close_on_autostop_timer": "Interrompido ao final da contagem do cronômetro automático",
"closing_automatically": "Interrompido após o término da transferência",
"timeout_download_still_running": "Esperando que o download termine",
"large_filesize": "Aviso: O envio de arquivos grandes pode levar várias horas",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "Alguém começou a carregar arquivos no seu computador",
"help_local_only": "Não use Tor (unicamente para programação)",
"help_stay_open": "Continuar a compartilhar após o envio de documentos",
- "help_shutdown_timeout": "Parar de compartilhar após um número determinado de segundos",
+ "help_autostop_timer": "Parar de compartilhar após um número determinado de segundos",
"help_stealth": "Usar autorização de cliente (avançado)",
"help_receive": "Receber compartilhamentos ao invés de enviá-los",
- "help_debug": "Registrar erros do OnionShare no stdout e erros de rede, no disco",
+ "help_verbose": "Registrar erros do OnionShare no stdout e erros de rede, no disco",
"help_filename": "Lista de arquivos ou pastas a compartilhar",
"help_config": "Personalizar a configuração JSON de localização de arquivos (opcional)",
"gui_drag_and_drop": "Arrastar arquivos e pastas\npara começar a compartilhá-los",
@@ -37,12 +37,12 @@
"gui_choose_items": "Escolher",
"gui_share_start_server": "Começar a compartilhar",
"gui_share_stop_server": "Parar de compartilhar",
- "gui_share_stop_server_shutdown_timeout": "Parar de compartilhar ({}segundos para terminar)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "O cronômetro automático termina às",
+ "gui_share_stop_server_autostop_timer": "Parar de compartilhar daqui a ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "O cronômetro automático termina às",
"gui_receive_start_server": "Modo Começar a Receber",
"gui_receive_stop_server": "Modo Parar de Receber",
- "gui_receive_stop_server_shutdown_timeout": "Modo Parar de Receber ({}segundos para terminar)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "O cronômetro automático termina às {}",
+ "gui_receive_stop_server_autostop_timer": "Modo Parar de Receber ({} para terminar)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "O cronômetro automático termina às {}",
"gui_copy_url": "Copiar endereço",
"gui_copy_hidservauth": "Copiar HidServAuth",
"gui_downloads": "Histórico de download",
@@ -58,7 +58,7 @@
"gui_download_upload_progress_eta": "{0:s}, tempo estimado para término: {1:s}, %p%",
"version_string": "OnionShare {0:s} | https://onionshare.org/",
"gui_quit_title": "Mais devagar",
- "gui_share_quit_warning": "O envio dos seus arquivos ainda não terminou . Você tem certeza de que quer sair de OnionShare?",
+ "gui_share_quit_warning": "O envio dos seus arquivos ainda não terminou. Você tem certeza de que quer sair de OnionShare?",
"gui_receive_quit_warning": "O recebimento dos seus arquivos ainda não terminou. Você tem certeza de que quer sair do OnionShare?",
"gui_quit_warning_quit": "Sair",
"gui_quit_warning_dont_quit": "Cancelar",
@@ -72,47 +72,47 @@
"gui_settings_stealth_hidservauth_string": "Após salvar a sua chave privada para reutilização, você pode clicar para copiar o seu HidServAuth.",
"gui_settings_autoupdate_label": "Procurar a nova versão",
"gui_settings_autoupdate_option": "Notificar-me quando uma nova versão estiver disponível",
- "gui_settings_autoupdate_timestamp": "Última atualização: {}",
+ "gui_settings_autoupdate_timestamp": "Última verificação: {}",
"gui_settings_autoupdate_timestamp_never": "Nunca",
"gui_settings_autoupdate_check_button": "Procurar a nova versão",
"gui_settings_general_label": "Configurações gerais",
- "gui_settings_sharing_label": "Compartilhando configurações",
+ "gui_settings_sharing_label": "Configurações de compartilhar",
"gui_settings_close_after_first_download_option": "Parar de compartilhar após o envio dos arquivos",
"gui_settings_connection_type_label": "Como OnionShare normalmente conecta-se a Tor?",
"gui_settings_connection_type_bundled_option": "Use a versão de Tor que vem junto com OnionShare",
"gui_settings_connection_type_automatic_option": "Tentar configuração automática com o Navegador Tor",
- "gui_settings_connection_type_control_port_option": "Conectar usando entrada de controle",
- "gui_settings_connection_type_socket_file_option": "Conectar usando um ficheiro socket",
+ "gui_settings_connection_type_control_port_option": "Conectar usando porta de controle",
+ "gui_settings_connection_type_socket_file_option": "Conectar usando um arquivo socket",
"gui_settings_connection_type_test_button": "Testar a conexão a Tor",
- "gui_settings_control_port_label": "Entrada de controle",
- "gui_settings_socket_file_label": "Ficheiro socket",
- "gui_settings_socks_label": "Entrada SOCKS",
+ "gui_settings_control_port_label": "Porta de controle",
+ "gui_settings_socket_file_label": "Arquivo socket",
+ "gui_settings_socks_label": "Porta SOCKS",
"gui_settings_authenticate_label": "Configurações de autenticação do Tor",
"gui_settings_authenticate_no_auth_option": "Sem autenticação nem cookie de autenticação",
- "gui_settings_authenticate_password_option": "Palavra-passe",
- "gui_settings_password_label": "Palavra-passe",
- "gui_settings_tor_bridges": "Ajuda para pontes Tor",
+ "gui_settings_authenticate_password_option": "Senha",
+ "gui_settings_password_label": "Senha",
+ "gui_settings_tor_bridges": "Suporte a pontes Tor",
"gui_settings_tor_bridges_no_bridges_radio_option": "Não usar pontes",
"gui_settings_tor_bridges_obfs4_radio_option": "Usar transportadores plugáveis obfs4 já instalados",
"gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Usar transportadores plugáveis obfs4 já instalados (requer obfs4proxy)",
"gui_settings_tor_bridges_meek_lite_azure_radio_option": "Usar transportadores plugáveis meek_lite (Azure) instalados",
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Usar transportadores plugáveis meek_lite (Azure) instalados (requer obfs4proxy)",
- "gui_settings_meek_lite_expensive_warning": "Aviso: As pontes meek_lite são muito custosas para o Projeto Tor.<br><br>Use-as somente se você não conseguir se conectar a Tor diretamente, via transportadores obfs4 ou outras pontes comuns.",
+ "gui_settings_meek_lite_expensive_warning": "Aviso: as pontes meek_lite são muito custosas para o Projeto Tor.<br><br>Use-as somente se você não conseguir se conectar a Tor diretamente, via transportadores obfs4 ou outras pontes comuns.",
"gui_settings_tor_bridges_custom_radio_option": "Usar pontes personalizadas",
"gui_settings_tor_bridges_custom_label": "Você pode obter pontes em <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
"gui_settings_tor_bridges_invalid": "Nenhumas ponte adicionada funciona.\nTente usá-las de novo ou adicione outras.",
"gui_settings_button_save": "Salvar",
"gui_settings_button_cancel": "Cancelar",
"gui_settings_button_help": "Ajuda",
- "gui_settings_shutdown_timeout_checkbox": "Usar cronômetro para encerrar automaticamente",
- "gui_settings_shutdown_timeout": "Encerrar o compartilhamento às:",
+ "gui_settings_autostop_timer_checkbox": "Usar cronômetro para encerrar automaticamente",
+ "gui_settings_autostop_timer": "Encerrar o compartilhamento às:",
"settings_error_unknown": "Impossível conectar-se ao controlador do Tor, porque as suas configurações estão confusas.",
"settings_error_automatic": "Não foi possível conectar ao controlador do Tor. O Navegador Tor (disponível no site torproject.org) está rodando em segundo plano?",
"settings_error_socket_port": "Não pode ligar ao controlador do Tor em {}:{}.",
"settings_error_socket_file": "Não foi possível conectar ao controlador Tor usando o arquivo de socket {}.",
"settings_error_auth": "Conectado a {}:{}, mas não foi possível autenticar. Talvez este não seja um controlador Tor?",
"settings_error_missing_password": "Conectado ao controlador Tor, mas é preciso ter uma senha para autenticar.",
- "settings_error_unreadable_cookie_file": "Conectado ao controlador Tor, mas talvez a palavra-passe esteja incorreta, ou o seu usuário não possui autorização para ler o ficheiro de cookie.",
+ "settings_error_unreadable_cookie_file": "Conectado ao controlador Tor, mas talvez a senha esteja incorreta, ou o seu usuário não possui autorização para ler o arquivo de cookie.",
"settings_error_bundled_tor_not_supported": "Não é possível usar a versão de Tor que vem junto com OnionShare, em modo 'programação', com Windows ou macOS.",
"settings_error_bundled_tor_timeout": "A conexão a Tor está demorando muito. O seu computado está conectado à Internet e o seu relógio de sistema, ajustado?",
"settings_error_bundled_tor_broken": "OnionShare não pôde se conectar a Tor em segundo plano:\n{}",
@@ -131,15 +131,15 @@
"gui_tor_connection_error_settings": "Tente mudar nas configurações a forma como OnionShare se conecta à rede Tor.",
"gui_tor_connection_canceled": "Não foi possível conectar à rede Tor.\n\nVerifique se você está conectada à Internet, e então abra OnionShare novamente e configure sua conexão à rede Tor.",
"gui_tor_connection_lost": "Desconectado do Tor.",
- "gui_server_started_after_timeout": "O tempo esgotou antes do servidor iniciar.\nPor favor, crie um novo compartilhamento.",
- "gui_server_timeout_expired": "O temporizador já esgotou.\nPor favor, atualize-o antes de começar a compartilhar.",
+ "gui_server_started_after_autostop_timer": "O tempo esgotou antes do servidor iniciar.\nPor favor, crie um novo compartilhamento.",
+ "gui_server_autostop_timer_expired": "O cronômetro já esgotou.\nPor favor, atualize-o antes de começar a compartilhar.",
"share_via_onionshare": "Compartilhar usando OnionShare",
"gui_use_legacy_v2_onions_checkbox": "Usar endereços do tipo antigo",
"gui_save_private_key_checkbox": "Usar o mesmo endereço",
"gui_share_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>baixar</b> seus arquivos usando o <b>Tor Browser</b>: <img src='{}' />",
"gui_receive_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>carregar</b> arquivos no seu computador usando o <b>Tor Browser</b>: <img src='{}' />",
"gui_url_label_persistent": "Este compartilhamento não vai ser encerrado automaticamente.<br><br>Todos os compartilhamentos posteriores reutilizarão este endereço. (Para usar um endereço novo a cada vez, desative a opção \"Usar o mesmo endereço\" nas configurações.)",
- "gui_url_label_stay_open": "Este compartilhamento não sera encerrado automaticamente.",
+ "gui_url_label_stay_open": "Este compartilhamento não será encerrado automaticamente.",
"gui_url_label_onetime": "Este compartilhamento será encerrado após completar uma vez.",
"gui_url_label_onetime_and_persistent": "Este compartilhamento não será encerrado automaticamente.<br><br>Todos os compartilhamentos posteriores reutilizarão este endereço. (Para usar endereços únicos a cada compartilhamento, desative a opção \"Usar o mesmo endereço\" nas configurações.)",
"gui_status_indicator_share_stopped": "Pronto para compartilhar",
@@ -156,8 +156,8 @@
"info_completed_uploads_tooltip": "{} upload(s) completado(s)",
"error_cannot_create_downloads_dir": "Não foi possível a pasta do modo de recepção: {}",
"receive_mode_downloads_dir": "Os arquivos enviados para você aparecem na seguinte pasta: {}",
- "receive_mode_warning": "Atenção: O modo de recepção permite que as pessoas enviem arquivos para o seu computador. Alguns arquivos podem tomar o controle do seu computador se você abrí-los. Apenas abra arquivos enviados por pessoas que você confia, ou se você souber o que está fazendo.",
- "gui_receive_mode_warning": "O modo de recepção permite que pessoas enviem arquivos para o seu computador.<br><br><b>Alguns arquivos podem tomar o controle do seu computador se você abrí-los. Apenas abra arquivos enviados por pessoas que você confia, ou se você souber o que está fazendo.</b>",
+ "receive_mode_warning": "Atenção: O modo de recepção permite que as pessoas enviem arquivos para o seu computador. Alguns arquivos podem tomar o controle do seu computador se você abri-los. Apenas abra arquivos enviados por pessoas que você confia, ou se você souber o que está fazendo.",
+ "gui_receive_mode_warning": "O modo de recepção permite que pessoas enviem arquivos para o seu computador.<br><br><b>Alguns arquivos podem tomar o controle do seu computador se você abri-los. Apenas abra arquivos enviados por pessoas que você confia, ou se você souber o que está fazendo.</b>",
"receive_mode_upload_starting": "Um upload de tamanho total {} está sendo iniciado",
"receive_mode_received_file": "Recebido: {}",
"gui_mode_share_button": "Compartilhar Arquivos",
@@ -183,7 +183,7 @@
"gui_settings_language_label": "Idioma",
"gui_settings_language_changed_notice": "Reinicie OnionShare para que sua alteração de idioma tenha efeito.",
"timeout_upload_still_running": "Esperando o término do upload",
- "gui_add_files": "Adicionar Documentos",
+ "gui_add_files": "Adicionar Arquivos",
"gui_add_folder": "Adicionar Pasta",
"gui_share_mode_no_files": "Nenhum arquivo ainda enviado",
"gui_connect_to_tor_for_onion_settings": "Conectar ao Tor para ver as configurações do serviço onion",
@@ -206,7 +206,25 @@
"gui_all_modes_transfer_finished": "Transferido {}",
"gui_all_modes_transfer_canceled_range": "Cancelado {} - {}",
"gui_all_modes_transfer_canceled": "Cancelado {}",
- "gui_share_mode_timeout_waiting": "Esperando para completar o envio",
+ "gui_share_mode_autostop_timer_waiting": "Esperando para completar o envio",
"gui_receive_mode_no_files": "Nenhum arquivo recebido",
- "gui_receive_mode_timeout_waiting": "Esperando para completar o recebimento"
+ "gui_receive_mode_autostop_timer_waiting": "Esperando para completar o recebimento",
+ "gui_settings_onion_label": "Configurando Onion",
+ "systray_page_loaded_message": "Endereço OnionShare foi carregado",
+ "gui_all_modes_progress_complete": "%p%, {0:s} em curso.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (calculando)",
+ "gui_all_modes_progress_eta": "{0:s}, Tempo aproximado: {1:s}, %p%",
+ "gui_stop_server_autostop_timer_tooltip": "O cronômetro automático encerra às {}",
+ "gui_start_server_autostart_timer_tooltip": "O cronômetro para começar automaticamente esgota às {}",
+ "gui_waiting_to_start": "Marcado para começar daqui a {}. Clique para cancelar.",
+ "gui_settings_autostart_timer_checkbox": "Usar cronômetro para começar automaticamente",
+ "gui_settings_autostart_timer": "Começar o compartilhamento às:",
+ "gui_server_autostart_timer_expired": "O horário marcado já passou. Por favor, atualize-o para começar a compartilhar.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "O horário para o término automático não pode ser o mesmo ou anterior aquele marcado para começar. Por favor, atualize-o para começar a compartilhar.",
+ "gui_status_indicator_share_scheduled": "Marcado…",
+ "gui_status_indicator_receive_scheduled": "Marcado…",
+ "days_first_letter": "dia(s)",
+ "hours_first_letter": "hora(s)",
+ "minutes_first_letter": "minuto(s)",
+ "seconds_first_letter": "segundo(s)"
}
diff --git a/share/locale/pt_PT.json b/share/locale/pt_PT.json
index 7085f2c2..3cf4be4e 100644
--- a/share/locale/pt_PT.json
+++ b/share/locale/pt_PT.json
@@ -1,19 +1,19 @@
{
- "config_onion_service": "",
- "preparing_files": "",
- "give_this_url": "Passe este URL para a pessoa que deve receber o arquivo:",
- "give_this_url_stealth": "",
- "give_this_url_receive": "",
- "give_this_url_receive_stealth": "",
- "ctrlc_to_stop": "Pressione Ctrl-C para parar o servidor",
- "not_a_file": "{0:s} não é um arquivo.",
- "not_a_readable_file": "",
- "no_available_port": "",
- "other_page_loaded": "Outra página tem sido carregada",
- "close_on_timeout": "",
- "closing_automatically": "",
+ "config_onion_service": "A configurar o serviço onion na porta {0:d}.",
+ "preparing_files": "A comprimir ficheiros.",
+ "give_this_url": "Dar este endereço ao destinatário:",
+ "give_this_url_stealth": "Dar este endereço e linha HidServAuth ao destinatário:",
+ "give_this_url_receive": "Dar este endereço ao remetente:",
+ "give_this_url_receive_stealth": "Dar este endereço e HidServAuth ao remetente:",
+ "ctrlc_to_stop": "Pressionar Ctrl-C para parar o servidor",
+ "not_a_file": "{0:s} não é um ficheiro válido.",
+ "not_a_readable_file": "{0:s} não é um ficheiro legível.",
+ "no_available_port": "Não foi possível encontrar uma porta disponível para iniciar o serviço onion",
+ "other_page_loaded": "Endereço carregado",
+ "close_on_autostop_timer": "Parado porque o cronómetro de paragem automática chegou a zero",
+ "closing_automatically": "Parado porque a transferência está completa",
"timeout_download_still_running": "",
- "large_filesize": "",
+ "large_filesize": "Aviso: o envio de ficheiros grandes pode levar várias horas",
"systray_menu_exit": "Sair",
"systray_download_started_title": "",
"systray_download_started_message": "",
@@ -23,153 +23,153 @@
"systray_download_canceled_message": "",
"systray_upload_started_title": "",
"systray_upload_started_message": "",
- "help_local_only": "",
- "help_stay_open": "",
- "help_shutdown_timeout": "",
- "help_stealth": "",
- "help_receive": "",
- "help_debug": "",
- "help_filename": "",
- "help_config": "",
- "gui_drag_and_drop": "",
- "gui_add": "",
+ "help_local_only": "Não usar o Tor (apenas para programadores)",
+ "help_stay_open": "Continuar a partilhar após o envio dos ficheiros",
+ "help_autostop_timer": "Parar de partilhar após um número determinado de segundos",
+ "help_stealth": "Usar autorização de cliente (avançado)",
+ "help_receive": "Receber partilhas em vez de de enviá-las",
+ "help_debug": "Registar erros do OnionShare no stdout e erros de rede no disco",
+ "help_filename": "Lista de ficheiros ou pastas a partilhar",
+ "help_config": "Localização personalizada do ficheiro de configuração JSON (opcional)",
+ "gui_drag_and_drop": "Arrastar ficheiros e pastas\npara começar a partilhá-los",
+ "gui_add": "Adicionar",
"gui_delete": "Eliminar",
- "gui_choose_items": "Escolha",
- "gui_share_start_server": "",
- "gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
- "gui_receive_start_server": "",
- "gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
- "gui_copy_url": "",
- "gui_copy_hidservauth": "",
+ "gui_choose_items": "Escolher",
+ "gui_share_start_server": "Começar a partilhar",
+ "gui_share_stop_server": "Parar de partilhar",
+ "gui_share_stop_server_autostop_timer": "Parar de partilhar ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "O cronómetro automático de parar a partilha termina em {}",
+ "gui_receive_start_server": "Começar modo de receber",
+ "gui_receive_stop_server": "Parar modo de receber",
+ "gui_receive_stop_server_autostop_timer": "Parar modo de receber ({} restantes)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "O cronómetro automático de parar a partilha termina em {}",
+ "gui_copy_url": "Copiar endereço",
+ "gui_copy_hidservauth": "Copiar HidServAuth",
"gui_downloads": "",
"gui_no_downloads": "",
- "gui_canceled": "Cancelada",
- "gui_copied_url_title": "",
- "gui_copied_url": "URL foi copiado para área de transferência",
- "gui_copied_hidservauth_title": "",
- "gui_copied_hidservauth": "",
- "gui_please_wait": "",
+ "gui_canceled": "Cancelado",
+ "gui_copied_url_title": "Endereço OnionShare copiado",
+ "gui_copied_url": "O endereço OnionShare foi copiado para área de transferência",
+ "gui_copied_hidservauth_title": "HidServAuth copiado",
+ "gui_copied_hidservauth": "Linha HidServAuth copiada para a área de transferência",
+ "gui_please_wait": "A começar… Clicar para cancelar.",
"gui_download_upload_progress_complete": "",
"gui_download_upload_progress_starting": "",
"gui_download_upload_progress_eta": "",
- "version_string": "",
- "gui_quit_title": "",
- "gui_share_quit_warning": "",
- "gui_receive_quit_warning": "",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Mais devagar",
+ "gui_share_quit_warning": "O envio dos seus ficheiros ainda não terminou. Mesmo assim quer sair do OnionShare?",
+ "gui_receive_quit_warning": "Ainda não recebeu todos os seus ficheiros. Mesmo assim quer sair do OnionShare?",
"gui_quit_warning_quit": "Sair",
"gui_quit_warning_dont_quit": "Cancelar",
- "error_rate_limit": "",
- "zip_progress_bar_format": "",
- "error_stealth_not_supported": "",
- "error_ephemeral_not_supported": "",
- "gui_settings_window_title": "Definições",
- "gui_settings_whats_this": "",
- "gui_settings_stealth_option": "",
- "gui_settings_stealth_hidservauth_string": "",
- "gui_settings_autoupdate_label": "",
- "gui_settings_autoupdate_option": "",
- "gui_settings_autoupdate_timestamp": "",
+ "error_rate_limit": "Alguém tentou por várias vezes aceder ao seu endereço, o que talvez signifique que essa pessoa esteja tentando adivinhá-lo. Por isso o OnionShare interrompeu o servidor. Recomece a partilhar e envie um novo endereço ao seu destinatário para continuar a partilhar.",
+ "zip_progress_bar_format": "A comprimir: %p%",
+ "error_stealth_not_supported": "Para usar uma autorização de cliente, precisa pelo menos do Tor 0.2.9.1-alpha (ou do Tor Browser 6.5) e do python3-stem 1.5.0.",
+ "error_ephemeral_not_supported": "OnionShare requer pelo menos do Tor 0.2.7.1 e do python3-stem 1.4.0.",
+ "gui_settings_window_title": "Configurações",
+ "gui_settings_whats_this": "<a href='{0:s}'>O que é isto?</a>",
+ "gui_settings_stealth_option": "Usar autorização de cliente",
+ "gui_settings_stealth_hidservauth_string": "Após guardar a sua chave privada para reutilização, pode clicar para copiar o seu HidServAuth.",
+ "gui_settings_autoupdate_label": "Verificação de novas atualizações",
+ "gui_settings_autoupdate_option": "Notificar-me quando existir uma nova versão disponível",
+ "gui_settings_autoupdate_timestamp": "Última verificação: {}",
"gui_settings_autoupdate_timestamp_never": "Nunca",
- "gui_settings_autoupdate_check_button": "",
- "gui_settings_general_label": "Definições gerais",
- "gui_settings_sharing_label": "",
- "gui_settings_close_after_first_download_option": "",
- "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": "Password",
- "gui_settings_password_label": "Password",
- "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_autoupdate_check_button": "Verificar se há atualizações",
+ "gui_settings_general_label": "Configurações gerais",
+ "gui_settings_sharing_label": "Configurações de partilha",
+ "gui_settings_close_after_first_download_option": "Parar de partilhar após terminar o envio dos ficheiros",
+ "gui_settings_connection_type_label": "Como é que o OnionShare se deve conectar ao Tor?",
+ "gui_settings_connection_type_bundled_option": "Usar a versão do Tor que vem no OnionShare",
+ "gui_settings_connection_type_automatic_option": "Tentar configurar automaticamente com o Tor Browser",
+ "gui_settings_connection_type_control_port_option": "Conectar utilizando a porta de controlo",
+ "gui_settings_connection_type_socket_file_option": "Conectar utilizando um ficheiro socket",
+ "gui_settings_connection_type_test_button": "Testar a conexão ao Tor",
+ "gui_settings_control_port_label": "Porta de controlo",
+ "gui_settings_socket_file_label": "Ficheiro socket",
+ "gui_settings_socks_label": "Porta SOCKS",
+ "gui_settings_authenticate_label": "Configurações de autenticação do Tor",
+ "gui_settings_authenticate_no_auth_option": "Sem autenticação nem cookie de autenticação",
+ "gui_settings_authenticate_password_option": "Palavra-passe",
+ "gui_settings_password_label": "Palavra-passe",
+ "gui_settings_tor_bridges": "Suporte a pontes Tor",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Não usar pontes",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Usar transportadores plugáveis obfs4 já instalados",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Usar transportadores plugáveis obfs4 já instalados (requer obfs4proxy)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Usar transportadores plugáveis meek_lite (Azure) instalados",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Usar transportadores plugáveis meek_lite (Azure) instalados (requer obfs4proxy)",
+ "gui_settings_meek_lite_expensive_warning": "Aviso: as pontes meek_lite são muito dispendiosas para o Projeto Tor.<br><br>Use-as apenas se não conseguir conectar-se à rede Tor diretamente, via transportadores obfs4 ou outras pontes comuns.",
+ "gui_settings_tor_bridges_custom_radio_option": "Usar pontes personalizadas",
+ "gui_settings_tor_bridges_custom_label": "Pode obter pontes em <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Nenhuma das pontes que adicionou funciona.\nVerifique se estão corretas ou adicione outras.",
+ "gui_settings_button_save": "Guardar",
"gui_settings_button_cancel": "Cancelar",
"gui_settings_button_help": "Ajuda",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
- "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": "",
- "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": "",
+ "gui_settings_autostop_timer_checkbox": "Usar cronómetro de paragem automática",
+ "gui_settings_autostop_timer": "Parar a partilha em:",
+ "settings_error_unknown": "Não foi possível conectar ao controlador Tor porque as suas configurações não fazem sentido.",
+ "settings_error_automatic": "Não foi possível conectar ao controlador do Tor. O Tor Browser (disponível no site torproject.org) está a ser executado em segundo plano?",
+ "settings_error_socket_port": "Não foi possível conectar ao controlador do Tor em {}:{}.",
+ "settings_error_socket_file": "Não foi possível conectar ao controlador Tor usando o ficheiro de socket {}.",
+ "settings_error_auth": "Conectado a {}:{}, mas não foi possível autenticar. Talvez não seja um controlador Tor?",
+ "settings_error_missing_password": "Conectado ao controlador Tor, mas é preciso ter uma palavra-passe para autenticar.",
+ "settings_error_unreadable_cookie_file": "Conectado ao controlador Tor, mas talvez a palavra-passe esteja incorreta ou o seu utilizador não tem autorização para ler o ficheiro do cookie.",
+ "settings_error_bundled_tor_not_supported": "Não é possível usar a versão do Tor que vem com o OnionShare em modo 'programação', com Windows ou macOS.",
+ "settings_error_bundled_tor_timeout": "A conexão ao Tor está a demorar muito. Está conectado à Internet e o relógio do computador está correto?",
+ "settings_error_bundled_tor_broken": "O OnionShare não consegui conectar-se ao Tor em segundo plano:\n{}",
+ "settings_test_success": "Conectado ao controlador Tor.\n\nVersão do Tor: {}\nSuporte a serviços onion efémeros: {}.\nSuporte a autenticação de cliente: {}.\nSuporte à próxima geração de endereços .onion: {}.",
+ "error_tor_protocol_error": "Houve um erro com Tor: {}",
+ "error_tor_protocol_error_unknown": "Ocorreu um erro desconhecido com Tor",
+ "error_invalid_private_key": "Este tipo de chave privada não é suportada",
+ "connecting_to_tor": "A conectar à rede Tor",
+ "update_available": "Está disponível uma nova versão do OnionShare. <a href='{}'>Clique aqui</a> para obtê-la.<br><br>Está a usar a versão {} e a última versão é a {}.",
+ "update_error_check_error": "Não foi possível verificar se existem novas versões: o site do OnionShare está a comunicar que a última versão é a irreconhecível '{}'…",
+ "update_error_invalid_latest_version": "Não foi possível verificar se existe uma nova versão: talvez não esteja conectada ao Tor ou talvez o site do OnionShare esteja desligado?",
+ "update_not_available": "Está a usar a última versão do OnionShare.",
+ "gui_tor_connection_ask": "Abrir as configurações para corrigir a conexão ao Tor?",
"gui_tor_connection_ask_open_settings": "Sim",
"gui_tor_connection_ask_quit": "Sair",
- "gui_tor_connection_error_settings": "",
- "gui_tor_connection_canceled": "",
- "gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
- "share_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_tor_connection_error_settings": "Tente mudar nas configurações a forma como OnionShare se conecta à rede Tor.",
+ "gui_tor_connection_canceled": "Não foi possível conectar à rede Tor.\n\nVerifique se está conectado à Internet e então abra o OnionShare novamente e configure a sua conexão à rede Tor.",
+ "gui_tor_connection_lost": "Desconectado da rede Tor.",
+ "gui_server_started_after_autostop_timer": "O cronómetro de paragem automática atingiu o tempo limite antes do servidor iniciar. Crie uma nova partilha.",
+ "gui_server_autostop_timer_expired": "O cronómetro de paragem automática atingiu o tempo limite. Altere-o para começar uma nova partilha.",
+ "share_via_onionshare": "Partilhar utilizando o OnionShare",
+ "gui_use_legacy_v2_onions_checkbox": "Usar endereços antigos",
+ "gui_save_private_key_checkbox": "Usar um endereço persistente",
+ "gui_share_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>descarregar</b> os seus ficheiros utilizando o <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Qualquer pessoa</b> com este endereço do OnionShare pode <b>enviar</b> ficheiros para o seu computador utilizando o <b>Tor Browser</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Esta partilha não vai ser encerrada automaticamente.<br><br>Todas as partilhas posteriores utilizarão este endereço. (Para usar endereços de uma só utilização, desative a opção \"Usar endereço persistente\" nas configurações.)",
+ "gui_url_label_stay_open": "Esta partilha não irá parar automaticamente.",
+ "gui_url_label_onetime": "Esta partilha irá parar após ser descarregada uma vez com sucesso.",
+ "gui_url_label_onetime_and_persistent": "Esta partilha não vai ser encerrada automaticamente.<br><br>Todas as partilhas posteriores utilizarão este endereço. (Para usar endereços de uma só utilização, desative a opção \"Usar endereço persistente\" nas configurações.)",
+ "gui_status_indicator_share_stopped": "Pronto para partilhar",
+ "gui_status_indicator_share_working": "A começar…",
+ "gui_status_indicator_share_started": "A partilhar",
+ "gui_status_indicator_receive_stopped": "Pronto para receber",
+ "gui_status_indicator_receive_working": "A começar…",
+ "gui_status_indicator_receive_started": "A receber",
+ "gui_file_info": "{} ficheiros, {}",
+ "gui_file_info_single": "{} ficheiro, {}",
+ "history_in_progress_tooltip": "{} a decorrer",
+ "history_completed_tooltip": "{} completo",
"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": "",
- "receive_mode_upload_starting": "",
- "receive_mode_received_file": "",
- "gui_mode_share_button": "",
- "gui_mode_receive_button": "",
- "gui_settings_receiving_label": "",
+ "receive_mode_warning": "Atenção: o modo de receção permite que as pessoas enviem ficheiros para o seu computador. Alguns ficheiros podem tomar o controlo do seu computador se os abrir. Apenas abra ficheiros enviados por pessoas que confia ou se souber o que está a fazer.",
+ "gui_receive_mode_warning": "O modo de receção permite que as pessoas enviem ficheiros para o seu computador.<br><br><b>Alguns ficheiros podem tomar o controlo do seu computador se os abrir. Apenas abra ficheiros enviados por pessoas que confia ou se souber o que está a fazer.</b>",
+ "receive_mode_upload_starting": "Está a começar um envio com um tamanho total de {}",
+ "receive_mode_received_file": "Recebido: {}",
+ "gui_mode_share_button": "Partilhar ficheiros",
+ "gui_mode_receive_button": "Receber ficheiros",
+ "gui_settings_receiving_label": "Configurações de receber",
"gui_settings_downloads_label": "",
"gui_settings_downloads_button": "Navegar",
"gui_settings_receive_allow_receiver_shutdown_checkbox": "",
- "gui_settings_public_mode_checkbox": "",
+ "gui_settings_public_mode_checkbox": "Modo público",
"systray_close_server_title": "",
"systray_close_server_message": "",
- "systray_page_loaded_title": "",
+ "systray_page_loaded_title": "Página carregada",
"systray_download_page_loaded_message": "",
"systray_upload_page_loaded_message": "",
"gui_uploads": "",
@@ -179,7 +179,53 @@
"gui_upload_finished_range": "",
"gui_upload_finished": "",
"gui_download_in_progress": "",
- "gui_open_folder_error_nautilus": "",
- "gui_settings_language_label": "",
- "gui_settings_language_changed_notice": ""
+ "gui_open_folder_error_nautilus": "Não foi possível abrir a pasta porque o Nautilus não está disponível. O ficheiro está em: {}",
+ "gui_settings_language_label": "Idioma preferido",
+ "gui_settings_language_changed_notice": "Reiniciar o OnionShare para que a alteração do idioma surta efeito.",
+ "gui_add_files": "Adicionar ficheiros",
+ "gui_add_folder": "Adicionar pasta",
+ "gui_settings_onion_label": "Configurações onion",
+ "gui_connect_to_tor_for_onion_settings": "Conectar ao Tor para ver as configurações do serviço onion",
+ "error_cannot_create_data_dir": "Não foi possível criar a pasta de dados do OnionShare: {}",
+ "receive_mode_data_dir": "Os ficheiros enviados para si aparecem nesta pasta: {}",
+ "gui_settings_data_dir_label": "Guardar ficheiros em",
+ "gui_settings_data_dir_browse_button": "Navegar",
+ "systray_page_loaded_message": "O endereço do OnionShare foi carregado",
+ "systray_share_started_title": "Partilha iniciada",
+ "systray_share_started_message": "A começar a enviar ficheiros para alguém",
+ "systray_share_completed_title": "Partilha completa",
+ "systray_share_completed_message": "O envio dos ficheiros terminou",
+ "systray_share_canceled_title": "Partilha cancelada",
+ "systray_share_canceled_message": "Alguém cancelou a receção dos seus ficheiros",
+ "systray_receive_started_title": "Receção iniciada",
+ "systray_receive_started_message": "Alguém lhe está a enviar ficheiros",
+ "gui_all_modes_history": "Histórico",
+ "gui_all_modes_clear_history": "Limpar tudo",
+ "gui_all_modes_transfer_started": "Iniciado em {}",
+ "gui_all_modes_transfer_finished_range": "Transferido em {} - {}",
+ "gui_all_modes_transfer_finished": "Transferido em {}",
+ "gui_all_modes_transfer_canceled_range": "Cancelado em {} - {}",
+ "gui_all_modes_transfer_canceled": "Cancelado em {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} decorrido.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (a calcular)",
+ "gui_all_modes_progress_eta": "{0:s}, tempo restante estimado: {1:s}, %p%",
+ "gui_share_mode_no_files": "Ainda não foi enviado nenhum ficheiro",
+ "gui_share_mode_timeout_waiting": "A esperar que termine o envio",
+ "gui_receive_mode_no_files": "Ainda sem ficheiros recebidos",
+ "gui_receive_mode_timeout_waiting": "A esperar que termine a receção",
+ "gui_stop_server_autostop_timer_tooltip": "O cronómetro de paragem automática termina em {}",
+ "gui_start_server_autostart_timer_tooltip": "O cronómetro de início automático começa em {}",
+ "gui_waiting_to_start": "Agendado para iniciar em {}. Clique para cancelar.",
+ "gui_settings_autostart_timer_checkbox": "Usar cronómetro de início automático",
+ "gui_settings_autostart_timer": "Iniciar a partilha em:",
+ "gui_server_autostart_timer_expired": "O tempo agendado já passou. Por favor atualize para começar a partilhar.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "O tempo de paragem automática não pode ser o mesmo que o tempo de início automático. Por favor atualize-o para começar a partilhar.",
+ "gui_status_indicator_share_scheduled": "Agendado…",
+ "gui_status_indicator_receive_scheduled": "Agendado…",
+ "gui_share_mode_autostop_timer_waiting": "A esperar que termine de enviar",
+ "gui_receive_mode_autostop_timer_waiting": "A esperar que termine de receber",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/ro.json b/share/locale/ro.json
index 54750c24..36daf7dc 100644
--- a/share/locale/ro.json
+++ b/share/locale/ro.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"large_filesize": "",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -37,12 +37,12 @@
"gui_choose_items": "Alegeți",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "Salvare",
"gui_settings_button_cancel": "Anulare",
"gui_settings_button_help": "Ajutor",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/ru.json b/share/locale/ru.json
index de372fe6..12bc9ed1 100644
--- a/share/locale/ru.json
+++ b/share/locale/ru.json
@@ -36,7 +36,7 @@
"give_this_url_receive_stealth": "Передайте этот адрес и строку HidServAuth отправителю:",
"not_a_readable_file": "{0:s} не читаемый файл.",
"no_available_port": "Не удалось найти доступный порт для запуска \"лукового\" сервиса",
- "close_on_timeout": "Время ожидания таймера истекло, сервис остановлен",
+ "close_on_autostop_timer": "Время ожидания таймера истекло, сервис остановлен",
"closing_automatically": "Загрузка завершена, сервис остановлен",
"timeout_download_still_running": "Ожидаем завершения скачивания",
"timeout_upload_still_running": "Ожидаем завершения загрузки",
@@ -51,21 +51,21 @@
"systray_upload_started_message": "Пользователь начал загрузку файлов на Ваш компьютер",
"help_local_only": "Не использовать Tor (только для разработки)",
"help_stay_open": "Продолжить отправку после первого скачивания",
- "help_shutdown_timeout": "Остановить отправку после заданного количества секунд",
+ "help_autostop_timer": "Остановить отправку после заданного количества секунд",
"help_stealth": "Использовать авторизацию клиента (дополнительно)",
"help_receive": "Получать загрузки вместо их отправки",
- "help_debug": "Направлять сообщения об ошибках OnionShare в stdout, ошибки сети сохранять на диск",
+ "help_verbose": "Направлять сообщения об ошибках OnionShare в stdout, ошибки сети сохранять на диск",
"help_filename": "Список файлов или папок для отправки",
"help_config": "Расположение пользовательского конфигурационного JSON-файла (необязательно)",
"gui_drag_and_drop": "Перетащите сюда файлы и/или папки,\nкоторые хотите отправить.",
"gui_share_start_server": "Начать отправку",
"gui_share_stop_server": "Закончить отправку",
- "gui_share_stop_server_shutdown_timeout": "Остановить отправку (осталось {}с)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Время таймера истекает в {}",
+ "gui_share_stop_server_autostop_timer": "Остановить Отправку ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Время таймера истекает в {}",
"gui_receive_start_server": "Включить режим получения",
"gui_receive_stop_server": "Выключить режим получения",
- "gui_receive_stop_server_shutdown_timeout": "Выключить режим получения (осталось {}с)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Время таймера истекает в {}",
+ "gui_receive_stop_server_autostop_timer": "Выключить Режим Получения (осталось {})",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Время таймера истекает в {}",
"gui_copy_hidservauth": "Скопировать строку HidServAuth",
"gui_downloads": "История скачиваний",
"gui_no_downloads": "Скачиваний пока нет ",
@@ -113,8 +113,8 @@
"gui_settings_tor_bridges_custom_radio_option": "Использовать пользовательские \"мосты\"",
"gui_settings_tor_bridges_custom_label": "Получить настройки \"мостов\" можно здесь: <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
"gui_settings_tor_bridges_invalid": "Ни один из добавленных вами \"мостов\" не работает.\nПроверьте их снова или добавьте другие.",
- "gui_settings_shutdown_timeout_checkbox": "Использовать таймер",
- "gui_settings_shutdown_timeout": "Остановить загрузку в:",
+ "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 в {}:{}.",
@@ -138,8 +138,8 @@
"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_timeout": "Время таймера истекло до того, как сервер был запущен.\nПожалуйста, отправьте файлы заново.",
- "gui_server_timeout_expired": "Время таймера истекло.\nПожалуйста, обновите его для начала отправки.",
+ "gui_server_started_after_autostop_timer": "Время стоп-таймера истекло до того, как сервер был запущен. Пожалуйста, отправьте файлы заново.",
+ "gui_server_autostop_timer_expired": "Время стоп-таймера истекло. Пожалуйста, обновите его для начала отправки.",
"share_via_onionshare": "OnionShare это",
"gui_use_legacy_v2_onions_checkbox": "Используйте устаревшие адреса",
"gui_save_private_key_checkbox": "Используйте постоянный адрес",
@@ -210,7 +210,20 @@
"gui_all_modes_progress_starting": "{0:s}, %p% (вычисляем)",
"gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
"gui_share_mode_no_files": "Пока нет отправленных файлов",
- "gui_share_mode_timeout_waiting": "Ожидается завершение отправки",
+ "gui_share_mode_autostop_timer_waiting": "Ожидается завершение отправки",
"gui_receive_mode_no_files": "Пока нет полученных файлов",
- "gui_receive_mode_timeout_waiting": "Ожидается завершение загрузки"
+ "gui_receive_mode_autostop_timer_waiting": "Ожидается завершение загрузки",
+ "gui_stop_server_autostop_timer_tooltip": "Время окончания стоп-таймера: {}",
+ "gui_start_server_autostart_timer_tooltip": "Время окончания старт-таймера: {}",
+ "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_receive_scheduled": "По расписанию…",
+ "days_first_letter": "д",
+ "hours_first_letter": "ч",
+ "minutes_first_letter": "м",
+ "seconds_first_letter": "с"
}
diff --git a/share/locale/sl.json b/share/locale/sl.json
index 42892ef9..29680bbb 100644
--- a/share/locale/sl.json
+++ b/share/locale/sl.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"large_filesize": "",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -37,12 +37,12 @@
"gui_choose_items": "Izberi",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "Pomoč",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/sn.json b/share/locale/sn.json
index 11c255f6..4ee1a03b 100644
--- a/share/locale/sn.json
+++ b/share/locale/sn.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"timeout_upload_still_running": "",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -40,12 +40,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -107,8 +107,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -134,8 +134,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_connect_to_tor_for_onion_settings": "",
"gui_use_legacy_v2_onions_checkbox": "",
diff --git a/share/locale/sv.json b/share/locale/sv.json
index f1072332..34a718db 100644
--- a/share/locale/sv.json
+++ b/share/locale/sv.json
@@ -8,9 +8,9 @@
"ctrlc_to_stop": "Tryck ned Ctrl+C för att stoppa servern",
"not_a_file": "{0:s} är inte en giltig fil.",
"not_a_readable_file": "{0:s} är inte en läsbar fil.",
- "no_available_port": "Kunde inte hitta en ledig kort för att börja onion-tjänsten",
+ "no_available_port": "Kunde inte hitta en ledig kort för att starta onion-tjänsten",
"other_page_loaded": "Adress laddad",
- "close_on_timeout": "Stoppad för att automatiska stopp-timern tiden tog slut",
+ "close_on_autostop_timer": "Stoppad för att tiden för den automatiska stopp-tidtagaren löpte ut",
"closing_automatically": "Stoppad för att hämtningen är klar",
"timeout_download_still_running": "Väntar på att nedladdningen ska bli klar",
"timeout_upload_still_running": "Väntar på att uppladdningen ska bli klar",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "En användare började ladda upp filer på din dator",
"help_local_only": "Använd inte Tor (endast för utveckling)",
"help_stay_open": "Fortsätt dela efter att filer har skickats",
- "help_shutdown_timeout": "Avbryt delning efter ett bestämt antal sekunder",
+ "help_autostop_timer": "Sluta dela efter ett bestämt antal sekunder",
"help_stealth": "Använd klient-auktorisering (avancerat)",
"help_receive": "Ta emot delningar istället för att skicka dem",
- "help_debug": "Logga OnionShare fel till stdout och webbfel till hårddisken",
+ "help_verbose": "Logga OnionShare fel till stdout och webbfel till hårddisken",
"help_filename": "Lista filer och mappar att dela",
"help_config": "Egenvald sökväg för JSON konfigurationsfil (valfri)",
"gui_drag_and_drop": "Dra och släpp filer och mappar\nför att börja delning",
@@ -38,12 +38,12 @@
"gui_choose_items": "Välj",
"gui_share_start_server": "Börja dela",
"gui_share_stop_server": "Avbryt delning",
- "gui_share_stop_server_shutdown_timeout": "Avbryt Delning ({}s kvarstår)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "Automatiska stopp-timern avslutar vid {}",
- "gui_receive_start_server": "Börja mottagarläge",
+ "gui_share_stop_server_autostop_timer": "Sluta dela ({})",
+ "gui_share_stop_server_autostop_timer_tooltip": "Automatiska stopp-tidtagaren avslutar vid {}",
+ "gui_receive_start_server": "Starta mottagarläge",
"gui_receive_stop_server": "Avsluta Mottagarläge",
- "gui_receive_stop_server_shutdown_timeout": "Avsluta Mottagarläge ({}s kvarstår)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "Auto-stop timer avslutas kl {}",
+ "gui_receive_stop_server_autostop_timer": "Avsluta Mottagarläge ({} kvarstår)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Automatiska stopp-tidtagaren avslutar vid {}",
"gui_copy_url": "Kopiera Adress",
"gui_copy_hidservauth": "Kopiera HidServAuth",
"gui_downloads": "Nedladdningshistorik",
@@ -70,7 +70,7 @@
"gui_settings_window_title": "Inställningar",
"gui_settings_whats_this": "<a href='{0:s}'>Vad är det här?</a>",
"gui_settings_stealth_option": "Använd klientauktorisering",
- "gui_settings_stealth_hidservauth_string": "Efter att ha sparat din privata nyckel för återanvändning, innebär att du kan nu\nklicka för att kopiera din HidServAuth.",
+ "gui_settings_stealth_hidservauth_string": "Efter att ha sparat din privata nyckel för återanvändning, innebär det att du nu kan klicka för att kopiera din HidServAuth.",
"gui_settings_autoupdate_label": "Sök efter ny version",
"gui_settings_autoupdate_option": "Meddela mig när en ny version är tillgänglig",
"gui_settings_autoupdate_timestamp": "Senast kontrollerad: {}",
@@ -105,8 +105,8 @@
"gui_settings_button_save": "Spara",
"gui_settings_button_cancel": "Avbryt",
"gui_settings_button_help": "Hjälp",
- "gui_settings_shutdown_timeout_checkbox": "Använd automatiska stopp-timern",
- "gui_settings_shutdown_timeout": "Stoppa delningen vid:",
+ "gui_settings_autostop_timer_checkbox": "Använd den automatiska stopp-tidtagaren",
+ "gui_settings_autostop_timer": "Stoppa delningen vid:",
"settings_error_unknown": "Kan inte ansluta till Tor-regulatorn eftersom dina inställningar inte är vettiga.",
"settings_error_automatic": "Kunde inte ansluta till Tor-regulatorn. Körs Tor Browser (tillgänglig från torproject.org) i bakgrunden?",
"settings_error_socket_port": "Det går inte att ansluta till Tor-regulatorn på {}:{}.",
@@ -117,7 +117,7 @@
"settings_error_bundled_tor_not_supported": "Användning av Tor-versionen som följer med OnionShare fungerar inte i utvecklarläge på Windows eller macOS.",
"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 i bakgrunden:\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: {}.",
+ "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_unknown": "Det fanns ett okänt fel med Tor",
"error_invalid_private_key": "Denna privata nyckeltyp stöds inte",
@@ -132,9 +132,9 @@
"gui_tor_connection_error_settings": "Försök ändra hur OnionShare ansluter till Tor-nätverket i inställningarna.",
"gui_tor_connection_canceled": "Kunde inte ansluta till Tor.\n\nSe till att du är ansluten till Internet, öppna sedan OnionShare och ställ in anslutningen till Tor.",
"gui_tor_connection_lost": "Frånkopplad från Tor.",
- "gui_server_started_after_timeout": "Automatiska stopp-timern tog slut innan servern startade.\nVänligen gör en ny delning.",
- "gui_server_timeout_expired": "Automatiska stopp-timern har redan slutat.\nUppdatera den för att börja dela.",
- "share_via_onionshare": "OnionShare den",
+ "gui_server_started_after_autostop_timer": "Tiden för den automatiska stopp-timern löpte ut innan servern startade.\nVänligen gör en ny delning.",
+ "gui_server_autostop_timer_expired": "Tiden för den automatiska stopp-tidtagaren löpte redan ut.\nUppdatera den för att börja dela.",
+ "share_via_onionshare": "Dela den med OnionShare",
"gui_use_legacy_v2_onions_checkbox": "Använd äldre adresser",
"gui_save_private_key_checkbox": "Använd en beständig adress",
"gui_share_url_description": "<b>Alla</b> med denna OnionShare-adress kan <b>hämta</b> dina filer med hjälp av <b>Tor Browser</b>: <img src='{}' />",
@@ -207,9 +207,23 @@
"gui_all_modes_progress_starting": "{0} %s% (beräkning)",
"gui_all_modes_progress_eta": "{0:s}, ETA: {1:s}, %p%",
"gui_share_mode_no_files": "Inga filer har skickats än",
- "gui_share_mode_timeout_waiting": "Väntar på att avsluta sändningen",
+ "gui_share_mode_autostop_timer_waiting": "Väntar på att avsluta sändningen",
"gui_receive_mode_no_files": "Inga filer har mottagits ännu",
- "gui_receive_mode_timeout_waiting": "Väntar på att avsluta mottagande",
+ "gui_receive_mode_autostop_timer_waiting": "Väntar på att avsluta mottagande",
"gui_all_modes_transfer_canceled_range": "Avbröt {} - {}",
- "gui_all_modes_transfer_canceled": "Avbröt {}"
+ "gui_all_modes_transfer_canceled": "Avbröt {}",
+ "gui_settings_onion_label": "Inställningar för Onion",
+ "gui_stop_server_autostop_timer_tooltip": "Auto-stop timern slutar vid {}",
+ "gui_start_server_autostart_timer_tooltip": "Auto-start timer slutar vid {}",
+ "gui_waiting_to_start": "Planerad för att starta i {}. Klicka för att avbryta.",
+ "gui_settings_autostart_timer_checkbox": "Använd auto-start timer",
+ "gui_settings_autostart_timer": "Börja dela vid:",
+ "gui_server_autostart_timer_expired": "Den schemalagda tiden har redan passerat. Uppdatera den för att starta delning.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Auto-stop tiden kan inte vara samma eller tidigare än auto-starttiden. Uppdatera den för att starta delning.",
+ "gui_status_indicator_share_scheduled": "Planerad…",
+ "gui_status_indicator_receive_scheduled": "Planerad…",
+ "days_first_letter": "d",
+ "hours_first_letter": "t",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
}
diff --git a/share/locale/te.json b/share/locale/te.json
new file mode 100644
index 00000000..751a0d62
--- /dev/null
+++ b/share/locale/te.json
@@ -0,0 +1,175 @@
+{
+ "preparing_files": "దస్త్రాలు కుదించబడుతున్నాయి.",
+ "not_a_readable_file": "{0:s} చదువగలిగిన దస్త్రం కాదు.",
+ "no_available_port": "Onion సేవను మొదలుపెట్టుటకై ఒక అనువైన పోర్టు కనబడలేదు",
+ "other_page_loaded": "జాల చిరునామా లోడు చేయబడినది",
+ "close_on_autostop_timer": "స్వయంచాలితంగా ఆగు సమయ సూచీ సమయాతీతమయిపోయినది కనుక ఆపివేయబడినది",
+ "closing_automatically": "బదిలీ పూర్తి అయినందున ఆపబడినది",
+ "large_filesize": "హెచ్చరిక: ఒక పెద్ద అంశాన్ని పంపించడానికి కొన్ని గంటలు పట్టవచ్చు",
+ "gui_drag_and_drop": "దస్త్రాలను, సంచయాలను లాగి వదలండి\nవాటిని పంచుకోవడం మొదలుపెట్టుటకు",
+ "gui_add": "చేర్చు",
+ "gui_add_files": "దస్త్రాలను చేర్చు",
+ "gui_add_folder": "సంచయాన్ని చేర్చు",
+ "gui_delete": "తొలగించు",
+ "gui_choose_items": "ఎంచుకో",
+ "gui_share_start_server": "పంచుకోవడం మొదలుపెట్టు",
+ "gui_share_stop_server": "పంచుకోవడం ఆపివేయి",
+ "gui_share_stop_server_autostop_timer": "పంచుకోవడం ఆపివేయి ({})",
+ "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": "స్వీకరించు రీతిని ఆపివేయి ({}s మిగిలినది)",
+ "gui_copy_url": "జాల చిరునామాను నకలు తీయి",
+ "gui_copy_hidservauth": "HidServAuth నకలు తీయి",
+ "gui_canceled": "రద్దు చేయబడినది",
+ "gui_copied_url_title": "OnionShare జాల చిరునామా నకలు తీయబడినది",
+ "gui_copied_url": "OnionShare జాల చిరునామా క్లిప్‌బోర్డునకు నకలు తీయబడినది",
+ "gui_copied_hidservauth_title": "HidServAuth నకలు తీయబడినది",
+ "gui_copied_hidservauth": "HidServAuth పంక్తి క్లిప్‌బోర్డునకు నకలు తీయబడినది",
+ "gui_waiting_to_start": "ఇంకా {}లో మొదలగునట్లు అమర్చబడినది. రద్దుచేయుటకై ఇక్కడ నొక్కు.",
+ "gui_please_wait": "మొదలుపెట్టబడుతుంది... రద్దు చేయుటకై ఇక్కడ నొక్కు.",
+ "gui_quit_title": "అంత త్వరగా కాదు",
+ "gui_share_quit_warning": "మీరు దస్త్రాలను పంపించే క్రమంలో ఉన్నారు. మీరు నిశ్చయంగా ఇప్పుడు OnionShareని విడిచి వెళ్ళాలనుకుంటున్నారా?",
+ "gui_receive_quit_warning": "మీరు దస్త్రాలను స్వీకరించే క్రమంలో ఉన్నారు. మీరు నిశ్చయంగా ఇప్పుడు OnionShareని విడిచి వెళ్ళాలనుకుంటున్నారా?",
+ "gui_quit_warning_quit": "నిష్క్రమించు",
+ "gui_quit_warning_dont_quit": "రద్దుచేయి",
+ "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 మరియు python-3-stem 1.4.0, ఈ రెండూ ఉండాలి.",
+ "gui_settings_window_title": "అమరికలు",
+ "gui_settings_whats_this": "<a href='{0:s}'>ఇది ఏమిటి?</a>",
+ "gui_settings_stealth_option": "ఉపయోక్త ధ్రువీకరణను వాడు",
+ "gui_settings_stealth_hidservauth_string": "మరల వాడుటకై మీ ప్రైవేటు కీని భద్రపరచడం వలన మీరు ఇక్కడ నొక్కడం ద్వారా మీ HidServAuth నకలు తీయవచ్చు.",
+ "gui_settings_autoupdate_label": "కొత్త రూపాంతరం కోసం సరిచూడు",
+ "gui_settings_autoupdate_option": "కొత్త రూపాంతరం వస్తే నాకు తెలియచేయి",
+ "gui_settings_autoupdate_timestamp": "ఇంతకుముందు సరిచూసినది: {}",
+ "gui_settings_autoupdate_timestamp_never": "మునుపెన్నడూ లేదు",
+ "gui_settings_autoupdate_check_button": "కొత్త రూపాంతరం కొరకు సరిచూడు",
+ "gui_settings_general_label": "సాధారణ అమరికలు",
+ "gui_settings_onion_label": "Onion అమరికలు",
+ "gui_settings_sharing_label": "పంపక అమరికలు",
+ "gui_settings_close_after_first_download_option": "దస్త్రాలను పంపిన తరువాత పంచడం ఆపివేయి",
+ "gui_settings_connection_type_label": "OnionShareను Torతో ఎలా అనుసంధానించాలి?",
+ "gui_settings_connection_type_bundled_option": "OnionShareలో కూర్చిన Tor రూపాంతరాన్ని ఉపయోగించు",
+ "gui_settings_connection_type_automatic_option": "Tor విహారిణిని వాడి స్వయంచాలక ఆకృతీకరణకు ప్రయత్నించు",
+ "gui_settings_connection_type_control_port_option": "నియంత్రణ పోర్టును వాడి అనుసంధానం చేయి",
+ "gui_settings_connection_type_socket_file_option": "సాకెట్ దస్త్రాన్ని వాడి అనుసంధానం చేయి",
+ "gui_settings_connection_type_test_button": "Torకు అనుసంధానతను పరీక్షించు",
+ "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": "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": "హెచ్చరిక: tor వ్యవస్థను meek_lite బ్రిడ్జిల ద్వారా నడపడం చాలా ఖర్చుతో కూడిన పని.<br><br>మీరు obfs4 మాధ్యమాల ద్వారా లేదా వేరే మామూలు బ్రిడ్జిల ద్వారా torకు సూటిగా అనుసంధానించలేని పక్షంలోనే వాటిని వాడండి.",
+ "gui_settings_tor_bridges_custom_radio_option": "అనుకూలీకరించిన బ్రిడ్జిలను వాడు",
+ "gui_settings_tor_bridges_custom_label": "మీరు బ్రిడ్జిలను <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a> నుండి పొందవచ్చు",
+ "gui_settings_tor_bridges_invalid": "మీరు చేర్చిన ఏ బ్రిడ్జీ కూడా పనిచేయుటలేదు.\nమరల సరిచూచుకోండి లేదా వేరేవాటిని చేర్చండి.",
+ "gui_settings_button_save": "భద్రపరచు",
+ "gui_settings_button_cancel": "రద్దుచేయి",
+ "gui_settings_button_help": "సహాయం",
+ "gui_settings_autostop_timer_checkbox": "స్వయంచాలితంగా ఆగు సమయ సూచీని వాడు",
+ "gui_settings_autostop_timer": "ఇక్కడ పంచినది ఆపు:",
+ "gui_settings_autostart_timer_checkbox": "స్వయంచాలితంగా మొదలయ్యే సమయ సూచీని వాడు",
+ "gui_settings_autostart_timer": "ఇక్కడ పంచినది మొదలుపెట్టు:",
+ "settings_error_unknown": "మీ అమరికలు సరైనవిగా లేవు కనుక టార్ నియంత్రితకు అనుసంధానింపబడలేదు.",
+ "settings_error_automatic": "Tor నియంత్రణకర్తకు అనుసంధానం కాలేకపోతుంది. Tor విహారిణి (torproject.org నుండి లభ్యం) వెనుతలంలో పనిచేస్తుందా?",
+ "settings_error_socket_port": "{}:{} వద్ద టార్ నియంత్రితకు అనుసంధానింపబడలేదు.",
+ "settings_error_socket_file": "సాకెట్ దస్త్రం {} ద్వారా టార్ నియంత్రితకు అనుసంధానింపబడలేదు.",
+ "settings_error_auth": "{}:{} వద్ద అనుసంధానించబడినది, కానీ ధ్రువపరచబడలేదు. ఇది టార్ నియంత్రిత కాదేమో?",
+ "settings_error_missing_password": "Tor నియంత్రితకు అనుసంధానించబడినది, కానీ ధ్రువపరచడానికి ఒక సంకేతపుమాట అవసరం.",
+ "settings_error_unreadable_cookie_file": "Tor నియంత్రితకు అనుసంధానించబడినది, కానీ సంకేతపుమాట సరైనది కాకపోవచ్చు, లేదా మీ వాడుకరికి కుకీ దస్త్రాన్ని చదవడానికి అనుమతి లేకపోవచ్చు.",
+ "settings_error_bundled_tor_not_supported": "OnionShareతో పాటు వచ్చిన Tor రూపాంతరం విండోస్ లేదా మాక్ఓఎస్‌లో అభివృద్ధి రీతిలో పనిచేయదు.",
+ "settings_error_bundled_tor_timeout": "Torకు అనుసంధానించబడుటకు ఎక్కువ సమయం తీసుకుంటుంది. మీరు జాలకు అనుసంధానించబడలేదేమో, లేదా మీ గణనయంత్ర సమయం సరైనది కాదేమో?",
+ "settings_error_bundled_tor_broken": "OnionShare వెనుతలంలో Torతో అనుసంధానం అవట్లేదు: \n{}",
+ "settings_test_success": "Tor నియంత్రణికి అనుసంధానమయింది.\n\nTor రూపాంతరం: {}\nఅల్పాయుష్క onion సేవలకు మద్దతు ఉంది: {}.\nఉపయోక్త ధ్రువీకరణకు మద్దతు ఉంది: {}.\nసరికొత్త .onion చిరునామాలకు మద్దతు ఉంది: {}.",
+ "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": "కొత్త రూపాంతరాల కోసం సరిచూడలేకపోతుంది: OnionShare జాలగూడు ఇలా చెప్తుంది - సరికొత్త రూపాంతరం ఆనవాలు పట్టబడనిది '{}'…",
+ "update_error_invalid_latest_version": "కొత్త రూపాంతరం కోసం సరిచూడలేకపోతుంది: బహుశా మీరు Torకు అనుసంధానమై లేరా, లేదా 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_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": "OnionShare చేయి",
+ "gui_connect_to_tor_for_onion_settings": "Onion సేవా అమరికలను చూచుటకు Torతో అనుసంధానించు",
+ "gui_use_legacy_v2_onions_checkbox": "పాత చిరునామాలు వాడు",
+ "gui_save_private_key_checkbox": "ఒక నిరంతర చిరునామాను వాడు",
+ "gui_share_url_description": "ఈOnionShare చిరునామా గల <b>ఎవరైనా</b> మీ దస్త్రాలను <b>Tor విహారిణి</b>తో <b>దింపుకోవచ్చు</b>: <img src='{}' />",
+ "gui_receive_url_description": "ఈOnionShare చిరునామా గల <b>ఎవరైనా</b> మీ దస్త్రాలను <b>Tor విహారిణి</b>తో <b>ఎక్కించుకోవచ్చు</b>:<img src='{}' />",
+ "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_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": "{} అయిపోయింది",
+ "error_cannot_create_data_dir": "OnionShare దత్త సంచయం: {}ని సృష్టించడం జరగలేదు",
+ "gui_receive_mode_warning": "స్వీకరించు రీతి వ్యక్తులు మీ కంప్యూటరుకు దస్త్రాలను ఎక్కించడానికి అనుమతినిస్తుంది.<br><br><b>కొన్ని దస్త్రాలను మీరు తెరిస్తే అవి అవశ్యం మీ కంప్యూటరును నియంత్రించగలవు. కనుక మీరు విశ్వసించే వ్యక్తులనుండి వచ్చిన వాటినే తెరవండి, లేదా మీరేం చేస్తున్నారో మీకు అవగాహన ఉంటేనే తెరవండి.</b>",
+ "gui_mode_share_button": "దస్త్రాలను పంచుకో",
+ "gui_mode_receive_button": "దస్త్రాలను స్వీకరించు",
+ "gui_settings_receiving_label": "స్వీకరణ అమరికలు",
+ "gui_settings_data_dir_label": "దస్త్రాలను ఇక్కడ భద్రపరచు",
+ "gui_settings_data_dir_browse_button": "విహరణ",
+ "gui_settings_public_mode_checkbox": "బహిరంగ రీతి",
+ "gui_open_folder_error_nautilus": "nautilus అందుబాటులో లేనందున సంచయం తెరువబడలేదు. దస్త్రం ఇక్కడుంది: {}",
+ "gui_settings_language_label": "ఎంచుకున్న భాష",
+ "gui_settings_language_changed_notice": "మీరు మార్చిన భాష అమలులోకి రావడానికి OnionShareని పునఃప్రారంభించండి.",
+ "systray_menu_exit": "నిష్క్రమించు",
+ "systray_page_loaded_title": "పుట లోడు చేయబడినది",
+ "systray_page_loaded_message": "OnionShare జాల చిరునామా లోడు చేయబడినది",
+ "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_transfer_finished_range": "పంపబడినది {} - {}",
+ "gui_all_modes_transfer_finished": "పంపబడినది {}",
+ "gui_all_modes_transfer_canceled_range": "రద్దు చేయబడినది {} - {}",
+ "gui_all_modes_transfer_canceled": "రద్దు చేయబడినది {}",
+ "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_autostop_timer_waiting": "పంపుట పూర్తి అగుటకు వేచిచూడడం జరుగుతున్నది",
+ "gui_receive_mode_no_files": "ఇంకా ఏ దస్త్రాలు స్వీకరించబడలేదు",
+ "gui_receive_mode_autostop_timer_waiting": "స్వీకరణ పూర్తి అగుటకు వేచిచూడడం జరుగుతున్నది",
+ "receive_mode_upload_starting": "పూర్తి పరిమాణం {} గల ఎక్కింపు మొదలవుతుంది",
+ "days_first_letter": "d",
+ "hours_first_letter": "h",
+ "minutes_first_letter": "m",
+ "seconds_first_letter": "s"
+}
diff --git a/share/locale/tr.json b/share/locale/tr.json
index a5f5b429..33e6ec9c 100644
--- a/share/locale/tr.json
+++ b/share/locale/tr.json
@@ -1,30 +1,200 @@
{
"preparing_files": "Sıkıştırma dosyaları.",
"give_this_url": "Bu adresi alıcıya verin:",
- "ctrlc_to_stop": "Sunucuyu durdurmak için, Ctrl-C basın",
+ "ctrlc_to_stop": "Sunucuyu durdurmak için, Ctrl+C'ye basın",
"not_a_file": "{0:s} dosya değil.",
- "other_page_loaded": "Diğer sayfa yüklendi",
- "closing_automatically": "İndirme işlemi tamamlandığı için kendiliğinden durduruluyor",
- "large_filesize": "Uyarı: Büyük dosyaların gönderimi saatler sürebilir",
- "help_local_only": "Tor kullanmaya kalkışmayın: sadece geliştirme için",
- "help_stay_open": "İndirme tamamlandıktan sonra gizli hizmeti çalıştırmaya devam et",
- "help_debug": "Hata kayıtlarını diske kaydet",
+ "other_page_loaded": "Adres yüklendi",
+ "closing_automatically": "Aktarım tamamlandığından durduruldu",
+ "large_filesize": "Büyük bir paylaşımın gönderilmesi 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": "Dosyaları buraya\n Sürükle ve Bırak",
"gui_add": "Ekle",
"gui_delete": "Sil",
"gui_choose_items": "Seç",
- "gui_share_start_server": "Paylaşımı Başlat",
- "gui_share_stop_server": "Paylaşımı Durdur",
+ "gui_share_start_server": "Paylaşımı başlat",
+ "gui_share_stop_server": "Paylaşımı durdur",
"gui_copy_url": "URL Kopyala",
"gui_downloads": "İndirilenler:",
"gui_canceled": "İptal edilen",
- "gui_copied_url": "Panoya kopyalanan URL",
- "gui_please_wait": "Lütfen bekleyin...",
- "zip_progress_bar_format": "Dosyalar hazırlanıyor: %p%",
+ "gui_copied_url": "OnionShare adresi panoya kopyalandı",
+ "gui_please_wait": "Başlatılıyor... İptal etmek için tıklayın.",
+ "zip_progress_bar_format": "Sıkıştırılıyor: %p%",
"config_onion_service": "{0:d} bağlantı noktasında onion servisini ayarla.",
"give_this_url_receive": "Bu adresi gönderene ver:",
"not_a_readable_file": "{0:s} okunabilir bir dosya değil.",
- "no_available_port": "Onion servisini başlatmak için uygun bir port bulunamadı",
- "close_on_timeout": "Otomatik durma zamanlayıcısının bitmesi nedeniyle durdu"
+ "no_available_port": "Onion hizmetini başlatmak için uygun bir port bulunamadı",
+ "close_on_autostop_timer": "Otomatik durma zamanlayıcısının bitmesi nedeniyle durdu",
+ "give_this_url_stealth": "Bu adresi ve HidServAuth hattını alıcıya verin:",
+ "give_this_url_receive_stealth": "Bu adresi ve HidServAuth'u gönderene verin:",
+ "help_autostop_timer": "Belirli bir saniye sonra paylaşmayı durdur",
+ "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": "Dizin Ekle",
+ "gui_share_stop_server_autostop_timer": "Paylaşımı Durdur ({} kaldı)",
+ "gui_share_stop_server_autostop_timer_tooltip": "Otomatik durdurma zamanlayıcısı {} sonra biter",
+ "gui_receive_start_server": "Alma Kipini Başlat",
+ "gui_receive_stop_server": "Alma Kipini Durdur",
+ "gui_receive_stop_server_autostop_timer": "Alma Modunu Durdur ({} kaldı)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "Otomatik durdurma zamanlayıcısı {} sonra biter",
+ "gui_copy_hidservauth": "HidServAuth kopyala",
+ "gui_copied_url_title": "OnionShare Adresi Kopyalandı",
+ "gui_copied_hidservauth_title": "HidServAuth Kopyalandı",
+ "gui_copied_hidservauth": "HidServAuth satırı panoya kopyalandı",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "Çok hızlı değil",
+ "gui_share_quit_warning": "Dosya gönderme sürecindesiniz. OnionShare'dan çıkmak istediğinize emin misiniz?",
+ "gui_receive_quit_warning": "Dosya alma işlemindesiniz. OnionShare'dan çıkmak istediğinize emin misiniz?",
+ "gui_quit_warning_quit": "Çık",
+ "gui_quit_warning_dont_quit": "İptal",
+ "error_rate_limit": "Birisi adresinize çok fazla yanlış girişimde bulundu, bu da tahmin etmeye çalışabilecekleri anlamına geliyor, OnionShare sunucuyu durdurdu. Tekrar paylaşmaya başlayın ve alıcıya paylaşması için yeni bir adres gönderin.",
+ "error_stealth_not_supported": "İstemci yetkilendirmesini kullanmak için, en azından hem Tor 0.2.9.1-alpha (veya Tor Browser 6.5) hem de python3-stem 1.5.0'a ihtiyacınız vardır.",
+ "error_ephemeral_not_supported": "OnionShare, en az hem Tor 0.2.7.1 hem de python3-stem 1.4.0 gerektirir.",
+ "gui_settings_window_title": "Ayarlar",
+ "gui_settings_whats_this": "<a href='{0:s}'>Bu nedir?</a>",
+ "gui_settings_stealth_option": "İstemci yetkilendirmesini kullan",
+ "gui_settings_stealth_hidservauth_string": "Özel anahtarınızı tekrar kullanmak üzere sakladığınızdan, şimdi HidServAuth'ınızı kopyalamak için tıklayabileceğiniz anlamına gelir.",
+ "gui_settings_autoupdate_label": "Yeni sürümü denetle",
+ "gui_settings_autoupdate_option": "Yeni bir sürüm olduğunda bana bildir",
+ "gui_settings_autoupdate_timestamp": "Son denetleme: {}",
+ "gui_settings_autoupdate_timestamp_never": "Hiçbir zaman",
+ "gui_settings_autoupdate_check_button": "Yeni Sürümü Denetle",
+ "gui_settings_general_label": "Genel ayarlar",
+ "gui_settings_onion_label": "Onion ayarları",
+ "gui_settings_sharing_label": "Paylaşım ayarları",
+ "gui_settings_close_after_first_download_option": "Dosyalar gönderildikten sonra paylaşımı durdur",
+ "gui_settings_connection_type_label": "OnionShare, Tor'a nasıl bağlanmalı?",
+ "gui_settings_connection_type_bundled_option": "OnionShare'da yerleşik olan Tor sürümünü kullanın",
+ "gui_settings_connection_type_automatic_option": "Tor Browser ile otomatik yapılandırma girişimi",
+ "gui_settings_connection_type_control_port_option": "Denetleme bağlantı noktasını kullanarak bağlan",
+ "gui_settings_connection_type_socket_file_option": "Socket dosyasını kullanarak bağlan",
+ "gui_settings_connection_type_test_button": "Tor'a Bağlanmayı Dene",
+ "gui_settings_control_port_label": "Denetleme bağlantı noktası",
+ "gui_settings_socket_file_label": "Socket dosyası",
+ "gui_settings_socks_label": "SOCKS bağlantı noktası",
+ "gui_settings_authenticate_label": "Tor kimlik doğrulama ayarları",
+ "gui_settings_authenticate_no_auth_option": "Kimlik doğrulama veya çerez kimlik doğrulaması yok",
+ "gui_settings_authenticate_password_option": "Şifre",
+ "gui_settings_password_label": "Şifre",
+ "gui_settings_tor_bridges": "Tor köprü desteği",
+ "gui_settings_tor_bridges_no_bridges_radio_option": "Köprü kullanmayın",
+ "gui_settings_tor_bridges_obfs4_radio_option": "Yerleşik obfs4 takılabilir taşıma araçlarını kullanın",
+ "gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy": "Yerleşik obfs4 takılabilir aktarımları kullanın (obfs4proxy gerektirir)",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option": "Yerleşik meek_lite (Azure) takılabilir aktarımları kullanın",
+ "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy": "Yerleşik meek_lite (Azure) takılabilir aktarımları kullanın (obfs4proxy gerektirir)",
+ "gui_settings_meek_lite_expensive_warning": "Uyarı: meek_lit köprüleri Tor Projesinin çalışması için çok maliyetlidir.<br><br>Bunları yalnızca Tor'a doğrudan, obfs4 aktarımları veya diğer normal köprüler üzerinden bağlanamıyorsanız kullanın.",
+ "gui_settings_tor_bridges_custom_radio_option": "Özel köprüler kullanın",
+ "gui_settings_tor_bridges_custom_label": "Köprüleri <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a> adresinden alabilirsiniz",
+ "gui_settings_tor_bridges_invalid": "Eklediğiniz köprülerin hiçbiri çalışmıyor.\nOnları iki kez denetleyin veya başkalarını ekleyin.",
+ "gui_settings_button_save": "Kaydet",
+ "gui_settings_button_cancel": "İptal",
+ "gui_settings_button_help": "Yardım",
+ "gui_settings_autostop_timer_checkbox": "Otomatik durdurma zamanlayıcısını kullan",
+ "gui_settings_autostop_timer": "Paylaşımı durdur:",
+ "settings_error_unknown": "Tor denetleyicisine bağlanılamıyor çünkü ayarlarınız mantıklı değil.",
+ "settings_error_automatic": "Tor denetleyicisine bağlanılamadı. Tor Browser (torproject.org adresinden temin edilebilir) arka planda mı çalışıyor?",
+ "settings_error_socket_port": "Tor denetleticisine {}:{} adresinden bağlanılamıyor.",
+ "settings_error_socket_file": "Tor denetleyicisine {} socket dosyası kullanılarak bağlanılamıyor.",
+ "settings_error_auth": "{}:{} İle bağlandı, ancak kimlik doğrulaması yapamıyor. Belki bu bir Tor denetleyicisi değildir?",
+ "settings_error_missing_password": "Tor denetleyicisine bağlı, ancak kimlik doğrulaması için bir şifre gerekiyor.",
+ "settings_error_unreadable_cookie_file": "Tor denetleyicisine bağlı, ancak parola yanlış olabilir veya kullanıcının çerez dosyasını okumasına izin verilmez.",
+ "settings_error_bundled_tor_not_supported": "OnionShare ile birlikte verilen Tor sürümünü kullanmak, Windows veya macOS'ta geliştirici kipinde çalışmaz.",
+ "settings_error_bundled_tor_timeout": "Tor'a bağlanmak çok uzun sürüyor. Belki İnternete bağlı değilsiniz veya yanlış bir sistem saatiniz var?",
+ "settings_error_bundled_tor_broken": "OnionShare, arka planda Tor'a bağlanamadı:\n{}",
+ "settings_test_success": "Tor denetleyicisine bağlı.\n\nTor sürümü: {}\nGeçici onion hizmetlerini destekler: {}.\nİstemci kimlik doğrulamasını destekler: {}.\nYeni nesil .onion adreslerini destekler: {}.",
+ "error_tor_protocol_error": "Tor ile bir hata oluştu: {}",
+ "error_tor_protocol_error_unknown": "Tor ile ilgili bilinmeyen bir hata oluştu",
+ "error_invalid_private_key": "Bu özel anahtar türü desteklenmiyor",
+ "connecting_to_tor": "Tor ağına bağlanılıyor",
+ "update_available": "Yeni OnionShare çıktı. Onu almak için <a href='{}'>buraya tıklayın</a>.<br><br>{} kullanıyorsunuz ve sonuncusu {}.",
+ "update_error_check_error": "Yeni sürümler denetlenemedi: OnionShare web sitesi en son sürümün tanınmayan '{}' olduğunu söylüyor…",
+ "update_error_invalid_latest_version": "Yeni sürüm denetlenemedi: Belki de Tor ile bağlantınız yok ya da OnionShare web sitesi kapalı?",
+ "update_not_available": "En son OnionShare ürününü kullanıyorsunuz.",
+ "gui_tor_connection_ask": "Tor ile bağlantıyı çözmek için ayarlar açılsın mı?",
+ "gui_tor_connection_ask_open_settings": "Evet",
+ "gui_tor_connection_ask_quit": "Çık",
+ "gui_tor_connection_error_settings": "OnionShare'in ayarlarından Tor ağına bağlanma şeklini değiştirmeyi deneyin.",
+ "gui_tor_connection_canceled": "Tor'a bağlanılamadı.\n\nİnternete bağlı olduğunuzdan emin olduktan sonra OnionShare'ı tekrar açın ve Tor ile bağlantısını kurun.",
+ "gui_tor_connection_lost": "Tor bağlantısı kesildi.",
+ "gui_server_started_after_autostop_timer": "Otomatik durdurma zamanlayıcısı, sunucu başlamadan önce bitti.\nLütfen yeni bir paylaşım yapın.",
+ "gui_server_autostop_timer_expired": "Otomatik durma zamanlayıcısı zaten tükendi.\nPaylaşmaya başlamak için lütfen güncelleyin.",
+ "share_via_onionshare": "OnionShare ile paylaş",
+ "gui_connect_to_tor_for_onion_settings": "Onion hizmet ayarlarını görmek için Tor'a bağlanın",
+ "gui_use_legacy_v2_onions_checkbox": "Eski adresleri kullan",
+ "gui_save_private_key_checkbox": "Kalıcı bir adres kullanın",
+ "gui_share_url_description": "Bu OnionShare adresine sahip olan <b>herkes</b> <b>Tor Tarayıcıyı</b> kullanarak dosyalarınızı <b>indirebilir</b>: <img src='{}' />",
+ "gui_receive_url_description": "Bu OnionShare adresine sahip olan <b>herkes</b> <b>Tor Tarayıcıyı</b> kullanarak dosyaları <b>yükleyebilir</b>: <img src='{}' />",
+ "gui_url_label_persistent": "Bu paylaşım otomatik olarak durmayacak.<br><br>Sonraki her paylaşım adresi yeniden kullanır. (Bir kerelik adresleri kullanmak için, ayarlardan \"Sürekli adres kullan\" seçeneğini kapatın.)",
+ "gui_url_label_stay_open": "Bu paylaşım otomatik olarak durmayacak.",
+ "gui_url_label_onetime": "Bu paylaşım ilki tamamlandıktan sonra durur.",
+ "gui_url_label_onetime_and_persistent": "Bu paylaşım otomatik olarak durmayacak.<br><br>Sonraki her paylaşım adresi yeniden kullanacaktır. (Bir kerelik adresleri kullanmak için, ayarlardan \"Sürekli adres kullan\" seçeneğini kapatın.)",
+ "gui_status_indicator_share_stopped": "Paylaşmaya hazır",
+ "gui_status_indicator_share_working": "Başlıyor…",
+ "gui_status_indicator_share_started": "Paylaşılıyor",
+ "gui_status_indicator_receive_stopped": "Almaya hazır",
+ "gui_status_indicator_receive_working": "Başlıyor…",
+ "gui_status_indicator_receive_started": "Alınıyor",
+ "gui_file_info": "{} dosya, {}",
+ "gui_file_info_single": "{} dosya, {}",
+ "history_in_progress_tooltip": "{} devam etmekte",
+ "history_completed_tooltip": "{} tamamlandı",
+ "error_cannot_create_data_dir": "OnionShare veri klasörü oluşturulamadı: {}",
+ "receive_mode_data_dir": "Size gönderilen dosyalar bu klasörde görünür: {}",
+ "receive_mode_warning": "Uyarı: Alma kipi, insanların bilgisayarınıza dosya yüklemesini sağlar. Bazı dosyalar, onları açarsanız bilgisayarınızın denetimini ele geçirebilir. Yalnızca güvendiğiniz insanlara veya ne yaptığınızı biliyorsanız bunları açın.",
+ "gui_receive_mode_warning": "Alma kipi insanların bilgisayarınıza dosya yüklemesini sağlar.<br><br><b>Bazı dosyalar, onları açarsanız bilgisayarınızın denetimini ele geçirebilir. Yalnızca güvendiğiniz insanlara veya ne yaptığınızı biliyorsanız bunları açın.</b>",
+ "receive_mode_upload_starting": "{} toplam boyutunun karşıya yüklenmesi başlıyor",
+ "receive_mode_received_file": "Alınan: {}",
+ "gui_mode_share_button": "Paylaşılan Dosyalar",
+ "gui_mode_receive_button": "Alınan Dosyalar",
+ "gui_settings_receiving_label": "Alma ayarları",
+ "gui_settings_data_dir_label": "Dosyaları şuraya kaydet",
+ "gui_settings_data_dir_browse_button": "Gözat",
+ "gui_settings_public_mode_checkbox": "Genel kip",
+ "gui_open_folder_error_nautilus": "Nautilus mevcut olmadığından dizin açılamıyor. Dosya burada: {}",
+ "gui_settings_language_label": "Tercih edilen dil",
+ "gui_settings_language_changed_notice": "Dilde yaptığınız değişikliklerin yürürlüğe girmesi için OnionShare'ı yeniden başlatın.",
+ "systray_menu_exit": "Çık",
+ "systray_page_loaded_title": "Sayfa Yüklendi",
+ "systray_page_loaded_message": "OnionShare adresi yüklendi",
+ "systray_share_started_title": "Paylaşma Başladı",
+ "systray_share_started_message": "Birine dosya göndermeye başlanılıyor",
+ "systray_share_completed_title": "Paylaşım Tamamlandı",
+ "systray_share_completed_message": "Dosya gönderimi tamamlandı",
+ "systray_share_canceled_title": "Paylaşma İptal Edildi",
+ "systray_share_canceled_message": "Birisi dosyalarınızı almayı iptal etti",
+ "systray_receive_started_title": "Alma Başladı",
+ "systray_receive_started_message": "Birisi sana dosya gönderiyor",
+ "gui_all_modes_history": "Geçmiş",
+ "gui_all_modes_clear_history": "Hepsini Temizle",
+ "gui_all_modes_transfer_started": "Başladı {}",
+ "gui_all_modes_transfer_finished_range": "Aktarıldı {} - {}",
+ "gui_all_modes_transfer_finished": "Aktarıldı {}",
+ "gui_all_modes_transfer_canceled_range": "İptal edildi {} - {}",
+ "gui_all_modes_transfer_canceled": "İptal edildi {}",
+ "gui_all_modes_progress_complete": "%p%, {0:s} geçti.",
+ "gui_all_modes_progress_starting": "{0:s}, %p% (hesaplanıyor)",
+ "gui_all_modes_progress_eta": "{0:s}, Tahmini yükleme zamanı: {1:s}, %p%",
+ "gui_share_mode_no_files": "Henüz Dosya Gönderilmedi",
+ "gui_share_mode_timeout_waiting": "Göndermeyi bitirmek için bekleniyor",
+ "gui_receive_mode_no_files": "Henüz bir dosya alınmadı",
+ "gui_receive_mode_timeout_waiting": "Almayı bitirmek için bekleniyor",
+ "gui_stop_server_autostop_timer_tooltip": "Otomatik durdurma zamanlayıcısı {} sonra biter",
+ "gui_start_server_autostart_timer_tooltip": "Otomatik başlatma zamanlayıcısı {} sonra biter",
+ "gui_waiting_to_start": "{} ile başlaması planlandı. İptal etmek için tıklayın.",
+ "gui_settings_autostart_timer_checkbox": "Otomatik başlatma zamanlayıcısını kullan",
+ "gui_settings_autostart_timer": "Paylaşımı başlat:",
+ "gui_server_autostart_timer_expired": "Planlanan zaman çoktan geçti. Paylaşmaya başlamak için lütfen güncelleyin.",
+ "gui_autostop_timer_cant_be_earlier_than_autostart_timer": "Otomatik durma süresi, otomatik başlama saatinden aynı veya daha erken olamaz. Paylaşmaya başlamak için lütfen güncelleyin.",
+ "gui_status_indicator_share_scheduled": "Planlanmış…",
+ "gui_status_indicator_receive_scheduled": "Planlanmış…",
+ "gui_share_mode_autostop_timer_waiting": "Göndermeyi bitirmesi bekleniyor",
+ "gui_receive_mode_autostop_timer_waiting": "Almayı bitirmek için bekleniyor",
+ "days_first_letter": "g",
+ "hours_first_letter": "s",
+ "minutes_first_letter": "d",
+ "seconds_first_letter": "sn"
}
diff --git a/share/locale/uk.json b/share/locale/uk.json
new file mode 100644
index 00000000..2c01766c
--- /dev/null
+++ b/share/locale/uk.json
@@ -0,0 +1,175 @@
+{
+ "preparing_files": "Стискання файлів.",
+ "not_a_readable_file": "{0:s} - файл що не читається.",
+ "no_available_port": "Не вдалося знайти доступний порт для запуску onion служби",
+ "other_page_loaded": "Адресу завантажено",
+ "close_on_autostop_timer": "Зупинено, бо збіг час таймеру автоспину",
+ "closing_automatically": "Зупинено, бо передачу виконано",
+ "large_filesize": "Увага: відправлення великого об'єму може тривати години",
+ "gui_drag_and_drop": "Перетягніть файли та теки\nдля поширення",
+ "gui_add": "Додати",
+ "gui_add_files": "Додати Файли",
+ "gui_add_folder": "Додати Теку",
+ "gui_delete": "Видалити",
+ "gui_choose_items": "Вибрати",
+ "gui_share_start_server": "Розпочати поширення",
+ "gui_share_stop_server": "Припинити поширення",
+ "gui_share_stop_server_autostop_timer": "Припинити поширення ({})",
+ "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_copy_url": "Копіювати Адресу",
+ "gui_copy_hidservauth": "Скопіювати HidServAuth",
+ "gui_canceled": "Скасовано",
+ "gui_copied_url_title": "Скопійовано Адресу OnionShare",
+ "gui_copied_url": "Адресу OnionShare скопійовано до буферу обміну",
+ "gui_copied_hidservauth_title": "Скопійовано HidServAuth",
+ "gui_copied_hidservauth": "Рядок HidServAuth скопійовано до буферу обміну",
+ "gui_waiting_to_start": "Заплановано почати за {}. Натисніть для скасування.",
+ "gui_please_wait": "Початок... Натисніть для скасування.",
+ "gui_quit_title": "Не так швидко",
+ "gui_share_quit_warning": "Відбувається передача файлів. Ви впевнені, що бажаєте вийти з OnionShare?",
+ "gui_receive_quit_warning": "Відбувається отримання файлів. Ви впевнені, що бажаєте вийти з OnionShare?",
+ "gui_quit_warning_quit": "Вийти",
+ "gui_quit_warning_dont_quit": "Відміна",
+ "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": "Налаштування",
+ "gui_settings_whats_this": "<a href='{0:s}'>Що це?</a>",
+ "gui_settings_stealth_option": "Використовувати авторизацію клієнта",
+ "gui_settings_stealth_hidservauth_string": "Після збереження вашого закритого ключа для повторного використання, ви можете скопіювати HidServAuth.",
+ "gui_settings_autoupdate_label": "Перевірити на наявність оновлень",
+ "gui_settings_autoupdate_option": "Повідомляти про наявність нової версії",
+ "gui_settings_autoupdate_timestamp": "Востаннє перевірялось: {}",
+ "gui_settings_autoupdate_timestamp_never": "Ніколи",
+ "gui_settings_autoupdate_check_button": "Перевірити на наявність оновлень",
+ "gui_settings_general_label": "Загальні параметри",
+ "gui_settings_onion_label": "Параметри Onion",
+ "gui_settings_sharing_label": "Параметри поширення",
+ "gui_settings_close_after_first_download_option": "Припинити поширення після надсилання файлів",
+ "gui_settings_connection_type_label": "Як OnionShare повинен підключатися до Tor?",
+ "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": "Перевірити підключення до Tor",
+ "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": "Без автентифікації або автентифікація через cookie",
+ "gui_settings_authenticate_password_option": "Пароль",
+ "gui_settings_password_label": "Пароль",
+ "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": "Увага: Мости meek_lite є дуже дорогими для проекту Tor. <br> <br> Використовуйте їх тільки якщо не вдається підключитися до Tor безпосередньо, через obfs4 транспорти або інші звичайні мости.",
+ "gui_settings_tor_bridges_custom_radio_option": "Використовувати налаштовані мости",
+ "gui_settings_tor_bridges_custom_label": "Ви можете отримати мости з <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>",
+ "gui_settings_tor_bridges_invalid": "Жоден з доданих мостів не працює.\nДвічі перевірте їх або додайте інші.",
+ "gui_settings_button_save": "Зберегти",
+ "gui_settings_button_cancel": "Скасувати",
+ "gui_settings_button_help": "Допомога",
+ "gui_settings_autostop_timer_checkbox": "Використовувати таймер автоспину",
+ "gui_settings_autostop_timer": "Припинити поширення о:",
+ "gui_settings_autostart_timer_checkbox": "Використовувати таймер автозапуску",
+ "gui_settings_autostart_timer": "Розпочати поширення о:",
+ "settings_error_unknown": "Не вдалося підключитися до контролера Tor, оскільки налаштування не мають сенсу.",
+ "settings_error_automatic": "Не вдалося підключитися до контролера Tor. Чи Tor браузер (доступний з torproject.org) запущений?",
+ "settings_error_socket_port": "Не вдалося підключитися до контролера Tor за {}: {}.",
+ "settings_error_socket_file": "Не вдалося підключитися до контролера Tor за допомогою сокет файлу {}.",
+ "settings_error_auth": "Підключений до {}:{}, але не можливо пройти автентифікацію. Чи це не Tor контролер?",
+ "settings_error_missing_password": "Підключений до контролера Tor, але він вимагає пароль для автентифікації.",
+ "settings_error_unreadable_cookie_file": "Підключений до контролера Тор, але пароль може бути неправильним, або у вас немає прав на читання файлів cookie.",
+ "settings_error_bundled_tor_not_supported": "Використання Tor версії, яка поставляється з OnionShare не працює в режимі розробника на Windows або macOS.",
+ "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_unknown": "Сталася невідома помилка з Tor",
+ "connecting_to_tor": "Підключення до мережі Tor",
+ "update_available": "Новий OnionShare вийшов. <a href='{}'>Натисніть тут</a> щоб його отримати.<br><br>Ваша версія {}, а остання {}.",
+ "update_error_check_error": "Не вдалося перевірити наявність нових версій: сайт OnionShare говорить, що остання версія є невпізнанним '{}'…",
+ "update_error_invalid_latest_version": "Не вдалося перевірити наявність нової версії: можливо, ви не підключені до Tor або веб-сайт 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_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": "OnionShare це",
+ "gui_connect_to_tor_for_onion_settings": "Підключіться до Tor, щоб побачити параметри служби onion",
+ "gui_use_legacy_v2_onions_checkbox": "Використовувати адреси попередньої версії",
+ "gui_save_private_key_checkbox": "Використовувати постійну адресу",
+ "gui_share_url_description": "<b>Будь-хто</b>, за допомогою цієї адреси, може <b>завантажити</b> ваші файли, використовуючи <b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>Будь-хто</b>, за допомогою цієї адреси, може <b>завантажити</b> файли до вашого комп'ютеру, використовуючи <b>Tor Browser</b>: <img src='{}' />",
+ "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_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": "{} завершено",
+ "error_cannot_create_data_dir": "Не вдалося створити теку даних OnionShare: {}",
+ "gui_receive_mode_warning": "Режим отримання дозволяє завантажувати файли до вашого комп'ютера.<br><br><b>Деякі файли, потенційно, можуть забезпечити керування вашим комп'ютером, у разі їх відкриття. Відкривайте речі тільки від довірених осіб, або якщо твердо розумієте що ви робите.</b>",
+ "gui_mode_share_button": "Поширення Файлів",
+ "gui_mode_receive_button": "Отримання Файлів",
+ "gui_settings_receiving_label": "Параметри отримання",
+ "gui_settings_data_dir_label": "Зберігати файли до",
+ "gui_settings_data_dir_browse_button": "Огляд",
+ "gui_settings_public_mode_checkbox": "Публічний режим",
+ "gui_open_folder_error_nautilus": "Неможливо відкрити теку бо nautilus недоступний. Файл розташовано: {}",
+ "gui_settings_language_label": "Бажана мова",
+ "gui_settings_language_changed_notice": "Перезапустіть OnionShare для зміни мови.",
+ "systray_menu_exit": "Вийти",
+ "systray_page_loaded_title": "Сторінку Завантажено",
+ "systray_page_loaded_message": "OnionShare адресу завантажено",
+ "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_transfer_finished_range": "Передано {} - {}",
+ "gui_all_modes_transfer_finished": "Передано {}",
+ "gui_all_modes_transfer_canceled_range": "Скасовано {} - {}",
+ "gui_all_modes_transfer_canceled": "Скасовано {}",
+ "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_autostop_timer_waiting": "Очікування завершення відправки",
+ "gui_receive_mode_no_files": "Поки що нічого не отримано",
+ "gui_receive_mode_autostop_timer_waiting": "Очікування завершення отримання",
+ "receive_mode_upload_starting": "Завантаження об'ємом {} починається",
+ "days_first_letter": "д",
+ "hours_first_letter": "г",
+ "minutes_first_letter": "х",
+ "seconds_first_letter": "с"
+}
diff --git a/share/locale/wo.json b/share/locale/wo.json
index a67a5f75..89d732b3 100644
--- a/share/locale/wo.json
+++ b/share/locale/wo.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"large_filesize": "",
@@ -25,10 +25,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -37,12 +37,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -104,8 +104,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -131,8 +131,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/yo.json b/share/locale/yo.json
index 25cd5c48..96b5a0d1 100644
--- a/share/locale/yo.json
+++ b/share/locale/yo.json
@@ -10,7 +10,7 @@
"not_a_readable_file": "",
"no_available_port": "",
"other_page_loaded": "",
- "close_on_timeout": "",
+ "close_on_autostop_timer": "",
"closing_automatically": "",
"timeout_download_still_running": "",
"timeout_upload_still_running": "",
@@ -26,10 +26,10 @@
"systray_upload_started_message": "",
"help_local_only": "",
"help_stay_open": "",
- "help_shutdown_timeout": "",
+ "help_autostop_timer": "",
"help_stealth": "",
"help_receive": "",
- "help_debug": "",
+ "help_verbose": "",
"help_filename": "",
"help_config": "",
"gui_drag_and_drop": "",
@@ -38,12 +38,12 @@
"gui_choose_items": "",
"gui_share_start_server": "",
"gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
+ "gui_share_stop_server_autostop_timer": "",
+ "gui_share_stop_server_autostop_timer_tooltip": "",
"gui_receive_start_server": "",
"gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
+ "gui_receive_stop_server_autostop_timer": "",
+ "gui_receive_stop_server_autostop_timer_tooltip": "",
"gui_copy_url": "",
"gui_copy_hidservauth": "",
"gui_downloads": "",
@@ -105,8 +105,8 @@
"gui_settings_button_save": "",
"gui_settings_button_cancel": "",
"gui_settings_button_help": "",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
+ "gui_settings_autostop_timer_checkbox": "",
+ "gui_settings_autostop_timer": "",
"settings_error_unknown": "",
"settings_error_automatic": "",
"settings_error_socket_port": "",
@@ -132,8 +132,8 @@
"gui_tor_connection_error_settings": "",
"gui_tor_connection_canceled": "",
"gui_tor_connection_lost": "",
- "gui_server_started_after_timeout": "",
- "gui_server_timeout_expired": "",
+ "gui_server_started_after_autostop_timer": "",
+ "gui_server_autostop_timer_expired": "",
"share_via_onionshare": "",
"gui_use_legacy_v2_onions_checkbox": "",
"gui_save_private_key_checkbox": "",
diff --git a/share/locale/zh_Hans.json b/share/locale/zh_Hans.json
index 6a3bf7b7..a4a4f9f7 100644
--- a/share/locale/zh_Hans.json
+++ b/share/locale/zh_Hans.json
@@ -1,19 +1,19 @@
{
"config_onion_service": "在端口{0:d}上设置洋葱服务。",
- "preparing_files": "正在压缩文件.",
+ "preparing_files": "正在压缩文件。",
"give_this_url": "把这个地址给收件人:",
"give_this_url_stealth": "向收件人提供此地址和HidServAuth行:",
"give_this_url_receive": "把这个地址交给发件人:",
"give_this_url_receive_stealth": "把这个地址和HidServAuth交给发送者:",
"ctrlc_to_stop": "按Ctrl+C停止服务器",
"not_a_file": "{0:s}不是有效文件。",
- "not_a_readable_file": "{0:s}不是可读文件.",
- "no_available_port": "找不到可用于开启onion服务的端口",
+ "not_a_readable_file": "{0:s} 不是可读文件。",
+ "no_available_port": "找不到可用于开启 onion 服务的端口",
"other_page_loaded": "地址已加载完成",
- "close_on_timeout": "终止 原因:自动停止计时器的时间已到",
- "closing_automatically": "终止 原因:传输已完成",
+ "close_on_autostop_timer": "已停止,因为定时器计时结束,自动停止",
+ "closing_automatically": "已停止,因为传输已完成",
"timeout_download_still_running": "",
- "large_filesize": "警告:分享大文件可能会用上数小时",
+ "large_filesize": "警告:发送大的共享文件可能会花费数小时",
"systray_menu_exit": "退出",
"systray_download_started_title": "",
"systray_download_started_message": "",
@@ -23,144 +23,144 @@
"systray_download_canceled_message": "",
"systray_upload_started_title": "",
"systray_upload_started_message": "",
- "help_local_only": "不使用Tor(只限开发测试)",
+ "help_local_only": "不使用Tor(仅开发测试)",
"help_stay_open": "文件传输完成后继续分享",
- "help_shutdown_timeout": "超过给定时间(秒)后,终止分享.",
+ "help_autostop_timer": "超过给定时间(秒)后终止分享",
"help_stealth": "使用服务端认证(高级选项)",
- "help_receive": "仅接收分享的文件,不发送",
- "help_debug": "将OnionShare错误日志记录到stdout,将web错误日志记录到磁盘",
+ "help_receive": "仅接收分享的文件,不发送",
+ "help_verbose": "将OnionShare错误日志记录到stdout,将web错误日志记录到磁盘",
"help_filename": "要分享的文件或文件夹的列表",
"help_config": "自定义JSON配置文件的路径(可选)",
- "gui_drag_and_drop": "将文件或文件夹拖动到这里来开始分享",
+ "gui_drag_and_drop": "拖动文件或文件夹\n以开始共享",
"gui_add": "添加",
"gui_delete": "删除",
"gui_choose_items": "选取",
- "gui_share_start_server": "开始分享",
- "gui_share_stop_server": "停止分享",
- "gui_share_stop_server_shutdown_timeout": "停止分享(还剩{}秒)",
- "gui_share_stop_server_shutdown_timeout_tooltip": "在{}自动停止",
- "gui_receive_start_server": "开启接受模式",
- "gui_receive_stop_server": "停止接受模式",
- "gui_receive_stop_server_shutdown_timeout": "停止接受模式(还剩{}秒)",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "在{}自动停止",
+ "gui_share_start_server": "开始共享",
+ "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_stop_server_autostop_timer": "停止接收模式(还剩 {} 秒)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "在{}自动停止",
"gui_copy_url": "复制地址",
- "gui_copy_hidservauth": "复制HidServAuth",
+ "gui_copy_hidservauth": "复制 HidServAuth",
"gui_downloads": "",
"gui_no_downloads": "",
"gui_canceled": "已取消",
- "gui_copied_url_title": "已复制的OnionShare地址",
- "gui_copied_url": "OnionShare地址已复制到剪贴板",
- "gui_copied_hidservauth_title": "已复制的HidServAuth",
- "gui_copied_hidservauth": "HidServAuth行已复制到剪贴板",
- "gui_please_wait": "起始中...点击这里可取消.",
+ "gui_copied_url_title": "已复制 OnionShare 地址",
+ "gui_copied_url": "OnionShare 地址已复制到剪贴板",
+ "gui_copied_hidservauth_title": "已复制 HidServAuth",
+ "gui_copied_hidservauth": "HidServAuth 行已复制到剪贴板",
+ "gui_please_wait": "正在开启……点击以取消。",
"gui_download_upload_progress_complete": "",
"gui_download_upload_progress_starting": "",
"gui_download_upload_progress_eta": "",
- "version_string": "版本: OnionShare {0:s} | https://onionshare.org/",
+ "version_string": "版本: OnionShare {0:s} | https://onionshare.org/",
"gui_quit_title": "再等等",
- "gui_share_quit_warning": "您有文件正在传输中...您确定要退出OnionShare吗?",
- "gui_receive_quit_warning": "您有文件还正在接收中...您确定要退出OnionShare吗?",
+ "gui_share_quit_warning": "您有文件正在发送中……确定要退出 OnionShare 吗?",
+ "gui_receive_quit_warning": "您有文件在接收中……确定要退出 OnionShare 吗?",
"gui_quit_warning_quit": "退出",
"gui_quit_warning_dont_quit": "取消",
- "error_rate_limit": "有人您对地址发出过多错误请求,这很可能说明有人在尝试猜测您的地址.因此为了安全OinionShare已终止服务.请重新开启分享并且向收件人发送新地址.",
- "zip_progress_bar_format": "压缩中: %p%",
- "error_stealth_not_supported": "要使用服务端认证,您至少需要的最低版本要求是:Tor 0.2.9.1-alpha (or Tor Browser 6.5)和python3-stem 1.5.0.两者缺一不可,同时需要.",
- "error_ephemeral_not_supported": "OnionShare至少同时需要Tor 0.2.7.1和python3-stem 1.4.0来运行.",
+ "error_rate_limit": "有人对您的地址发出了过多的错误请求,这说明他们可能在尝试猜测您的地址,因此 OinionShare 已停止服务。请重新开启共享并且向接收人发送新的共享地址。",
+ "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": "设置",
"gui_settings_whats_this": "<a href='{0:s}'>这是什么?</a>",
"gui_settings_stealth_option": "使用客户端认证",
- "gui_settings_stealth_hidservauth_string": "已保存了你的私钥用于重复使用,意味着您现在可以\n点击这里来复制您的HidServAuth.",
+ "gui_settings_stealth_hidservauth_string": "已保存您的私钥用于重复使用,这意味着您现在可以点击以复制您的 HidServAuth。",
"gui_settings_autoupdate_label": "检查新版本",
- "gui_settings_autoupdate_option": "有新版本可用时告知我",
- "gui_settings_autoupdate_timestamp": "上次检查更新的时间:{}",
+ "gui_settings_autoupdate_option": "新版本可用时通知我",
+ "gui_settings_autoupdate_timestamp": "上次检查更新时间:{}",
"gui_settings_autoupdate_timestamp_never": "从不",
"gui_settings_autoupdate_check_button": "检查新版本",
- "gui_settings_general_label": "常规设置",
- "gui_settings_sharing_label": "分享设置",
- "gui_settings_close_after_first_download_option": "文件发送完成后停止分享",
- "gui_settings_connection_type_label": "OnionShare应如何连接Tor?",
- "gui_settings_connection_type_bundled_option": "使用OnionShare内置的tor",
- "gui_settings_connection_type_automatic_option": "尝试使用Tor Browser(Tor浏览器)的设置",
- "gui_settings_connection_type_control_port_option": "用特定端口连接",
- "gui_settings_connection_type_socket_file_option": "使用socket文档的设置连接",
- "gui_settings_connection_type_test_button": "测试tor连接",
+ "gui_settings_general_label": "通用设置",
+ "gui_settings_sharing_label": "共享设置",
+ "gui_settings_close_after_first_download_option": "文件发送完成后停止共享",
+ "gui_settings_connection_type_label": "OnionShare 如何连接至Tor?",
+ "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": "使用 socket 文件连接",
+ "gui_settings_connection_type_test_button": "测试与 Tor 的连接",
"gui_settings_control_port_label": "控制端口",
- "gui_settings_socket_file_label": "Socket配置文档",
+ "gui_settings_socket_file_label": "Socket 文件",
"gui_settings_socks_label": "SOCKS 端口",
- "gui_settings_authenticate_label": "Tor认证设置",
- "gui_settings_authenticate_no_auth_option": "无须认证,或者使用的是cookie认证",
+ "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网桥设置",
+ "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(需要obfs4代理)",
- "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 (需要obfs4代理)",
- "gui_settings_meek_lite_expensive_warning": "警告:meek_lite类型的网桥对Tor流量产生的负担很大,<br>请只在无法直接使用tor,且obfs4 transport和其他网桥都无法连接时才使用.<br>.",
+ "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_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_meek_lite_expensive_warning": "警告:meek_lite 网桥会对 Tor 的运行产生极大负担。<br><br>仅在无法直接连接至 Tor,通过 obfs4 transports 连接,或通过其他网桥连接时使用。",
"gui_settings_tor_bridges_custom_radio_option": "使用自定义网桥",
- "gui_settings_tor_bridges_custom_label": "您可以从这里得到网桥地址<a href=\"https://bridges.torproject.org/options\">\nhttps://bridges.torproject.org</a>",
- "gui_settings_tor_bridges_invalid": "您所添加的网桥无法工作.\n请双击它们或者添加其它网桥.",
+ "gui_settings_tor_bridges_custom_label": "您可以从 <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a> 获得网桥",
+ "gui_settings_tor_bridges_invalid": "您所添加的网桥均无法工作。\n请再次检查或添加其它网桥。",
"gui_settings_button_save": "保存",
"gui_settings_button_cancel": "取消",
"gui_settings_button_help": "帮助",
- "gui_settings_shutdown_timeout_checkbox": "使用自动停止计时器",
- "gui_settings_shutdown_timeout": "在(时间)停止分享",
- "settings_error_unknown": "无法连接Tor控制件,因为您的设置无法被理解.",
- "settings_error_automatic": "无法连接tor控制件.Tor浏览器是否在后台工作?(从torproject.org可以获得Tor Browser)",
- "settings_error_socket_port": "在socket端口{}:{}无法连接tor控制件.",
- "settings_error_socket_file": "无法使用socket配置文档的设置连接tor控制件",
- "settings_error_auth": "已连接到了{}:{},但是无法认证,也许这不是tor控制件?",
- "settings_error_missing_password": "已连接到tor控制件,但需要密码来认证.",
- "settings_error_unreadable_cookie_file": "已连接到tor控制件,但可能密码错误,或者没有读取cookie文件的权限.",
- "settings_error_bundled_tor_not_supported": "OnionShare自带的Tor无法在Windows或macOS下运行开发者模式",
- "settings_error_bundled_tor_timeout": "尝试连接tor的用时过长,也许您的网络有问题,或者是系统时间不准确?",
- "settings_error_bundled_tor_broken": "OnionShare无法在后台连接Tor\n{}",
- "settings_test_success": "已连接到Tor控制件\n\nTor版本: {}\n支持短期onion服务: {}.\n支持客户端认证: {}.\n支持新一代.onion地址: {}.",
- "error_tor_protocol_error": "Tor出现错误: {}",
- "error_tor_protocol_error_unknown": "Tor出现未知错误",
+ "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": "无法通过 socket 文件 {} 连接至 Tor 控制器。",
+ "settings_error_auth": "已连接至 {}:{},但无法认证。这也许不是一个 Tor 控制器?",
+ "settings_error_missing_password": "已连接至 Tor 控制器,但需要密码以认证。",
+ "settings_error_unreadable_cookie_file": "已连接至 Tor 控制器,但密码可能错误,或您的用户没有读取 cookie 文件的权限。",
+ "settings_error_bundled_tor_not_supported": "OnionShare 自带的 Tor 版本无法在 Windows 或 macOS 下运行开发者模式。",
+ "settings_error_bundled_tor_timeout": "连接至 Tor 的时间过长。也许您未连接至互联网,或是系统时间不准确?",
+ "settings_error_bundled_tor_broken": "OnionShare 无法在后台连接至 Tor\n{}",
+ "settings_test_success": "已连接至 Tor 控制器。\n\nTor版本:{}\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": "无法检查更新:OnionShare官网对最新版本无法识别'{}'…",
- "update_error_invalid_latest_version": "无法检查更新:也许您没有连接到Tor?或者OnionShare官网不可用?",
- "update_not_available": "您现在运行的OnionShare为最新版本.",
- "gui_tor_connection_ask": "打开设置来查看Tor连接?",
- "gui_tor_connection_ask_open_settings": "是的",
+ "connecting_to_tor": "正在连接至 Tor 网络",
+ "update_available": "有新版本的 OnionShare 可用:<a href='{}'>点击这里</a>以获取。<br><br>您正在使用的版本为 {},最新版本为 {}。",
+ "update_error_check_error": "无法检查更新:OnionShare 网站显示最新版本是无法识别的 '{}'……",
+ "update_error_invalid_latest_version": "无法检查更新:也许您没有连接至 Tor,或 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_server_started_after_timeout": "在服务开始之前自动停止计时器的时间已到.\n请建立新的分享.",
- "gui_server_timeout_expired": "自动停止计时器的时间已到.\n请更新其设置来开始分享.",
- "share_via_onionshare": "用OnionShare来分享",
- "gui_use_legacy_v2_onions_checkbox": "使用古老的地址",
+ "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": "在服务器启动之前,自动停止的定时器的计时已到。请建立一个新的共享。",
+ "gui_server_autostop_timer_expired": "自动停止的定时器计时已到。请更新以开始共享。",
+ "share_via_onionshare": "用 OnionShare 来共享",
+ "gui_use_legacy_v2_onions_checkbox": "使用老式地址",
"gui_save_private_key_checkbox": "使用长期地址",
- "gui_share_url_description": "<b>任何人</b>只要拥有这个OnionShare 地址,都可以用<b>Tor浏览器</b>来从您的设备进行文件<b>下载</b>:<img src='{}' />",
- "gui_receive_url_description": "<b>任何人</b>只要拥有这个OnionShare 地址,都可以用<b>Tor浏览器</b>来给你的设备进行文件<b>上传</b>:<img src='{}' />",
- "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_status_indicator_receive_stopped": "准备接收",
- "gui_status_indicator_receive_working": "正在初始化…",
+ "gui_share_url_description": "<b>任何人</b>只要有这个 OnionShare 地址,都可以用<b> Tor Browser </b>来<b>下载</b>您的文件:<img src='{}' />",
+ "gui_receive_url_description": "<b>任何人</b>只要有这个 OnionShare 地址,都可以用<b> Tor Browser </b>向您的电脑<b>上传</b>文件:<img src='{}' />",
+ "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_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_file_info": "{} 个文件,{}",
+ "gui_file_info_single": "{} 个文件,{}",
+ "history_in_progress_tooltip": "{} 正在进行中",
+ "history_completed_tooltip": "{} 已完成",
"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": "接收模式下允许他人对您的设备上传文件.<br><br><b>有一些文件可能有恶意代码并控制您的设备或者造成严重伤害,请只谨慎打开来自您信赖的人的文件,或者确保采取必要的安全措施.</b>",
- "receive_mode_upload_starting": "上传文件的大小为{}正在开始",
+ "gui_receive_mode_warning": "接收模式允许他人向您的电脑上传文件。<br><br><b>一些文件可能会在您打开它们时控制您的电脑。仅打开来自您所信任的人的文件,或在您清楚自己的行为时打开文件。</b>",
+ "receive_mode_upload_starting": "上传的文件总大小为 {},正在开始",
"receive_mode_received_file": "接收到: {}",
- "gui_mode_share_button": "分享文件",
+ "gui_mode_share_button": "共享文件",
"gui_mode_receive_button": "接收文件",
"gui_settings_receiving_label": "接收设置",
"gui_settings_downloads_label": "",
@@ -179,38 +179,51 @@
"gui_upload_finished_range": "",
"gui_upload_finished": "",
"gui_download_in_progress": "",
- "gui_open_folder_error_nautilus": "无法打开文件夹,原因:nautilus不可用.文件在这里: {}",
+ "gui_open_folder_error_nautilus": "无法打开文件夹,因为 nautilus 不可用。文件在这里:{}",
"gui_settings_language_label": "首选语言",
- "gui_settings_language_changed_notice": "请重启OnionShare以使您的语言改变设定生效.",
+ "gui_settings_language_changed_notice": "重启 OnionShare 以使您对的语言更改生效。",
"gui_add_files": "添加文件",
"gui_add_folder": "添加文件夹",
- "gui_connect_to_tor_for_onion_settings": "连接Tor来查看onion服务的设置",
- "error_cannot_create_data_dir": "无法建立OnionShare文件夹: {}",
+ "gui_connect_to_tor_for_onion_settings": "连接至 Tor 以查看 onion 服务的设置",
+ "error_cannot_create_data_dir": "无法创建 OnionShare 数据文件夹:{}",
"receive_mode_data_dir": "您收到的文件会出现在这个文件夹: {}",
"gui_settings_data_dir_label": "将文件保存到",
"gui_settings_data_dir_browse_button": "浏览",
- "systray_page_loaded_message": "OnionShare地址已加载",
- "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": "某人在向您发送文件",
+ "systray_page_loaded_message": "OnionShare 地址已加载",
+ "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_transfer_finished_range": "已传输 {} - {}",
- "gui_all_modes_transfer_finished": "已传输完成 {}",
- "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_timeout_waiting": "等待结束发送",
- "gui_receive_mode_no_files": "还没有接收文件",
- "gui_receive_mode_timeout_waiting": "等待接收完成",
- "gui_settings_onion_label": "Onion设置",
- "gui_all_modes_transfer_canceled_range": "已取消 {} - {}",
- "gui_all_modes_transfer_canceled": "已取消 {}"
+ "gui_all_modes_transfer_started": "开始于 {}",
+ "gui_all_modes_transfer_finished_range": "传输于 {} - {}",
+ "gui_all_modes_transfer_finished": "传输于 {}",
+ "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_autostop_timer_waiting": "正在等待发送结束",
+ "gui_receive_mode_no_files": "还没有接收到文件",
+ "gui_receive_mode_autostop_timer_waiting": "正在等待接收结束",
+ "gui_settings_onion_label": "Onion 设置",
+ "gui_all_modes_transfer_canceled_range": "取消于 {} - {}",
+ "gui_all_modes_transfer_canceled": "取消于 {}",
+ "gui_stop_server_autostop_timer_tooltip": "自动停止的定时器在 {} 停止",
+ "gui_start_server_autostart_timer_tooltip": "自动开始的定时器在 {} 停止",
+ "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_receive_scheduled": "已计划……",
+ "days_first_letter": "天",
+ "hours_first_letter": "小时",
+ "minutes_first_letter": "分",
+ "seconds_first_letter": "秒"
}
diff --git a/share/locale/zh_Hant.json b/share/locale/zh_Hant.json
index c24d13ce..1cee99c7 100644
--- a/share/locale/zh_Hant.json
+++ b/share/locale/zh_Hant.json
@@ -1,19 +1,19 @@
{
- "config_onion_service": "",
- "preparing_files": "",
- "give_this_url": "",
- "give_this_url_stealth": "",
- "give_this_url_receive": "",
- "give_this_url_receive_stealth": "",
- "ctrlc_to_stop": "",
- "not_a_file": "",
- "not_a_readable_file": "",
- "no_available_port": "",
- "other_page_loaded": "",
- "close_on_timeout": "",
- "closing_automatically": "",
+ "config_onion_service": "正在端口{0:d}啟動onion服務...",
+ "preparing_files": "壓縮檔案中...",
+ "give_this_url": "請將這串地址交給接收者:",
+ "give_this_url_stealth": "請將這串地址以及HidServAuth交給接收者:",
+ "give_this_url_receive": "請將這串地址交給傳送者:",
+ "give_this_url_receive_stealth": "請將這串地址以及HidServAuth交給傳送者:",
+ "ctrlc_to_stop": "按下Ctrl+C以停止服務",
+ "not_a_file": "{0:s} 不是一個可用的檔案。",
+ "not_a_readable_file": "{0:s} 不是一個可讀取的檔案。",
+ "no_available_port": "找不到一個可用的端口來啟動onion服務",
+ "other_page_loaded": "已載入的地址",
+ "close_on_autostop_timer": "因自動停止計時器的時間已到,已停止",
+ "closing_automatically": "因傳輸完成,已停止",
"timeout_download_still_running": "",
- "large_filesize": "",
+ "large_filesize": "警告:傳輸巨大的檔案將有可能耗時數小時以上",
"systray_menu_exit": "離開",
"systray_download_started_title": "",
"systray_download_started_message": "",
@@ -23,153 +23,153 @@
"systray_download_canceled_message": "",
"systray_upload_started_title": "",
"systray_upload_started_message": "",
- "help_local_only": "",
- "help_stay_open": "",
- "help_shutdown_timeout": "",
- "help_stealth": "",
- "help_receive": "",
- "help_debug": "",
- "help_filename": "",
- "help_config": "",
- "gui_drag_and_drop": "",
+ "help_local_only": "不要使用Tor(僅限開發使用)",
+ "help_stay_open": "繼續分享即使檔案已傳送",
+ "help_autostop_timer": "在所給定的秒數後停止分享",
+ "help_stealth": "使用客戶端認證 (進階選項)",
+ "help_receive": "接收分享的檔案而不是傳送他們",
+ "help_debug": "將OnionShare的錯誤日誌輸出到stdout, 並且將網路錯誤輸出到硬碟",
+ "help_filename": "列舉所要分享的檔案或資料夾",
+ "help_config": "自定義的JSON設置檔路徑(選擇性)",
+ "gui_drag_and_drop": "拖曳檔案及資料夾來開始分享",
"gui_add": "新增",
"gui_delete": "刪除",
- "gui_choose_items": "選擇",
- "gui_share_start_server": "",
- "gui_share_stop_server": "",
- "gui_share_stop_server_shutdown_timeout": "",
- "gui_share_stop_server_shutdown_timeout_tooltip": "",
- "gui_receive_start_server": "",
- "gui_receive_stop_server": "",
- "gui_receive_stop_server_shutdown_timeout": "",
- "gui_receive_stop_server_shutdown_timeout_tooltip": "",
- "gui_copy_url": "",
- "gui_copy_hidservauth": "",
+ "gui_choose_items": "瀏覽",
+ "gui_share_start_server": "開始分享",
+ "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_stop_server_autostop_timer": "停止接收模式 (剩餘{}秒)",
+ "gui_receive_stop_server_autostop_timer_tooltip": "計數器將在{}停止",
+ "gui_copy_url": "複製地址",
+ "gui_copy_hidservauth": "複製HidServAuth",
"gui_downloads": "",
"gui_no_downloads": "",
- "gui_canceled": "取消",
- "gui_copied_url_title": "",
- "gui_copied_url": "",
- "gui_copied_hidservauth_title": "",
- "gui_copied_hidservauth": "",
- "gui_please_wait": "",
+ "gui_canceled": "已取消",
+ "gui_copied_url_title": "已複製OnionShare地址",
+ "gui_copied_url": "OnionShare地址已複製到剪貼簿",
+ "gui_copied_hidservauth_title": "已複製HidServAuth",
+ "gui_copied_hidservauth": "HidServAuth已複製到剪貼簿",
+ "gui_please_wait": "啟動中...點擊以取消。",
"gui_download_upload_progress_complete": "",
"gui_download_upload_progress_starting": "",
"gui_download_upload_progress_eta": "",
- "version_string": "",
- "gui_quit_title": "",
- "gui_share_quit_warning": "",
- "gui_receive_quit_warning": "",
- "gui_quit_warning_quit": "離開",
- "gui_quit_warning_dont_quit": "",
- "error_rate_limit": "",
- "zip_progress_bar_format": "",
- "error_stealth_not_supported": "",
- "error_ephemeral_not_supported": "",
+ "version_string": "OnionShare {0:s} | https://onionshare.org/",
+ "gui_quit_title": "確定要離開嗎",
+ "gui_share_quit_warning": "仍在傳送檔案,您確定要結束OnionShare嗎?",
+ "gui_receive_quit_warning": "仍在接收檔案,您確定要結束OnionShare嗎?",
+ "gui_quit_warning_quit": "結束",
+ "gui_quit_warning_dont_quit": "取消",
+ "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": "設定",
- "gui_settings_whats_this": "",
- "gui_settings_stealth_option": "",
- "gui_settings_stealth_hidservauth_string": "",
+ "gui_settings_whats_this": "<a href='{0:s}'>這是什麼?</a>",
+ "gui_settings_stealth_option": "使用客戶端認證",
+ "gui_settings_stealth_hidservauth_string": "已經將您的私鑰存起來以便使用,代表您現在可以點選以複製您的HidSerAuth。",
"gui_settings_autoupdate_label": "檢查新版本",
- "gui_settings_autoupdate_option": "",
- "gui_settings_autoupdate_timestamp": "",
- "gui_settings_autoupdate_timestamp_never": "不使用",
- "gui_settings_autoupdate_check_button": "",
+ "gui_settings_autoupdate_option": "當有新版本的時候提醒我",
+ "gui_settings_autoupdate_timestamp": "上一次檢查時間: {}",
+ "gui_settings_autoupdate_timestamp_never": "從未",
+ "gui_settings_autoupdate_check_button": "檢查新版本",
"gui_settings_general_label": "一般設定",
- "gui_settings_sharing_label": "",
- "gui_settings_close_after_first_download_option": "",
- "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": "Password",
- "gui_settings_password_label": "Password",
- "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_sharing_label": "分享設定",
+ "gui_settings_close_after_first_download_option": "當檔案已傳送時停止分享",
+ "gui_settings_connection_type_label": "OnionShare要如何連接到Tor?",
+ "gui_settings_connection_type_bundled_option": "使用OnionShare內建的Tor版本",
+ "gui_settings_connection_type_automatic_option": "嘗試auto-configuration with Tor Browser",
+ "gui_settings_connection_type_control_port_option": "使用control port",
+ "gui_settings_connection_type_socket_file_option": "使用Socket file",
+ "gui_settings_connection_type_test_button": "測試連接到Tor",
+ "gui_settings_control_port_label": "Control端口",
+ "gui_settings_socket_file_label": "Socket file",
+ "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_obfs4_radio_option": "使用內建的obfs4 pluggable transports",
+ "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_meek_lite_expensive_warning": "警告: The meek_lite bridges are very costly for the Tor Project to run.<br><br>Only use them if unable to connect to Tor directly, via obfs4 transports, or other normal bridges.",
+ "gui_settings_tor_bridges_custom_radio_option": "使用自定義的bridges",
+ "gui_settings_tor_bridges_custom_label": "你可以從 <a href=\"https://bridges.torproject.org/options\">https://bridges.torproject.org</a>取得bridges",
+ "gui_settings_tor_bridges_invalid": "您新增的bridges無效。\n請再次檢查他們或新增其他的。",
"gui_settings_button_save": "保存",
- "gui_settings_button_cancel": "",
- "gui_settings_button_help": "協助",
- "gui_settings_shutdown_timeout_checkbox": "",
- "gui_settings_shutdown_timeout": "",
- "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": "",
- "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": "",
- "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_timeout": "",
- "gui_server_timeout_expired": "",
- "share_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_settings_button_cancel": "取消",
+ "gui_settings_button_help": "說明",
+ "gui_settings_autostop_timer_checkbox": "使用自動停止計時器",
+ "gui_settings_autostop_timer": "在這個時間停止分享:",
+ "settings_error_unknown": "無法連接到Tor controller因為您的設定無效。",
+ "settings_error_automatic": "無法連機到Tor controller。Tor Browser(可以從torproject.org取得)是否正在背景運行?",
+ "settings_error_socket_port": "無法在{}:{}連接到Tor controller。",
+ "settings_error_socket_file": "無法使用Socket file {}連接到Tor controller。",
+ "settings_error_auth": "已連接到 {}:{} 但無法驗證。或許這個不是一個Tor controller?",
+ "settings_error_missing_password": "已連接到Tor controller,但是它需要密碼進行驗證。",
+ "settings_error_unreadable_cookie_file": "已連接到Tor controller,但是密碼錯誤,或是您沒有讀取cookie檔案的權限。",
+ "settings_error_bundled_tor_not_supported": "OnionShare附帶的Tor版本並不適用於Windows或macOS上的開發人員模式。",
+ "settings_error_bundled_tor_timeout": "Tor連接超時。您可能沒有連接網路,或是系統時間設定錯誤?",
+ "settings_error_bundled_tor_broken": "OnionShare無法在背景連接到Tor:\n{}",
+ "settings_test_success": "已連接到Tor controller。\n\nTor版本: {}\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": "無法檢查新版本: OnionShare網站提示最新版本無法辨識'{}'…",
+ "update_error_invalid_latest_version": "無法檢查新版本:或許您尚未連接上Tor,或是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_server_started_after_autostop_timer": "自動停止計時器在伺服器啟動前就時間已到。\n請重新分享。",
+ "gui_server_autostop_timer_expired": "自動停止計時器時間已到。\n請更新它來開始分享。",
+ "share_via_onionshare": "使用OnionShare分享",
+ "gui_use_legacy_v2_onions_checkbox": "使用傳統地址",
+ "gui_save_private_key_checkbox": "使用永久地址",
+ "gui_share_url_description": "<b>任何人</b>只要擁有這個地址就可以<b>下載</b>你的檔案經由<b>Tor Browser</b>: <img src='{}' />",
+ "gui_receive_url_description": "<b>任何人</b>只要擁有這個地址就可以<b>上傳</b>檔案到你的電腦經由<b>Tor Browser</b>: <img src='{}' />",
+ "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_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": "{}個已完成",
"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": "",
- "receive_mode_upload_starting": "",
- "receive_mode_received_file": "",
- "gui_mode_share_button": "",
- "gui_mode_receive_button": "",
- "gui_settings_receiving_label": "",
+ "receive_mode_warning": "警告:接收模式將使其他人上傳檔案到您的電腦。有些檔案可能將會在您開啟時控制您的電腦。請只打開您信任的人所傳送的檔案,或是您清楚了解自己在做什麼。",
+ "gui_receive_mode_warning": "警告:接收模式將使其他人上傳檔案到您的電腦。<br><br><b>有些檔案可能將會在您開啟時控制您的電腦。請只打開您信任的人所傳送的檔案,或是您清楚了解自己在做什麼。</b>",
+ "receive_mode_upload_starting": "正在開始上傳總檔案大小{}的檔案",
+ "receive_mode_received_file": "已接收: {}",
+ "gui_mode_share_button": "分享檔案",
+ "gui_mode_receive_button": "接收檔案",
+ "gui_settings_receiving_label": "接收設定",
"gui_settings_downloads_label": "",
"gui_settings_downloads_button": "瀏覽",
"gui_settings_receive_allow_receiver_shutdown_checkbox": "",
- "gui_settings_public_mode_checkbox": "",
+ "gui_settings_public_mode_checkbox": "公開模式",
"systray_close_server_title": "",
"systray_close_server_message": "",
- "systray_page_loaded_title": "",
+ "systray_page_loaded_title": "頁面已載入",
"systray_download_page_loaded_message": "",
"systray_upload_page_loaded_message": "",
"gui_uploads": "",
@@ -179,7 +179,53 @@
"gui_upload_finished_range": "",
"gui_upload_finished": "",
"gui_download_in_progress": "",
- "gui_open_folder_error_nautilus": "",
- "gui_settings_language_label": "",
- "gui_settings_language_changed_notice": ""
+ "gui_open_folder_error_nautilus": "無法開啟資料夾,因為nautilus不可用。檔案在此: {}",
+ "gui_settings_language_label": "語言",
+ "gui_settings_language_changed_notice": "重啟OnionShare以套用語言變更。",
+ "gui_add_files": "新增檔案",
+ "gui_add_folder": "新增資料夾",
+ "gui_settings_onion_label": "Onion設定",
+ "gui_connect_to_tor_for_onion_settings": "連結到Tor來查看onion服務設定",
+ "error_cannot_create_data_dir": "無法建立OnionShare的資料夾: {}",
+ "receive_mode_data_dir": "傳輸給您的檔案將會放在這個資料夾: {}",
+ "gui_settings_data_dir_label": "儲存檔案到",
+ "gui_settings_data_dir_browse_button": "瀏覽",
+ "systray_page_loaded_message": "OnionShare地址已載入",
+ "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_transfer_finished_range": "已傳輸完成 {} - {}",
+ "gui_all_modes_transfer_finished": "已傳輸完成 {}",
+ "gui_all_modes_transfer_canceled_range": "已取消 {} - {}",
+ "gui_all_modes_transfer_canceled": "已取消 {}",
+ "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_timeout_waiting": "等待完成傳送",
+ "gui_receive_mode_no_files": "目前無已接收的檔案",
+ "gui_receive_mode_timeout_waiting": "等待完成接收",
+ "gui_stop_server_autostop_timer_tooltip": "自動停止計時器在 {} 停止",
+ "gui_start_server_autostart_timer_tooltip": "自動開始計時器在 {} 停止",
+ "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_receive_scheduled": "預定…",
+ "gui_share_mode_autostop_timer_waiting": "等待完成傳送",
+ "gui_receive_mode_autostop_timer_waiting": "等待完成接收",
+ "days_first_letter": "天",
+ "hours_first_letter": "時",
+ "minutes_first_letter": "分",
+ "seconds_first_letter": "秒"
}
diff --git a/share/static/css/style.css b/share/static/css/style.css
index 0751d306..e445e5de 100644
--- a/share/static/css/style.css
+++ b/share/static/css/style.css
@@ -176,7 +176,7 @@ ul.flashes {
margin: 0;
padding: 0;
width: 800px;
- max-width: 90%;
+ max-width: 500px;
margin: 0 auto;
}
@@ -184,7 +184,7 @@ ul.flashes li {
margin: 0 0 5px 0;
padding: 5px;
list-style: none;
- text-align: left;
+ text-align: center;
}
li.error {
@@ -224,17 +224,15 @@ li.info {
}
div#noscript {
- border: 1px solid #e55454;
- text-align: left;
- color: #e55454;
+ text-align: center;
+ color: #d709df;
padding: 1em;
line-height: 150%;
- max-width: 900px;
- margin: 100px 2em 0 2em;
+ margin: 0 auto;
}
div#noscript a, div#noscript a:visited {
- color: #e27f7f;
+ color: #d709df;
}
.disable-noscript-xss-wrapper {
diff --git a/share/static/img/warning.png b/share/static/img/warning.png
new file mode 100644
index 00000000..9be8cbaf
--- /dev/null
+++ b/share/static/img/warning.png
Binary files differ
diff --git a/share/static/js/jquery-3.3.1.min.js b/share/static/js/jquery-3.3.1.min.js
deleted file mode 100644
index 4d9b3a25..00000000
--- a/share/static/js/jquery-3.3.1.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B," ")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||"*",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError("Thenable self-resolution");l=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,"ms-").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ee=/[A-Z]/g;function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(ee,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=J.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&w.contains(e.ownerDocument,e)&&"none"===w.css(e,"display")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,"")},u=s(),l=n&&n[3]||(w.cssNumber[t]?"":"px"),c=(w.cssNumber[t]||"px"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=J.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",J.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],"globalEval",!t||J.get(t[n],"globalEval"))}var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&N(this,"input"))return this.click(),!1},_default:function(e){return N(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/<script|<style|<link/i,je=/checked\s*(?:[^=]|=\s*.checked.)/i,qe=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,"script"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||"")&&!J.access(l,"globalEval")&&w.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,""),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,"script")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,"script")).length>0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join("|"),"i");!function(){function t(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i="1%"!==t.top,u=12===n(t.marginLeft),c.style.right="60%",s=36===n(t.right),o=36===n(t.width),c.style.position="absolute",a=36===c.offsetWidth||"absolute",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement("div"),c=r.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Ge=["Webkit","Moz","ms"],Ye=r.createElement("div").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ze(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?("content"===n&&(u-=w.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(u-=w.css(e,"border"+oe[a]+"Width",!0,i))):(u+=w.css(e,"padding"+oe[a],!0,i),"padding"!==n?u+=w.css(e,"border"+oe[a]+"Width",!0,i):s+=w.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,"fxshow");n.queue||(null==(a=w._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,"fx").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,"display")),"none"===(c=w.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===w.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?"hidden"in y&&(g=y.hidden):y=J.access(e,"fxshow",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,"fxshow");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=["*"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&"object"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=J.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each(["toggle","show","hide"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut("show"),slideUp:ut("hide"),slideToggle:ut("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\?(?=&|$)|\?\?/;w.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||w.expando+"_"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Qt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,"$1"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||w.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),"script"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&w.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?w("<div>").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,"position"),f=w(e),p={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=w.css(e,"top"),u=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),"using"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});
diff --git a/share/static/js/jquery-3.4.0.min.js b/share/static/js/jquery-3.4.0.min.js
new file mode 100644
index 00000000..769a1d9a
--- /dev/null
+++ b/share/static/js/jquery-3.4.0.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.4.0 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.0",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},A=k.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&A.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!A.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(N(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.attachShadow&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ae(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ne(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ne(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n=void 0,r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n}else r&&(Q.set(this,i,k.event.trigger(k.extend(r.shift(),k.Event.prototype),r,this)),e.stopImmediatePropagation())}})):k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&N(t,"input")&&void 0===Q.get(t,"click")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&N(t,"input")&&void 0===Q.get(t,"click")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&N(t,"input")&&Q.get(t,"click")||N(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ae),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ne(this,e,t,n,r)},one:function(e,t,n,r){return Ne(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var At=/\[\]$/,Nt=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||At.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(Nt,"\r\n")}}):{name:t.name,value:n.replace(Nt,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=N,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
diff --git a/share/templates/403.html b/share/templates/403.html
index df81f3e7..f3ea4e0e 100644
--- a/share/templates/403.html
+++ b/share/templates/403.html
@@ -1,16 +1,19 @@
<!DOCTYPE html>
<html>
- <head>
- <title>OnionShare: 403 Forbidden</title>
- <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
- <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div class="info-wrapper">
- <div class="info">
- <p><img class="logo" src="/static/img/logo_large.png" title="OnionShare"></p>
- <p class="info-header">You are not allowed to perform that action at this time.</p>
- </div>
- </div>
- </body>
+
+<head>
+ <title>OnionShare: 403 Forbidden</title>
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
+ <link rel="stylesheet" rel="subresource" type="text/css" href="/static/css/style.css" media="all">
+</head>
+
+<body>
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="/static/img/logo_large.png" title="OnionShare"></p>
+ <p class="info-header">You are not allowed to perform that action at this time.</p>
+ </div>
+ </div>
+</body>
+
</html>
diff --git a/share/templates/404.html b/share/templates/404.html
index 264ca517..1c5d7d2d 100644
--- a/share/templates/404.html
+++ b/share/templates/404.html
@@ -1,16 +1,19 @@
<!DOCTYPE html>
<html>
- <head>
- <title>OnionShare: 404 Not Found</title>
- <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
- <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div class="info-wrapper">
- <div class="info">
- <p><img class="logo" src="/static/img/logo_large.png" title="OnionShare"></p>
- <p class="info-header">404 Not Found</p>
- </div>
- </div>
- </body>
+
+<head>
+ <title>OnionShare: 404 Not Found</title>
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="/static/css/style.css" media="all">
+</head>
+
+<body>
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="/static/img/logo_large.png" title="OnionShare"></p>
+ <p class="info-header">404 Not Found</p>
+ </div>
+ </div>
+</body>
+
</html>
diff --git a/share/templates/denied.html b/share/templates/denied.html
index 5d411d62..94fb379b 100644
--- a/share/templates/denied.html
+++ b/share/templates/denied.html
@@ -1,10 +1,13 @@
<!DOCTYPE html>
<html>
- <head>
- <title>OnionShare</title>
- <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
- </head>
- <body>
- <p>OnionShare download in progress</p>
- </body>
+
+<head>
+ <title>OnionShare</title>
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
+</head>
+
+<body>
+ <p>OnionShare download in progress</p>
+</body>
+
</html>
diff --git a/share/templates/receive.html b/share/templates/receive.html
index a557a967..4f207a03 100644
--- a/share/templates/receive.html
+++ b/share/templates/receive.html
@@ -2,8 +2,8 @@
<html>
<head>
<title>OnionShare</title>
- <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
- <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="/static/css/style.css" media="all">
</head>
<body>
@@ -13,16 +13,24 @@
</header>
<div class="upload-wrapper">
+ <!--
+ We are not using a <noscript> tag because it only works when the security slider is set to
+ Safest, not Safer: https://trac.torproject.org/projects/tor/ticket/29506
+ -->
+ <div id="noscript">
+ <p>
+ <img src="/static/img/warning.png" title="Warning" /><strong>Warning:</strong> Due to a bug in Tor Browser and Firefox, uploads
+ sometimes never finish. To upload reliably, either set your Tor Browser
+ <a rel="noreferrer" target="_blank" href="https://tb-manual.torproject.org/en-US/security-slider/">security slider</a>
+ to Standard or
+ <a target="_blank" href="/noscript-xss-instructions">turn off your Tor Browser's NoScript XSS setting</a>.</p>
+ </div>
+
<p><img class="logo" src="/static/img/logo_large.png" title="OnionShare"></p>
<p class="upload-header">Send Files</p>
<p class="upload-description">Select the files you want to send, then click "Send Files"...</p>
- <form id="send" method="post" enctype="multipart/form-data" action="{{ upload_action }}">
- <p><input type="file" id="file-select" name="file[]" multiple /></p>
- <p><button type="submit" id="send-button" class="button">Send Files</button></p>
- </form>
-
<div id="uploads"></div>
<div>
@@ -37,22 +45,14 @@
</ul>
</div>
- <!--
- We are not using a <noscript> tag because it only works when the security slider is set to
- Safest, not Safer: https://trac.torproject.org/projects/tor/ticket/29506
- -->
- <div id="noscript">
- <p>
- <strong>Warning:</strong> Due to a bug in Tor Browser and Firefox, uploads
- sometimes never finish. To upload reliably, either set your Tor Browser
- <a rel="noreferrer" target="_blank" href="https://tb-manual.torproject.org/en-US/security-slider/">security slider</a>
- to Standard or
- <a target="_blank" href="/noscript-xss-instructions">turn off your Tor Browser's NoScript XSS setting</a>.</p>
- </div>
- <script src="/static/js/receive-noscript.js"></script>
+ <form id="send" method="post" enctype="multipart/form-data" action="{{ upload_action }}">
+ <p><input type="file" id="file-select" name="file[]" multiple /></p>
+ <p><button type="submit" id="send-button" class="button">Send Files</button></p>
+ </form>
</div>
- <script src="/static/js/jquery-3.3.1.min.js"></script>
- <script src="/static/js/receive.js"></script>
+ <script src="/static/js/receive-noscript.js"></script>
+ <script src="/static/js/jquery-3.4.0.min.js"></script>
+ <script async src="/static/js/receive.js"></script>
</body>
</html>
diff --git a/share/templates/receive_noscript_xss.html b/share/templates/receive_noscript_xss.html
index bf846b03..bce78524 100644
--- a/share/templates/receive_noscript_xss.html
+++ b/share/templates/receive_noscript_xss.html
@@ -2,8 +2,8 @@
<html>
<head>
<title>OnionShare</title>
- <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
- <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="/static/css/style.css" media="all">
</head>
<body>
diff --git a/share/templates/send.html b/share/templates/send.html
index e7e1fde0..2a56829a 100644
--- a/share/templates/send.html
+++ b/share/templates/send.html
@@ -1,56 +1,59 @@
<!DOCTYPE html>
<html>
- <head>
- <title>OnionShare</title>
- <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
- <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
- <meta name="onionshare-filename" content="{{ filename }}">
- <meta name="onionshare-filesize" content="{{ filesize }}">
- </head>
- <body>
- <header class="clearfix">
- <div class="right">
- <ul>
- <li>Total size: <strong>{{ filesize_human }}</strong> {% if is_zipped %} (compressed){% endif %}</li>
- {% if slug %}
- <li><a class="button" href='/{{ slug }}/download'>Download Files</a></li>
- {% else %}
- <li><a class="button" href='/download'>Download Files</a></li>
- {% endif %}
- </ul>
- </div>
- <img class="logo" src="/static/img/logo.png" title="OnionShare">
- <h1>OnionShare</h1>
- </header>
+<head>
+ <title>OnionShare</title>
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="/static/css/style.css" media="all">
+ <meta name="onionshare-filename" content="{{ filename }}">
+ <meta name="onionshare-filesize" content="{{ filesize }}">
+</head>
+
+<body>
+
+ <header class="clearfix">
+ <div class="right">
+ <ul>
+ <li>Total size: <strong>{{ filesize_human }}</strong> {% if is_zipped %} (compressed){% endif %}</li>
+ {% if slug %}
+ <li><a class="button" href='/{{ slug }}/download'>Download Files</a></li>
+ {% else %}
+ <li><a class="button" href='/download'>Download Files</a></li>
+ {% endif %}
+ </ul>
+ </div>
+ <img class="logo" src="/static/img/logo.png" title="OnionShare">
+ <h1>OnionShare</h1>
+ </header>
+
+ <table class="file-list" id="file-list">
+ <tr>
+ <th id="filename-header">Filename</th>
+ <th id="size-header">Size</th>
+ <th></th>
+ </tr>
+ {% for info in file_info.dirs %}
+ <tr>
+ <td>
+ <img width="30" height="30" title="" alt="" src="/static/img/web_folder.png" />
+ {{ info.basename }}
+ </td>
+ <td>{{ info.size_human }}</td>
+ <td></td>
+ </tr>
+ {% endfor %}
+ {% for info in file_info.files %}
+ <tr>
+ <td>
+ <img width="30" height="30" title="" alt="" src="/static/img/web_file.png" />
+ {{ info.basename }}
+ </td>
+ <td>{{ info.size_human }}</td>
+ <td></td>
+ </tr>
+ {% endfor %}
+ </table>
+ <script async src="/static/js/send.js" charset="utf-8"></script>
+</body>
- <table class="file-list" id="file-list">
- <tr>
- <th id="filename-header">Filename</th>
- <th id="size-header">Size</th>
- <th></th>
- </tr>
- {% for info in file_info.dirs %}
- <tr>
- <td>
- <img width="30" height="30" title="" alt="" src="/static/img/web_folder.png" />
- {{ info.basename }}
- </td>
- <td>{{ info.size_human }}</td>
- <td></td>
- </tr>
- {% endfor %}
- {% for info in file_info.files %}
- <tr>
- <td>
- <img width="30" height="30" title="" alt="" src="/static/img/web_file.png" />
- {{ info.basename }}
- </td>
- <td>{{ info.size_human }}</td>
- <td></td>
- </tr>
- {% endfor %}
- </table>
- <script src="/static/js/send.js"></script>
- </body>
</html>
diff --git a/share/templates/thankyou.html b/share/templates/thankyou.html
index 64c8b369..c4b39cde 100644
--- a/share/templates/thankyou.html
+++ b/share/templates/thankyou.html
@@ -1,22 +1,25 @@
<!DOCTYPE html>
<html>
- <head>
- <title>OnionShare is closed</title>
- <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon" />
- <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <header class="clearfix">
- <img class="logo" src="/static/img/logo.png" title="OnionShare">
- <h1>OnionShare</h1>
- </header>
- <div class="info-wrapper">
- <div class="info">
- <p><img class="logo" src="/static/img/logo_large.png" title="OnionShare"></p>
- <p class="info-header">Thank you for using OnionShare</p>
- <p class="info-description">You may now close this window.</p>
- </div>
- </div>
- </body>
+<head>
+ <title>OnionShare is closed</title>
+ <link href="/static/img/favicon.ico" rel="icon" type="image/x-icon">
+ <link rel="stylesheet" rel="subresource" type="text/css" href="/static/css/style.css" media="all">
+</head>
+
+<body>
+ <header class="clearfix">
+ <img class="logo" src="/static/img/logo.png" title="OnionShare">
+ <h1>OnionShare</h1>
+ </header>
+
+ <div class="info-wrapper">
+ <div class="info">
+ <p><img class="logo" src="/static/img/logo_large.png" title="OnionShare"></p>
+ <p class="info-header">Thank you for using OnionShare</p>
+ <p class="info-description">You may now close this window.</p>
+ </div>
+ </div>
+</body>
+
</html>
diff --git a/share/version.txt b/share/version.txt
index cd5ac039..879b416e 100644
--- a/share/version.txt
+++ b/share/version.txt
@@ -1 +1 @@
-2.0
+2.1
diff --git a/stdeb.cfg b/stdeb.cfg
index de6c52c2..0adbac43 100644
--- a/stdeb.cfg
+++ b/stdeb.cfg
@@ -1,6 +1,6 @@
[DEFAULT]
Package3: onionshare
-Depends3: python3, python3-flask, python3-stem, python3-pyqt5, python3-crypto, python3-socks, python3-distutils, python-nautilus, tor, obfs4proxy
-Build-Depends: python3, python3-pytest, python3-flask, python3-stem, python3-pyqt5, python3-crypto, python3-socks, python3-distutils, python-nautilus, tor, obfs4proxy
-Suite: bionic
+Depends3: python3, python3-flask, python3-stem, python3-pyqt5, python3-crypto, python3-socks, python-nautilus, tor, obfs4proxy
+Build-Depends: python3, python3-pytest, python3-flask, python3-stem, python3-pyqt5, python3-crypto, python3-socks, python3-requests, python-nautilus, tor, obfs4proxy
+Suite: cosmic
X-Python3-Version: >= 3.5.3
diff --git a/tests/GuiBaseTest.py b/tests/GuiBaseTest.py
index e4b3d4c9..d3fc9945 100644
--- a/tests/GuiBaseTest.py
+++ b/tests/GuiBaseTest.py
@@ -172,6 +172,9 @@ class GuiBaseTest(object):
'''Test that the Server Status indicator shows we are Starting'''
self.assertEqual(mode.server_status_label.text(), strings._('gui_status_indicator_share_working'))
+ def server_status_indicator_says_scheduled(self, mode):
+ '''Test that the Server Status indicator shows we are Scheduled'''
+ self.assertEqual(mode.server_status_label.text(), strings._('gui_status_indicator_share_scheduled'))
def server_is_started(self, mode, startup_time=2000):
'''Test that the server has started'''
@@ -291,13 +294,12 @@ class GuiBaseTest(object):
def set_timeout(self, mode, timeout):
'''Test that the timeout can be set'''
timer = QtCore.QDateTime.currentDateTime().addSecs(timeout)
- mode.server_status.shutdown_timeout.setDateTime(timer)
- self.assertTrue(mode.server_status.shutdown_timeout.dateTime(), timer)
+ mode.server_status.autostop_timer_widget.setDateTime(timer)
+ self.assertTrue(mode.server_status.autostop_timer_widget.dateTime(), timer)
-
- def timeout_widget_hidden(self, mode):
- '''Test that the timeout widget is hidden when share has started'''
- self.assertFalse(mode.server_status.shutdown_timeout_container.isVisible())
+ def autostop_timer_widget_hidden(self, mode):
+ '''Test that the auto-stop timer widget is hidden when share has started'''
+ self.assertFalse(mode.server_status.autostop_timer_container.isVisible())
def server_timed_out(self, mode, wait):
@@ -306,6 +308,37 @@ class GuiBaseTest(object):
# We should have timed out now
self.assertEqual(mode.server_status.status, 0)
+ # Auto-start timer tests
+ def set_autostart_timer(self, mode, timer):
+ '''Test that the timer can be set'''
+ schedule = QtCore.QDateTime.currentDateTime().addSecs(timer)
+ mode.server_status.autostart_timer_widget.setDateTime(schedule)
+ self.assertTrue(mode.server_status.autostart_timer_widget.dateTime(), schedule)
+
+ def autostart_timer_widget_hidden(self, mode):
+ '''Test that the auto-start timer widget is hidden when share has started'''
+ self.assertFalse(mode.server_status.autostart_timer_container.isVisible())
+
+ def scheduled_service_started(self, mode, wait):
+ '''Test that the server has timed out after the timer ran out'''
+ QtTest.QTest.qWait(wait)
+ # We should have started now
+ self.assertEqual(mode.server_status.status, 2)
+
+ def cancel_the_share(self, mode):
+ '''Test that we can cancel a share before it's started up '''
+ self.server_working_on_start_button_pressed(mode)
+ self.server_status_indicator_says_scheduled(mode)
+ self.add_delete_buttons_hidden()
+ self.settings_button_is_hidden()
+ self.set_autostart_timer(mode, 10)
+ QtTest.QTest.mousePress(mode.server_status.server_button, QtCore.Qt.LeftButton)
+ QtTest.QTest.qWait(2000)
+ QtTest.QTest.mouseRelease(mode.server_status.server_button, QtCore.Qt.LeftButton)
+ self.assertEqual(mode.server_status.status, 0)
+ self.server_is_stopped(mode, False)
+ self.web_server_is_stopped()
+
# Hack to close an Alert dialog that would otherwise block tests
def accept_dialog(self):
window = self.gui.qtapp.activeWindow()
diff --git a/tests/GuiReceiveTest.py b/tests/GuiReceiveTest.py
index 8a03283e..40c3de95 100644
--- a/tests/GuiReceiveTest.py
+++ b/tests/GuiReceiveTest.py
@@ -5,7 +5,7 @@ from PyQt5 import QtCore, QtTest
from .GuiBaseTest import GuiBaseTest
class GuiReceiveTest(GuiBaseTest):
- def upload_file(self, public_mode, file_to_upload, expected_basename):
+ def upload_file(self, public_mode, file_to_upload, expected_basename, identical_files_at_once=False):
'''Test that we can upload the file'''
files = {'file[]': open(file_to_upload, 'rb')}
if not public_mode:
@@ -13,6 +13,9 @@ class GuiReceiveTest(GuiBaseTest):
else:
path = 'http://127.0.0.1:{}/upload'.format(self.gui.app.port)
response = requests.post(path, files=files)
+ if identical_files_at_once:
+ # Send a duplicate upload to test for collisions
+ response = requests.post(path, files=files)
QtTest.QTest.qWait(2000)
# Make sure the file is within the last 10 seconds worth of filenames
@@ -20,7 +23,10 @@ class GuiReceiveTest(GuiBaseTest):
now = datetime.now()
for i in range(10):
date_dir = now.strftime("%Y-%m-%d")
- time_dir = now.strftime("%H.%M.%S")
+ if identical_files_at_once:
+ time_dir = now.strftime("%H.%M.%S-1")
+ else:
+ time_dir = now.strftime("%H.%M.%S")
receive_mode_dir = os.path.join(self.gui.common.settings.get('data_dir'), date_dir, time_dir)
expected_filename = os.path.join(receive_mode_dir, expected_basename)
if os.path.exists(expected_filename):
@@ -74,18 +80,6 @@ class GuiReceiveTest(GuiBaseTest):
self.assertEqual(mode.history.completed_count, before_completed_count)
self.assertEqual(len(mode.history.item_list.items), before_number_of_history_items)
- def run_receive_mode_sender_closed_tests(self, public_mode):
- '''Test that the share can be stopped by the sender in receive mode'''
- if not public_mode:
- path = 'http://127.0.0.1:{}/{}/close'.format(self.gui.app.port, self.gui.receive_mode.web.slug)
- else:
- path = 'http://127.0.0.1:{}/close'.format(self.gui.app.port)
- response = requests.post(path)
- self.server_is_stopped(self.gui.receive_mode, False)
- self.web_server_is_stopped()
- self.server_status_indicator_says_closed(self.gui.receive_mode, False)
-
-
# 'Grouped' tests follow from here
def run_all_receive_mode_setup_tests(self, public_mode):
@@ -119,6 +113,9 @@ class GuiReceiveTest(GuiBaseTest):
self.counter_incremented(self.gui.receive_mode, 3)
self.upload_file(public_mode, '/tmp/testdir/test', 'test')
self.counter_incremented(self.gui.receive_mode, 4)
+ # Test uploading the same file twice at the same time, and make sure no collisions
+ self.upload_file(public_mode, '/tmp/test.txt', 'test.txt', True)
+ self.counter_incremented(self.gui.receive_mode, 6)
self.uploading_zero_files_shouldnt_change_ui(self.gui.receive_mode, public_mode)
self.history_indicator(self.gui.receive_mode, public_mode)
self.server_is_stopped(self.gui.receive_mode, False)
@@ -142,6 +139,6 @@ class GuiReceiveTest(GuiBaseTest):
"""Auto-stop timer tests in receive mode"""
self.run_all_receive_mode_setup_tests(public_mode)
self.set_timeout(self.gui.receive_mode, 5)
- self.timeout_widget_hidden(self.gui.receive_mode)
+ self.autostop_timer_widget_hidden(self.gui.receive_mode)
self.server_timed_out(self.gui.receive_mode, 15000)
self.web_server_is_stopped()
diff --git a/tests/GuiShareTest.py b/tests/GuiShareTest.py
index 716bab73..29661712 100644
--- a/tests/GuiShareTest.py
+++ b/tests/GuiShareTest.py
@@ -191,10 +191,29 @@ class GuiShareTest(GuiBaseTest):
self.run_all_share_mode_setup_tests()
self.set_timeout(self.gui.share_mode, 5)
self.run_all_share_mode_started_tests(public_mode)
- self.timeout_widget_hidden(self.gui.share_mode)
+ self.autostop_timer_widget_hidden(self.gui.share_mode)
self.server_timed_out(self.gui.share_mode, 10000)
self.web_server_is_stopped()
+ def run_all_share_mode_autostart_timer_tests(self, public_mode):
+ """Auto-start timer tests in share mode"""
+ self.run_all_share_mode_setup_tests()
+ self.set_autostart_timer(self.gui.share_mode, 5)
+ self.server_working_on_start_button_pressed(self.gui.share_mode)
+ self.autostart_timer_widget_hidden(self.gui.share_mode)
+ self.server_status_indicator_says_scheduled(self.gui.share_mode)
+ self.web_server_is_stopped()
+ self.scheduled_service_started(self.gui.share_mode, 7000)
+ self.web_server_is_running()
+
+ def run_all_share_mode_autostop_autostart_mismatch_tests(self, public_mode):
+ """Auto-stop timer tests in share mode"""
+ self.run_all_share_mode_setup_tests()
+ self.set_autostart_timer(self.gui.share_mode, 15)
+ self.set_timeout(self.gui.share_mode, 5)
+ QtCore.QTimer.singleShot(4000, self.accept_dialog)
+ QtTest.QTest.mouseClick(self.gui.share_mode.server_status.server_button, QtCore.Qt.LeftButton)
+ self.server_is_stopped(self.gui.share_mode, False)
def run_all_share_mode_unreadable_file_tests(self):
'''Attempt to share an unreadable file'''
diff --git a/tests/SettingsGuiBaseTest.py b/tests/SettingsGuiBaseTest.py
index 844a0c86..35bdd9c6 100644
--- a/tests/SettingsGuiBaseTest.py
+++ b/tests/SettingsGuiBaseTest.py
@@ -77,11 +77,11 @@ class SettingsGuiBaseTest(object):
QtTest.QTest.mouseClick(self.gui.public_mode_checkbox, QtCore.Qt.LeftButton, pos=QtCore.QPoint(2,self.gui.public_mode_checkbox.height()/2))
self.assertTrue(self.gui.public_mode_checkbox.isChecked())
- # shutdown timer is off
- self.assertFalse(self.gui.shutdown_timeout_checkbox.isChecked())
- # enable shutdown timer
- QtTest.QTest.mouseClick(self.gui.shutdown_timeout_checkbox, QtCore.Qt.LeftButton, pos=QtCore.QPoint(2,self.gui.shutdown_timeout_checkbox.height()/2))
- self.assertTrue(self.gui.shutdown_timeout_checkbox.isChecked())
+ # autostop timer is off
+ self.assertFalse(self.gui.autostop_timer_checkbox.isChecked())
+ # enable autostop timer
+ QtTest.QTest.mouseClick(self.gui.autostop_timer_checkbox, QtCore.Qt.LeftButton, pos=QtCore.QPoint(2,self.gui.autostop_timer_checkbox.height()/2))
+ self.assertTrue(self.gui.autostop_timer_checkbox.isChecked())
# legacy mode checkbox and related widgets
if self.gui.onion.is_authenticated():
@@ -222,7 +222,7 @@ class SettingsGuiBaseTest(object):
data = json.load(f)
self.assertTrue(data["public_mode"])
- self.assertTrue(data["shutdown_timeout"])
+ self.assertTrue(data["autostop_timer"])
if self.gui.onion.is_authenticated():
if self.gui.onion.supports_v3_onions:
diff --git a/tests/TorGuiBaseTest.py b/tests/TorGuiBaseTest.py
index e437ac93..8bd963bd 100644
--- a/tests/TorGuiBaseTest.py
+++ b/tests/TorGuiBaseTest.py
@@ -140,19 +140,6 @@ class TorGuiBaseTest(GuiBaseTest):
else:
self.assertEqual(clipboard.text(), 'http://{}/{}'.format(self.gui.app.onion_host, mode.server_status.web.slug))
- def cancel_the_share(self, mode):
- '''Test that we can cancel this share before it's started up '''
- self.server_working_on_start_button_pressed(self.gui.share_mode)
- self.server_status_indicator_says_starting(self.gui.share_mode)
- self.add_delete_buttons_hidden()
- self.settings_button_is_hidden()
- QtTest.QTest.mousePress(mode.server_status.server_button, QtCore.Qt.LeftButton)
- QtTest.QTest.qWait(1000)
- QtTest.QTest.mouseRelease(mode.server_status.server_button, QtCore.Qt.LeftButton)
- self.assertEqual(mode.server_status.status, 0)
- self.server_is_stopped(self.gui.share_mode, False)
- self.web_server_is_stopped()
-
# Stealth tests
def copy_have_hidserv_auth_button(self, mode):
diff --git a/tests/TorGuiShareTest.py b/tests/TorGuiShareTest.py
index 53641dce..36efacd1 100644
--- a/tests/TorGuiShareTest.py
+++ b/tests/TorGuiShareTest.py
@@ -89,7 +89,7 @@ class TorGuiShareTest(TorGuiBaseTest, GuiShareTest):
self.run_all_share_mode_setup_tests()
self.set_timeout(self.gui.share_mode, 120)
self.run_all_share_mode_started_tests(public_mode)
- self.timeout_widget_hidden(self.gui.share_mode)
+ self.autostop_timer_widget_hidden(self.gui.share_mode)
self.server_timed_out(self.gui.share_mode, 125000)
self.web_server_is_stopped()
diff --git a/tests/local_onionshare_404_public_mode_skips_ratelimit_test.py b/tests/local_onionshare_404_public_mode_skips_ratelimit_test.py
index ebb524c2..4fad5532 100644
--- a/tests/local_onionshare_404_public_mode_skips_ratelimit_test.py
+++ b/tests/local_onionshare_404_public_mode_skips_ratelimit_test.py
@@ -18,6 +18,7 @@ class Local404PublicModeRateLimitTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(True, True)
diff --git a/tests/local_onionshare_404_triggers_ratelimit_test.py b/tests/local_onionshare_404_triggers_ratelimit_test.py
index 8ed0777a..49be0f5b 100644
--- a/tests/local_onionshare_404_triggers_ratelimit_test.py
+++ b/tests/local_onionshare_404_triggers_ratelimit_test.py
@@ -17,6 +17,7 @@ class Local404RateLimitTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, True)
diff --git a/tests/local_onionshare_quitting_during_share_prompts_warning_test.py b/tests/local_onionshare_quitting_during_share_prompts_warning_test.py
index e57167c8..e43c88ba 100644
--- a/tests/local_onionshare_quitting_during_share_prompts_warning_test.py
+++ b/tests/local_onionshare_quitting_during_share_prompts_warning_test.py
@@ -18,6 +18,7 @@ class LocalQuittingDuringSharePromptsWarningTest(unittest.TestCase, GuiShareTest
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, True)
diff --git a/tests/local_onionshare_receive_mode_sender_closed_test.py b/tests/local_onionshare_receive_mode_sender_closed_test.py
deleted file mode 100644
index bfb9499a..00000000
--- a/tests/local_onionshare_receive_mode_sender_closed_test.py
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env python3
-import pytest
-import unittest
-
-from .GuiReceiveTest import GuiReceiveTest
-
-class LocalReceiveModeSenderClosedTest(unittest.TestCase, GuiReceiveTest):
- @classmethod
- def setUpClass(cls):
- test_settings = {
- "receive_allow_receiver_shutdown": True
- }
- cls.gui = GuiReceiveTest.set_up(test_settings)
-
- @classmethod
- def tearDownClass(cls):
- GuiReceiveTest.tear_down()
-
- @pytest.mark.gui
- def test_gui(self):
- self.run_all_common_setup_tests()
- self.run_all_receive_mode_tests(False, True)
- self.run_receive_mode_sender_closed_tests(False)
-
-if __name__ == "__main__":
- unittest.main()
diff --git a/tests/local_onionshare_receive_mode_timer_test.py b/tests/local_onionshare_receive_mode_timer_test.py
index 0acaa4a9..4cde86c1 100644
--- a/tests/local_onionshare_receive_mode_timer_test.py
+++ b/tests/local_onionshare_receive_mode_timer_test.py
@@ -9,7 +9,7 @@ class LocalReceiveModeTimerTest(unittest.TestCase, GuiReceiveTest):
def setUpClass(cls):
test_settings = {
"public_mode": False,
- "shutdown_timeout": True,
+ "autostop_timer": True,
}
cls.gui = GuiReceiveTest.set_up(test_settings)
@@ -18,6 +18,7 @@ class LocalReceiveModeTimerTest(unittest.TestCase, GuiReceiveTest):
GuiReceiveTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_receive_mode_timer_tests(False)
diff --git a/tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py b/tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py
index a1dcd679..5737bae3 100644
--- a/tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py
+++ b/tests/local_onionshare_receive_mode_upload_non_writable_dir_test.py
@@ -17,6 +17,7 @@ class LocalReceiveModeUnwritableTest(unittest.TestCase, GuiReceiveTest):
GuiReceiveTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_receive_mode_unwritable_dir_tests(False, True)
diff --git a/tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py b/tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py
index 529e0c87..e6024352 100644
--- a/tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py
+++ b/tests/local_onionshare_receive_mode_upload_public_mode_non_writable_dir_test.py
@@ -18,6 +18,7 @@ class LocalReceivePublicModeUnwritableTest(unittest.TestCase, GuiReceiveTest):
GuiReceiveTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_receive_mode_unwritable_dir_tests(True, True)
diff --git a/tests/local_onionshare_receive_mode_upload_public_mode_test.py b/tests/local_onionshare_receive_mode_upload_public_mode_test.py
index f8bd38bd..885ae4fe 100644
--- a/tests/local_onionshare_receive_mode_upload_public_mode_test.py
+++ b/tests/local_onionshare_receive_mode_upload_public_mode_test.py
@@ -18,6 +18,7 @@ class LocalReceiveModePublicModeTest(unittest.TestCase, GuiReceiveTest):
GuiReceiveTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_receive_mode_tests(True, True)
diff --git a/tests/local_onionshare_receive_mode_upload_test.py b/tests/local_onionshare_receive_mode_upload_test.py
index 362e3b85..3d23730c 100644
--- a/tests/local_onionshare_receive_mode_upload_test.py
+++ b/tests/local_onionshare_receive_mode_upload_test.py
@@ -17,6 +17,7 @@ class LocalReceiveModeTest(unittest.TestCase, GuiReceiveTest):
GuiReceiveTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_receive_mode_tests(False, True)
diff --git a/tests/local_onionshare_settings_dialog_legacy_tor_test.py b/tests/local_onionshare_settings_dialog_legacy_tor_test.py
index f32023fe..54653c1b 100644
--- a/tests/local_onionshare_settings_dialog_legacy_tor_test.py
+++ b/tests/local_onionshare_settings_dialog_legacy_tor_test.py
@@ -16,6 +16,7 @@ class SettingsGuiTest(unittest.TestCase, SettingsGuiBaseTest):
SettingsGuiBaseTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui_legacy_tor(self):
self.gui.onion = OnionStub(True, False)
self.gui.reload_settings()
diff --git a/tests/local_onionshare_settings_dialog_no_tor_test.py b/tests/local_onionshare_settings_dialog_no_tor_test.py
index b34cbff3..06e3cc9e 100644
--- a/tests/local_onionshare_settings_dialog_no_tor_test.py
+++ b/tests/local_onionshare_settings_dialog_no_tor_test.py
@@ -16,6 +16,7 @@ class SettingsGuiTest(unittest.TestCase, SettingsGuiBaseTest):
SettingsGuiBaseTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui_no_tor(self):
self.gui.onion = OnionStub(False, False)
self.gui.reload_settings()
diff --git a/tests/local_onionshare_settings_dialog_v3_tor_test.py b/tests/local_onionshare_settings_dialog_v3_tor_test.py
index 1dd17c0f..88a0438e 100644
--- a/tests/local_onionshare_settings_dialog_v3_tor_test.py
+++ b/tests/local_onionshare_settings_dialog_v3_tor_test.py
@@ -16,6 +16,7 @@ class SettingsGuiTest(unittest.TestCase, SettingsGuiBaseTest):
SettingsGuiBaseTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui_v3_tor(self):
self.gui.onion = OnionStub(True, True)
self.gui.reload_settings()
diff --git a/tests/local_onionshare_share_mode_autostart_and_autostop_timer_mismatch_test.py b/tests/local_onionshare_share_mode_autostart_and_autostop_timer_mismatch_test.py
new file mode 100644
index 00000000..0bb3bfa3
--- /dev/null
+++ b/tests/local_onionshare_share_mode_autostart_and_autostop_timer_mismatch_test.py
@@ -0,0 +1,28 @@
+#!/usr/bin/env python3
+import pytest
+import unittest
+
+from .GuiShareTest import GuiShareTest
+
+class LocalShareModeAutoStartTimerTest(unittest.TestCase, GuiShareTest):
+ @classmethod
+ def setUpClass(cls):
+ test_settings = {
+ "public_mode": False,
+ "autostart_timer": True,
+ "autostop_timer": True,
+ }
+ cls.gui = GuiShareTest.set_up(test_settings)
+
+ @classmethod
+ def tearDownClass(cls):
+ GuiShareTest.tear_down()
+
+ @pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
+ def test_gui(self):
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_autostop_autostart_mismatch_tests(False)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/local_onionshare_share_mode_autostart_timer_test.py b/tests/local_onionshare_share_mode_autostart_timer_test.py
new file mode 100644
index 00000000..4fd5f649
--- /dev/null
+++ b/tests/local_onionshare_share_mode_autostart_timer_test.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+import pytest
+import unittest
+
+from .GuiShareTest import GuiShareTest
+
+class LocalShareModeAutoStartTimerTest(unittest.TestCase, GuiShareTest):
+ @classmethod
+ def setUpClass(cls):
+ test_settings = {
+ "public_mode": False,
+ "autostart_timer": True,
+ }
+ cls.gui = GuiShareTest.set_up(test_settings)
+
+ @classmethod
+ def tearDownClass(cls):
+ GuiShareTest.tear_down()
+
+ @pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
+ def test_gui(self):
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_autostart_timer_tests(False)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/local_onionshare_share_mode_autostart_timer_too_short_test.py b/tests/local_onionshare_share_mode_autostart_timer_too_short_test.py
new file mode 100644
index 00000000..d8e82aed
--- /dev/null
+++ b/tests/local_onionshare_share_mode_autostart_timer_too_short_test.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+import pytest
+import unittest
+from PyQt5 import QtCore, QtTest
+
+from .GuiShareTest import GuiShareTest
+
+class LocalShareModeAutoStartTimerTooShortTest(unittest.TestCase, GuiShareTest):
+ @classmethod
+ def setUpClass(cls):
+ test_settings = {
+ "public_mode": False,
+ "autostart_timer": True,
+ }
+ cls.gui = GuiShareTest.set_up(test_settings)
+
+ @classmethod
+ def tearDownClass(cls):
+ GuiShareTest.tear_down()
+
+ @pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
+ def test_gui(self):
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests()
+ # Set a low timeout
+ self.set_autostart_timer(self.gui.share_mode, 2)
+ QtTest.QTest.qWait(3000)
+ QtCore.QTimer.singleShot(4000, self.accept_dialog)
+ QtTest.QTest.mouseClick(self.gui.share_mode.server_status.server_button, QtCore.Qt.LeftButton)
+ self.assertEqual(self.gui.share_mode.server_status.status, 0)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/local_onionshare_share_mode_cancel_share_test.py b/tests/local_onionshare_share_mode_cancel_share_test.py
new file mode 100644
index 00000000..5b526999
--- /dev/null
+++ b/tests/local_onionshare_share_mode_cancel_share_test.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+import pytest
+import unittest
+
+from .GuiShareTest import GuiShareTest
+
+class LocalShareModeCancelTest(unittest.TestCase, GuiShareTest):
+ @classmethod
+ def setUpClass(cls):
+ test_settings = {
+ "autostart_timer": True,
+ }
+ cls.gui = GuiShareTest.set_up(test_settings)
+
+ @classmethod
+ def tearDownClass(cls):
+ GuiShareTest.tear_down()
+
+ @pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
+ def test_gui(self):
+ self.run_all_common_setup_tests()
+ self.run_all_share_mode_setup_tests()
+ self.cancel_the_share(self.gui.share_mode)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/local_onionshare_share_mode_download_public_mode_test.py b/tests/local_onionshare_share_mode_download_public_mode_test.py
index f9a9dc4c..b7ff336c 100644
--- a/tests/local_onionshare_share_mode_download_public_mode_test.py
+++ b/tests/local_onionshare_share_mode_download_public_mode_test.py
@@ -17,6 +17,7 @@ class LocalShareModePublicModeTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(True, False)
diff --git a/tests/local_onionshare_share_mode_download_stay_open_test.py b/tests/local_onionshare_share_mode_download_stay_open_test.py
index 65304924..50d82326 100644
--- a/tests/local_onionshare_share_mode_download_stay_open_test.py
+++ b/tests/local_onionshare_share_mode_download_stay_open_test.py
@@ -17,6 +17,7 @@ class LocalShareModeStayOpenTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, True)
diff --git a/tests/local_onionshare_share_mode_download_test.py b/tests/local_onionshare_share_mode_download_test.py
index ea16683e..387d63c1 100644
--- a/tests/local_onionshare_share_mode_download_test.py
+++ b/tests/local_onionshare_share_mode_download_test.py
@@ -16,6 +16,7 @@ class LocalShareModeTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, False)
diff --git a/tests/local_onionshare_share_mode_large_download_test.py b/tests/local_onionshare_share_mode_large_download_test.py
index 7d0595a2..5717a2d8 100644
--- a/tests/local_onionshare_share_mode_large_download_test.py
+++ b/tests/local_onionshare_share_mode_large_download_test.py
@@ -16,6 +16,7 @@ class LocalShareModeLargeDownloadTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_large_file_tests(False, True)
diff --git a/tests/local_onionshare_share_mode_slug_persistent_test.py b/tests/local_onionshare_share_mode_slug_persistent_test.py
index 7254f3ff..58e1cfeb 100644
--- a/tests/local_onionshare_share_mode_slug_persistent_test.py
+++ b/tests/local_onionshare_share_mode_slug_persistent_test.py
@@ -20,6 +20,7 @@ class LocalShareModePersistentSlugTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_persistent_tests(False, True)
diff --git a/tests/local_onionshare_share_mode_timer_test.py b/tests/local_onionshare_share_mode_timer_test.py
index e30ce4ec..0526be08 100644
--- a/tests/local_onionshare_share_mode_timer_test.py
+++ b/tests/local_onionshare_share_mode_timer_test.py
@@ -9,7 +9,7 @@ class LocalShareModeTimerTest(unittest.TestCase, GuiShareTest):
def setUpClass(cls):
test_settings = {
"public_mode": False,
- "shutdown_timeout": True,
+ "autostop_timer": True,
}
cls.gui = GuiShareTest.set_up(test_settings)
@@ -18,6 +18,7 @@ class LocalShareModeTimerTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_timer_tests(False)
diff --git a/tests/local_onionshare_share_mode_timer_too_short_test.py b/tests/local_onionshare_share_mode_timer_too_short_test.py
index 8d22048d..09b82af3 100644
--- a/tests/local_onionshare_share_mode_timer_too_short_test.py
+++ b/tests/local_onionshare_share_mode_timer_too_short_test.py
@@ -10,7 +10,7 @@ class LocalShareModeTimerTooShortTest(unittest.TestCase, GuiShareTest):
def setUpClass(cls):
test_settings = {
"public_mode": False,
- "shutdown_timeout": True,
+ "autostop_timer": True,
}
cls.gui = GuiShareTest.set_up(test_settings)
@@ -19,6 +19,7 @@ class LocalShareModeTimerTooShortTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_setup_tests()
diff --git a/tests/local_onionshare_share_mode_unreadable_file_test.py b/tests/local_onionshare_share_mode_unreadable_file_test.py
index c74d7a0a..8b5dd4e7 100644
--- a/tests/local_onionshare_share_mode_unreadable_file_test.py
+++ b/tests/local_onionshare_share_mode_unreadable_file_test.py
@@ -16,6 +16,7 @@ class LocalShareModeUnReadableFileTest(unittest.TestCase, GuiShareTest):
GuiShareTest.tear_down()
@pytest.mark.gui
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_unreadable_file_tests()
diff --git a/tests/onionshare_790_cancel_on_second_share_test.py b/tests/onionshare_790_cancel_on_second_share_test.py
index 4b7673bb..f970b8af 100644
--- a/tests/onionshare_790_cancel_on_second_share_test.py
+++ b/tests/onionshare_790_cancel_on_second_share_test.py
@@ -19,6 +19,7 @@ class ShareModeCancelSecondShareTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, False)
diff --git a/tests/onionshare_receive_mode_upload_public_mode_test.py b/tests/onionshare_receive_mode_upload_public_mode_test.py
index 3c733f0a..c2611ad5 100644
--- a/tests/onionshare_receive_mode_upload_public_mode_test.py
+++ b/tests/onionshare_receive_mode_upload_public_mode_test.py
@@ -19,6 +19,7 @@ class ReceiveModeTest(unittest.TestCase, TorGuiReceiveTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_receive_mode_tests(True, True)
diff --git a/tests/onionshare_receive_mode_upload_test.py b/tests/onionshare_receive_mode_upload_test.py
index 493cacc7..a1935562 100644
--- a/tests/onionshare_receive_mode_upload_test.py
+++ b/tests/onionshare_receive_mode_upload_test.py
@@ -18,6 +18,7 @@ class ReceiveModeTest(unittest.TestCase, TorGuiReceiveTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_receive_mode_tests(False, True)
diff --git a/tests/onionshare_share_mode_cancel_share_test.py b/tests/onionshare_share_mode_cancel_share_test.py
index ed28ddd7..2a248bae 100644
--- a/tests/onionshare_share_mode_cancel_share_test.py
+++ b/tests/onionshare_share_mode_cancel_share_test.py
@@ -8,6 +8,7 @@ class ShareModeCancelTest(unittest.TestCase, TorGuiShareTest):
@classmethod
def setUpClass(cls):
test_settings = {
+ "autostart_timer": True,
}
cls.gui = TorGuiShareTest.set_up(test_settings)
@@ -17,6 +18,7 @@ class ShareModeCancelTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_setup_tests()
diff --git a/tests/onionshare_share_mode_download_public_mode_test.py b/tests/onionshare_share_mode_download_public_mode_test.py
index eb9adb1e..93c23978 100644
--- a/tests/onionshare_share_mode_download_public_mode_test.py
+++ b/tests/onionshare_share_mode_download_public_mode_test.py
@@ -18,6 +18,7 @@ class ShareModePublicModeTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(True, False)
diff --git a/tests/onionshare_share_mode_download_stay_open_test.py b/tests/onionshare_share_mode_download_stay_open_test.py
index 93a41f1f..3fcebc63 100644
--- a/tests/onionshare_share_mode_download_stay_open_test.py
+++ b/tests/onionshare_share_mode_download_stay_open_test.py
@@ -18,6 +18,7 @@ class ShareModeStayOpenTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, True)
diff --git a/tests/onionshare_share_mode_download_test.py b/tests/onionshare_share_mode_download_test.py
index ac3dee76..65f68df6 100644
--- a/tests/onionshare_share_mode_download_test.py
+++ b/tests/onionshare_share_mode_download_test.py
@@ -17,6 +17,7 @@ class ShareModeTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, False)
diff --git a/tests/onionshare_share_mode_persistent_test.py b/tests/onionshare_share_mode_persistent_test.py
index 13588a68..d0fb5b22 100644
--- a/tests/onionshare_share_mode_persistent_test.py
+++ b/tests/onionshare_share_mode_persistent_test.py
@@ -22,6 +22,7 @@ class ShareModePersistentSlugTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_persistent_tests(False, True)
diff --git a/tests/onionshare_share_mode_stealth_test.py b/tests/onionshare_share_mode_stealth_test.py
index bb9114a6..ded0b7a8 100644
--- a/tests/onionshare_share_mode_stealth_test.py
+++ b/tests/onionshare_share_mode_stealth_test.py
@@ -19,6 +19,7 @@ class ShareModeStealthTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_setup_tests()
diff --git a/tests/onionshare_share_mode_timer_test.py b/tests/onionshare_share_mode_timer_test.py
index 7f636a71..1ae2b0fa 100644
--- a/tests/onionshare_share_mode_timer_test.py
+++ b/tests/onionshare_share_mode_timer_test.py
@@ -9,7 +9,7 @@ class ShareModeTimerTest(unittest.TestCase, TorGuiShareTest):
def setUpClass(cls):
test_settings = {
"public_mode": False,
- "shutdown_timeout": True,
+ "autostop_timer": True,
}
cls.gui = TorGuiShareTest.set_up(test_settings)
@@ -19,6 +19,7 @@ class ShareModeTimerTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_timer_tests(False)
diff --git a/tests/onionshare_share_mode_tor_connection_killed_test.py b/tests/onionshare_share_mode_tor_connection_killed_test.py
index cf48df3d..7362a170 100644
--- a/tests/onionshare_share_mode_tor_connection_killed_test.py
+++ b/tests/onionshare_share_mode_tor_connection_killed_test.py
@@ -13,6 +13,7 @@ class ShareModeTorConnectionKilledTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_setup_tests()
diff --git a/tests/onionshare_share_mode_v2_onion_test.py b/tests/onionshare_share_mode_v2_onion_test.py
index 18f5f058..29c97491 100644
--- a/tests/onionshare_share_mode_v2_onion_test.py
+++ b/tests/onionshare_share_mode_v2_onion_test.py
@@ -18,6 +18,7 @@ class ShareModeV2OnionTest(unittest.TestCase, TorGuiShareTest):
@pytest.mark.gui
@pytest.mark.tor
+ @pytest.mark.skipif(pytest.__version__ < '2.9', reason="requires newer pytest")
def test_gui(self):
self.run_all_common_setup_tests()
self.run_all_share_mode_tests(False, False)
diff --git a/tests/test_onionshare.py b/tests/test_onionshare.py
index 7592a777..f141fed7 100644
--- a/tests/test_onionshare.py
+++ b/tests/test_onionshare.py
@@ -30,9 +30,10 @@ class MyOnion:
self.auth_string = 'TestHidServAuth'
self.private_key = ''
self.stealth = stealth
+ self.scheduled_key = None
@staticmethod
- def start_onion_service(_):
+ def start_onion_service(self, await_publication=True, save_scheduled_key=False):
return 'test_service_id.onion'
diff --git a/tests/test_onionshare_common.py b/tests/test_onionshare_common.py
index d70f2c0e..f975dce7 100644
--- a/tests/test_onionshare_common.py
+++ b/tests/test_onionshare_common.py
@@ -268,7 +268,7 @@ class TestLog:
def dummy_func():
pass
- common_obj.debug = True
+ common_obj.verbose = True
# From: https://stackoverflow.com/questions/1218933
with io.StringIO() as buf, contextlib.redirect_stdout(buf):
diff --git a/tests/test_onionshare_settings.py b/tests/test_onionshare_settings.py
index f4be2930..bcc2f7cb 100644
--- a/tests/test_onionshare_settings.py
+++ b/tests/test_onionshare_settings.py
@@ -51,7 +51,8 @@ class TestSettings:
'auth_type': 'no_auth',
'auth_password': '',
'close_after_first_download': True,
- 'shutdown_timeout': False,
+ 'autostop_timer': False,
+ 'autostart_timer': False,
'use_stealth': False,
'use_autoupdate': True,
'autoupdate_timestamp': None,
diff --git a/tests/test_onionshare_web.py b/tests/test_onionshare_web.py
index 3f9540ae..0c29859b 100644
--- a/tests/test_onionshare_web.py
+++ b/tests/test_onionshare_web.py
@@ -41,7 +41,7 @@ RANDOM_STR_REGEX = re.compile(r'^[a-z2-7]+$')
def web_obj(common_obj, mode, num_files=0):
""" Creates a Web object, in either share mode or receive mode, ready for testing """
- common_obj.load_settings()
+ common_obj.settings = Settings(common_obj)
strings.load_strings(common_obj)
web = Web(common_obj, False, mode)
web.generate_slug()